kubeadm init卡住主因是环境不洁或镜像缺失:swap未彻底关闭、cgroup驱动不一致(kubelet与containerd/docker需同为systemd)、内核模块br_netfilter未加载、国内无法拉取gcr.io镜像、时间不同步等。

直接上结论:别用二进制手动装,也别拿 minikube 当生产集群用;kubeadm 是唯一靠谱的起点。它把证书、组件调度、网络接入这些高风险环节封装成可复现流程,前提是环境干净、cgroup 驱动对得上、版本锁死。
为什么 kubeadm init 会卡在 waiting for the control-plane
这不是命令写错了,是底层环境没清理干净或镜像拉不下来。常见原因包括: -swap 没关:执行 sudo swapoff -a 并注释 /etc/fstab 中含 swap 的行,否则报 [preflight] [ERROR Swap]: running with swap on is not supported
- 内核模块缺失:br_netfilter 没加载会导致 Pod 网络不通,运行 sudo modprobe br_netfilter 并写入 /etc/modules
- cgroupDriver 不一致:检查 /var/lib/kubelet/config.yaml 和 /etc/containerd/config.toml 是否都设为 systemd,Docker 用户还需改 /etc/docker/daemon.json 加 {"exec-opts": ["native.cgroupdriver=systemd"]}
- 国内拉不到镜像:默认从 k8s.gcr.io 拉,得提前用 crictl pull 拉好对应版本,例如 registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.12,再用 kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers如何让 kubectl get nodes 显示 Ready 而不是 NotReady
90% 是网络插件没装或装错版本。kubeadm 不自带 CNI,必须手动选一个并部署,且关键参数必须严丝合缝: - 初始化时用了--pod-network-cidr=10.244.0.0/16,那 Calico 就得改 calico.yaml 里的 IP_POOL_CIDR 字段,Flannel 则必须用 v0.24.0+ 版本(适配 CNI v1.0+)
- Calico 默认用 192.168.0.0/16,不改就直接导致所有 Pod 处于 Pending
- Flannel 更轻量但只支持基础 overlay;Calico 支持 NetworkPolicy,适合需要策略控制的场景
- 二者都不兼容 firewalld 默认规则,建议 sudo systemctl disable firewalld,或至少放行 6443(apiserver)和 10250(kubelet)
kubeadm join 失败的典型原因
token 过期、证书不信任、kubelet 配置错位,三者占 95%: - token 默认 24 小时过期,旧 token 会报error execution phase preflight: couldn't validate the identity of the API Server,用 kubeadm token create --print-join-command 重生成
- 工作节点的 kubelet 必须和 master 用**完全一致的小版本号**(如 v1.28.12),版本错位会导致节点拒绝注册
- --cri-socket 参数要匹配:containerd 节点用 unix:///run/containerd/containerd.sock,Docker 用户已不被官方支持(v1.24+)
- 如果 master 有多个网卡,kubeadm init 必须加 --apiserver-advertise-address=实际内网IP,否则 node 加入时连不上 control-plane
kubectl 连不上集群的排查顺序
先查配置,再查证书,最后看服务状态: - 报The connection to the server localhost:8080 was refused:说明 KUBECONFIG 没生效,确认是否执行了 mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 报 x509: certificate has expired or is not yet valid:集群跑了一两个月没续签,运行 kubeadm certs renew all + sudo systemctl restart kubelet
- kubectl get pods -A 看 kube-system 命名空间下所有 Pod 是否 Running,特别注意 coredns 和网络插件 Pod 的状态
- sudo journalctl -u kubelet -n 100 --no-pager 查 kubelet 实际报错,比 kubeadm init 输出更准
真正容易被忽略的是:所有节点时间必须同步。chrony 或 ntpd 不稳,会导致 etcd 启动卡住、证书握手失败——这个点不会报明显错误,只会让整个流程看起来“莫名其妙地卡住”。











