. 背景
在一个单 Master 节点的 Kubernetes 集群基础上,计划添加一个新的 Worker 节点(名为 database)以进行扩容。
. 初始问题:节点加入失败
.问题1
在 database 节点上执行 kubeadm join 命令后,节点能够短暂连接到集群,但随后 kubelet 报告 TLS 证书握手错误,并最终变为 NotReady 状态。
2.2 分析与解决
通过分析journalctl -u kubelet -f输出的日志,发现kubelet在尝试与containerd通信时失败(connection refused),并且在后续步骤中请求证书时被拒绝(Unauthorized)。
这通常是由于 CNI(容器网络接口)插件未能正确启动,导致 Pod 网络不可用,进而影响了kubelet与 API Server 的通信。
经过排查后原因是swap没有被禁用,虽然之前的kubeadm join预检提到了 swap 警告,但kubelet实际启动时却将其视为致命错误,直接导致其退出。
3. 问题2:Flannel Pod 拉取镜像超时
3.1 现象
在 Master 节点上检查 Flannel 相关 Pod 的状态:
3.2 问题分析
错误明确指出kubelet尝试拉取registry.k8s.io/pause:3.6镜像时超时。在中国大陆,访问registry.k8s.io域名通常需要翻墙或使用代理,这是导致超时的根本原因。
4. 解决方案:更换镜像源并配置
修改containerd配置文件中的镜像源,后重启containerd,在 Master 节点上,删除旧的 Pod,触发重新创建:
kubectl delete pod kube-flannel-ds-7fbxv -n kube-flannel然后查看节点状态依然在拉去旧的镜像源
kubectl describe pod kube-flannel-ds-tzsbx -n kube-flannel继续排查后发现是config.toml中有默认配置,明确指定了containerd使用registry.k8s.io/pause:3.6作为 Pod Sandbox 的基础镜像。这个配置比kubelet命令行参数--pod-infra-container-image的优先级更高,或者直接由containerd层面处理,导致kubelet在尝试创建沙箱时总是去找registry.k8s.io/pause:3.6
[root@database ~]# cat /etc/containerd/config.toml |grep pause pause_threshold = 0.02 sandbox_image = "registry.k8s.io/pause:3.6" You have new mail in /var/spool/mail/root修改此项配置
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak sudo vim /etc/containerd/config.toml sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" #修改配置项 重启worker节点的服务 sudo systemctl restart containerd sudo systemctl restart kubelet 在Master 节点删除当前失败的 Flannel Pod kubectl delete pod kube-flannel-ds-lpzzl -n kube-flannel等待几秒钟后,查看节点状态,都显示正常,问题解决
[root@iZ2ze6sn544ngzrbbprfmcZ ~]# kubectl get pods -n kube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-hghg6 1/1 Running 0 24h kube-flannel-ds-tzsbx 1/1 Running 0 37m