← 全部案例
02Kubernetes · 可观测性

Kubernetes 集群搭建与可观测性平台

用 kubeadm 从零部署 v1.34 三节点集群,Helm 安装 Prometheus + Loki,指标、日志、告警在 Grafana 统一查看。

笔记本 VirtualBox + Vagrant,3–4 台 Ubuntu 22.04 虚拟机

背景与目标

云上托管的 Kubernetes 把安装细节都藏了起来,但排障时绕不开控制面、证书、容器运行时和网络插件。

目标:亲手用 kubeadm 搭一个集群,把应用部署上去,再补上企业常用的指标监控和日志方案。

架构

集群
  1. 控制面apiserver · etcd · scheduler
  2. 工作节点 ×2kubelet · containerd
  3. Flannel指定内网网卡
流量
  1. 浏览器
  2. Ingress-nginxNodePort 30080
  3. Service
  4. Deployment ×3
可观测
  1. PrometheusServiceMonitor · Rule
  2. LokiAlloy 采集日志
  3. Grafana统一看板
  4. Alertmanager

关键做法

  1. 01

    kubeadm 部署 1 主 2 从

    containerd 作为容器运行时;通过 hosts.toml 为 registry.k8s.io、docker.io、quay.io 配置国内镜像加速,不改 kubeadm 默认镜像地址。

  2. 02

    解决双网卡选错 IP

    每台虚拟机都有一块 IP 相同的 NAT 网卡,kubelet 和 Flannel 默认会选中它。显式设置 kubelet node-ip、apiserver 通告地址和 Flannel 网卡后,节点互通正常。

  3. 03

    部署应用并验证核心能力

    用 Deployment、Service、Ingress、ConfigMap 部署应用,逐项验证自愈、扩缩容、滚动更新与回滚;用 local PV + PVC 做数据持久化。

  4. 04

    Helm 管理监控栈

    安装 kube-prometheus-stack 并固定 chart 版本,所有改动写在 values 文件中,用 helm upgrade / rollback 管理变更。

  5. 05

    集中日志

    部署 Loki + Alloy 收集所有 Pod 日志(Promtail 已停止维护,因此选用 Alloy),在 Grafana 中按命名空间检索。

  6. 06

    自定义告警与采集

    编写 PrometheusRule,在应用副本数不足时告警;为 ingress-nginx 补充 metrics Service 和 ServiceMonitor,采集请求指标。

遇到的问题

Grafana 页面返回 503

原因
内存限制 384Mi 不够,容器反复重启
解决
调整为 requests 256Mi / limits 640Mi

chart 自带的 node-exporter 启动失败

原因
主机上已有 node-exporter 占用 9100 端口
解决
在 values 中改用 9101

Grafana 中看不到 Ingress 请求指标

原因
ingress-nginx v1.14 默认关闭 metrics
解决
开启 --enable-metrics,并创建 metrics Service 与 ServiceMonitor

etcd、scheduler 等采集目标全部报错

原因
kubeadm 将这些组件绑定在 127.0.0.1,集群内无法访问
解决
关闭这几项采集,避免长期误报

结果

  • 从零搭起可用的三节点集群,并能讲清每一步的作用
  • 应用通过域名访问,自愈、扩缩容、滚动更新均已验证
  • 指标、日志、告警在 Grafana 中统一查看
  • 监控栈配置全部版本化,变更可回滚