Kubernetes 1.22.1多Master集群部署kubeadm init超时失败求助
kubeadm init超时问题排查步骤
第一步 检查kubelet运行状态
- 执行
systemctl status kubelet确认kubelet服务是否处于active运行状态 - 若kubelet未启动,执行
journalctl -xeu kubelet查看启动日志,优先排查容器运行时(docker/containerd)是否正常安装启动、kubelet配置文件是否存在语法错误
第二步 校验cgroup驱动一致性
RHEL 7使用systemd作为init系统,kubelet与容器运行时的cgroup驱动必须一致才能正常工作:
- 执行
docker info | grep Cgroup(使用docker作为运行时)或crictl info | grep cgroupDriver(使用containerd作为运行时)查看容器运行时的cgroup驱动配置 - 执行
cat /var/lib/kubelet/config.yaml | grep cgroupDriver查看kubelet的cgroup驱动配置 - 若二者配置不一致,推荐统一修改为systemd驱动:
- docker运行时修改
/etc/docker/daemon.json,添加配置:"exec-opts": ["native.cgroupdriver=systemd"] - 重启docker与kubelet服务:
systemctl daemon-reload && systemctl restart docker kubelet
- docker运行时修改
第三步 排查控制平面组件故障
若kubelet运行正常,说明控制平面静态Pod启动失败,按以下步骤排查:
- 执行
docker ps -a | grep kube | grep -v pause(docker运行时)或crictl ps -a列出所有k8s相关容器,找到异常退出的控制平面组件(kube-apiserver、etcd、kube-controller-manager、kube-scheduler) - 执行
docker logs <异常容器ID>或crictl logs <异常容器ID>查看组件日志,重点排查以下常见错误:- 证书配置错误:多master部署必须在kubeadm init时指定
--control-plane-endpoint参数指向LB虚拟IP/域名,若未配置会导致kube-apiserver证书不包含LB地址,启动后健康检查失败 - 权限问题:RHEL 7默认开启SELinux,会导致容器访问目录权限不足,执行
getenforce确认是否为Permissive或Disabled,若为Enforcing执行setenforce 0临时关闭,修改/etc/selinux/config中SELINUX=disabled永久关闭 - 端口占用:执行
ss -tulnp确认6443、2379、2380、10250等核心端口未被其他进程占用 - 端口不通:检查节点之间的核心端口防火墙是否放通,etcd集群节点之间2379、2380端口必须互通
- swap未关闭:k8s要求关闭swap分区,执行
free -m确认swap使用率为0,否则执行swapoff -a临时关闭,注释/etc/fstab中swap挂载行永久关闭
- 证书配置错误:多master部署必须在kubeadm init时指定
第四步 多master HA架构专项排查
- 在当前执行kubeadm init的节点上执行
curl -k https://<你的LB虚拟IP>:6443/version检查LB是否正常转发流量,若无法访问,排查LB节点的haproxy、keepalived服务是否正常运行,haproxy后端是否正确配置了master节点的6443端口 - 确认所有master节点的hostname、hosts配置正确,节点之间可以通过hostname互相解析访问
修复后重新执行
所有问题排查修复完成后,先执行kubeadm reset -f清理之前的错误部署残留,再重新执行kubeadm init命令即可。
内容的提问来源于stack exchange,提问作者Sasi Kumar
相关产品推荐
相关产品推荐

