节点无法加入集群
在搭建私有云集群时,新节点启动后连不上主控节点是最常见的问题。这时候先别急着重装系统,检查一下网络配置更实际。比如某个公司内网把防火墙默认关掉了公网访问,但忘了放开内部子网之间的通信,结果导致节点间 etcd 无法握手。确认各节点的 IP 是否在同一子网,安全组或 iptables 是否放行了 6443、2379-2380 等关键端口。
如果使用的是 Kubernetes 部署工具如 kubeadm,注意初始化命令中 --apiserver-advertise-address 指定的地址必须可达。有时候开发人员复制了别人的脚本,没改成本地 IP,导致其他机器根本连不上 API Server。
kubeadm init --apiserver-advertise-address=192.168.10.10 --pod-network-cidr=10.244.0.0/16镜像拉取失败
私有云环境下通常会配置本地镜像仓库,但配置不当就会出现 Pod 卡在 ImagePullBackOff 状态。最常见的原因是 kubelet 没有正确配置 insecure-registries。比如内部 registry 走的是 HTTP 而非 HTTPS,kubelet 默认拒绝拉取。
登录到出问题的节点,打开配置文件 /var/lib/kubelet/config.yaml,加入:
<registry-mirrors>:
- "http://registry.internal:5000"
<insecure-registries>:
- "registry.internal:5000"改完后重启 kubelet 服务。顺带提一句,运维小李上次就是因为漏加 insecure-registries,整整排查了三小时才发现是这个原因。
存储卷挂载异常
用 Ceph 或 NFS 做共享存储时,经常遇到 Pod 启动时报 MountVolume.SetUp failed。这时候要看两个地方:一是目标存储服务是否正常运行,二是节点上有没有安装对应的客户端工具。比如使用 Ceph RBD 的机器没装 ceph-common 包,自然没法挂载。
还有一个容易忽略的点是时间同步。Ceph 对集群内时间一致性要求很高,超过 1 秒偏差就可能拒绝连接。确保所有节点都启用了 NTP 同步:
timedatectl set-ntp true
timedatectl status负载调度不均
看起来集群五台机器都在跑,但监控显示只有两台 CPU 忙成狗,另外三台闲得发慌。这种情况多半是资源请求(requests)设置不合理。比如某服务声明只用 0.1 核,调度器当然乐意往同一台塞十几个实例。
进 kube-apiserver 查看 Pod 的 yaml 定义,调整 resource.requests 的值更贴近真实用量。也可以临时打污点让某些节点暂停接入新任务:
kubectl taint nodes node-2 dedicated=true:NoSchedule等排查清楚再清除污点。这种操作在升级节点前也很常用,避免影响线上业务。
网络插件冲突
Calico 和 Flannel 不能混着用,这是血泪教训。有次团队为了“增强网络功能”,在已装 Flannel 的集群上又强行加了一套 Calico manifest,结果所有跨节点通信全断了。
清理旧插件要彻底:删掉对应的 DaemonSet、ConfigMap,还要清空 CNI 配置目录:
rm /etc/cni/net.d/10-flannel.conflist
rm /etc/cni/net.d/10-calico.conflist然后重启 kubelet 和容器运行时。建议一开始就把所用网络方案写进部署文档,避免后续误操作。