背景与目标
云上托管的 Kubernetes 把安装细节都藏了起来,但排障时绕不开控制面、证书、容器运行时和网络插件。
目标:亲手用 kubeadm 搭一个集群,把应用部署上去,再补上企业常用的指标监控和日志方案。
架构
- 控制面apiserver · etcd · scheduler
- 工作节点 ×2kubelet · containerd
- Flannel指定内网网卡
- 浏览器
- Ingress-nginxNodePort 30080
- Service
- Deployment ×3
- PrometheusServiceMonitor · Rule
- LokiAlloy 采集日志
- Grafana统一看板
- Alertmanager
关键做法
- 01
kubeadm 部署 1 主 2 从
containerd 作为容器运行时;通过 hosts.toml 为 registry.k8s.io、docker.io、quay.io 配置国内镜像加速,不改 kubeadm 默认镜像地址。
- 02
解决双网卡选错 IP
每台虚拟机都有一块 IP 相同的 NAT 网卡,kubelet 和 Flannel 默认会选中它。显式设置 kubelet node-ip、apiserver 通告地址和 Flannel 网卡后,节点互通正常。
- 03
部署应用并验证核心能力
用 Deployment、Service、Ingress、ConfigMap 部署应用,逐项验证自愈、扩缩容、滚动更新与回滚;用 local PV + PVC 做数据持久化。
- 04
Helm 管理监控栈
安装 kube-prometheus-stack 并固定 chart 版本,所有改动写在 values 文件中,用 helm upgrade / rollback 管理变更。
- 05
集中日志
部署 Loki + Alloy 收集所有 Pod 日志(Promtail 已停止维护,因此选用 Alloy),在 Grafana 中按命名空间检索。
- 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 中统一查看
- 监控栈配置全部版本化,变更可回滚