一、 前言

“项目是从 2026 年 4 月底开始的。当时手里只有 4 台 CentOS 7 最小化虚拟机,目标是在上面跑通 K8s 集群、Prometheus 监控以及 ArgoCD 持续部署。

整个搭建过程并不顺利,从底层网络不通,到 Containerd 无法识别,再到 cAdvisor 长期 401 认证难题。我曾因为这些问题崩溃,但好在最终都一一解决了。

如今集群运行稳定,监控全绿,GitOps 链路跑通。本文将完整复盘整个过程中的 16 个核心故障与解决方案,希望能给正在入门云原生的小伙伴一些参考。”


二、 基础环境与虚拟化层 (网络与节点)

这一步是基石,也是最短的木板。

1. VMware NAT 模式最小化系统网络不通

  • 现象ping 8.8.8.8 返回 Network is unreachable

  • 根因:CentOS 7 最小化镜像默认无 NetworkManager,未自动获取 IP。

  • 解决:手动编写 ifcfg-ens33,指定静态 IP、网关及 DNS。

2. 宿主机无法访问虚拟机 Web 服务 (Prometheus/Grafana)

  • 现象:Windows 浏览器访问 9090/3000 端口超时。

  • 根因:虚拟机防火墙拦截 + VMware NAT 未配置端口映射。

  • 解决:永久关闭 firewalld;在 VMware 虚拟网络编辑器中为 VMnet8 添加端口转发规则。

3. 跨节点服务访问受阻

  • 现象:Master 节点 curl 不通 Monitor 节点。

  • 根因:Monitor 节点 firewalld 残留拦截。

  • 解决:二次确认并彻底关闭所有节点防火墙。

4. 新增 Node 节点长期 NotReady

  • 现象k8s-node2 加入后状态异常。

  • 根因:前期实验 Cilium 卸载残留污点 node.cilium.io/agent-not-ready

  • 解决kubectl taint nodes k8s-node2 node.cilium.io/agent-not-ready:NoSchedule- 清除污点。


三、 容器运行时与集群部署层

这一层考验的是对底层 CRI 和网络插件原理的理解。

5. Containerd CRI 插件未启用

  • 现象kubeadm init 及 kubeadm join 报错 container runtime is not running

  • 根因:CentOS 7 自带的 containerd 默认未启用 CRI 接口。

  • 解决:生成默认配置,修改 SystemdCgroup = true,配置 crictl 指向 Containerd 套接字。

6. Flannel CNI 插件 Pod 长期卡在 Init:1/2

  • 现象:节点 NotReady 超 20 分钟。

  • 根因:CNI 目录残留;内核模块 br_netfilter 未加载;镜像拉取超时。

  • 解决:清理 /etc/cni/net.d/;加载内核模块并写入参数;强制重建 Pod。

7. Docker Hub 及 GitHub 不可达

  • 现象:镜像拉取超时;下载二进制包报 404/403。

  • 解决:配置阿里云/中科大镜像加速;使用 ghfast.top 加速站下载;无法拉取的组件改用二进制本地部署。

8. Cilium 替代 Flannel 失败

  • 现象:Cilium Pod 全部 CrashLoopBackOff

  • 根因:CentOS 7 内核 3.10 过老,不兼容 Cilium 的 eBPF 程序。

  • 解决:彻底卸载 Cilium 并清理残留污点,回退至 Flannel。


四、 监控系统搭建层

最大的挑战集中在如何让外部的 Prometheus 安全地抓取 K8s 内部指标。

9. Prometheus 下载失败

  • 解决:使用 ghfast.top 作为 GitHub 资源加速站完成下载。

10. 服务器时间漂移致 Grafana 全 No data

  • 现象:Prometheus UI 提示时间差,Grafana 无数据显示。

  • 解决:安装 chrony,配置 NTP 阿里云源,强制同步并写入硬件时钟。

11. Grafana 数据源 URL 配置错误

  • 现象:数据源保存成功,但查不到数据。

  • 根因:默认 URL 为 localhost:9090,指向了 Grafana 自身。

  • 解决:修改数据源 URL 为 http://192.168.126.101:9090

12. Kubelet cAdvisor 访问长期 401 Unauthorized(核心难点!)

  • 现象:Prometheus 抓取 Kubelet 10250 端口持续 401 认证失败。

  • 解决链路

    1. 临时方案kubectl create token 注入,但 Token 过期即失效。

    2. 永久方案:使用 OpenSSL 基于 K8s 集群 CA 签发 10 年期客户端证书

    3. 权限配置:配置 RBAC 绑定 system:kubelet-api-admin,解决证书通过后依然 Forbidden 的问题。

    4. 避坑提醒:证书文件必须使用 scp 原样传输,手动 cat 复制会导致 PEM 格式损坏。


五、 GitOps 与高可用层 (ArgoCD)

从人工敲命令迈向真正的“配置即代码”。

13. ArgoCD 部署镜像拉取失败

  • 现象argocd-dex-server 卡在 ImagePullBackOff。

  • 解决:dex 组件非核心功能,先搁置,核心组件全部正常运行。

14. ArgoCD 副本无法分散到新节点

  • 现象:扩容后 Pod 集中调度。

  • 根因:Cilium 残留污点未清干净。

  • 解决:清除污点后,副本成功分布至 k8s-node2

15. ArgoCD 多文档 YAML 创建应用失败

  • 现象:ArgoCD UI 无法导入包含多资源的 YAML。

  • 解决:将 Deployment 和 Service 拆分为两个独立 Application 分别创建。

16. ArgoCD 密码重置失败

  • 现象argocd account update-password 报错,accounts.csv 路径不存在。

  • 解决:使用 argocd account bcrypt 生成密码哈希,直接注入 argocd-secret 的 admin.password 字段,重启 Deployment 生效。


六、 最终架构状态总结

组件 节点分布 状态
K8s 节点 master + node1 + node2 3/3 Ready
Flannel 每节点一个 Pod 3/3 Running
ArgoCD Server node1 + node2 2/2 Running (高可用)
ArgoCD Repo Server node1 + node2 2/2 Running
Prometheus monitor Running
Grafana monitor Running
node_exporter master + node1 2/2 UP


七、 结语与心得

“从三台 CentOS 7 最小化镜像开始,从零搭建整个 AIOps 平台。K8s 集群初始化时 Containerd 的 CRI 没开、Flannel 卡 Init、Cilium 不兼容内核,这些底层兼容性问题都是自己查源码和日志修掉的。

监控这边最核心的难点是 Prometheus 在集群外,访问 Kubelet 的 cAdvisor 一直 401。我对比了 Token 和证书两种方案,最终用 OpenSSL 基于集群 CA 签了十年期的客户端证书,再配上 RBAC 最小权限,把认证永久修掉了。

后面扩展到 GitOps,部署了 ArgoCD 并实现双节点高可用。中间处理过污点残留、镜像不可达、YAML 多文档拆分、密码重置失败等问题。现在整个平台三节点全 Ready,监控全绿,GitOps 链路跑通。

希望我的踩坑记录能给正在入坑云原生的各位带来帮助。”

更多推荐