kubeadm init卡住的解决办法
原因说明表面成功,底层断裂文件都生成了,但 kubelet 因参数缺失“视而不见”配置分散关键参数分布在 3+ 个文件中,一处不一致即失败日志误导只说“waiting”,不报错,难以定位依赖隐式契约kubeadm 假设 kubelet 会自动加载 manifests,但需显式参数支持💡 你的成功,源于不满足于“表面现象”,而是通过ps aux直击进程真实状态,亲手重建了 kubelet 与 ku
好的!以下是对你昨天完整 Kubernetes 单节点部署全过程的终极总结 ——
严格基于你反复强调的关键细节:
✅ kubeadm init 卡住不止一次
✅ 涉及 多个配置文件问题(containerd、kubelet service、config.yaml、kubelet.conf)
✅ 通过 ps aux | grep kubelet 发现参数缺失
✅ 手动修改 /etc/systemd/system/kubelet.service 才解决
✅ 明明生成了 /etc/kubernetes/manifests/,但 kubelet 没使用它
🧩 Kubernetes v1.28 单节点部署全链路排错实录(真实还原)
环境:Linux + containerd + kubeadm v1.28.2
目标:kubeadm init --pod-network-cidr=10.244.0.0/16
核心痛点:初始化卡死、配置文件冲突、kubelet 不加载 static pods
🔥 一、根本问题全景图
你遇到的不是单一错误,而是一条 “配置断裂链”:
containerd 配置不完整
→ kubelet cgroup driver 不匹配
→ kubelet 启动参数缺失
→ kubelet 无法加载 /etc/kubernetes/manifests/
→ control-plane Pod 未创建
→ kubeadm init 永久卡住
每一步都看似“成功”,实则埋雷。
📂 二、关键配置文件清单(你必须检查的 6 个文件)
| 文件路径 | 作用 | 你遇到的问题 | 正确状态 |
|---|---|---|---|
1. /etc/containerd/config.toml |
containerd 运行时配置 | 默认不存在或 SystemdCgroup=false |
SystemdCgroup = true |
2. /etc/systemd/system/kubelet.service |
kubelet 主启动文件 | 参数缺失(无 --kubeconfig, --pod-manifest-path) |
显式包含所有关键参数(见下文) |
3. /etc/systemd/system/kubelet.service.d/10-kubeadm.conf |
kubeadm 注入的 drop-in 配置 | 可能被覆盖或未生效 | 存在且引用 kubelet.conf 和 config.yaml |
4. /var/lib/kubelet/config.yaml |
kubelet 主配置(YAML) | 残留旧值 cgroupDriver: cgroupfs |
cgroupDriver: systemd |
5. /etc/kubernetes/kubelet.conf |
kubelet 访问 API Server 的凭证 | 虽生成但未被 kubelet 加载 | 必须通过 --kubeconfig 引用 |
6. /etc/fstab |
系统挂载表 | swap 条目未注释 | swap 行被 # 注释 |
✅ 只有这 6 处全部正确且一致,
kubeadm init才能成功!
🔍 三、你的核心突破点:ps aux | grep kubelet
❌ 现象:
/etc/kubernetes/manifests/目录已生成(含 apiserver.yaml、etcd.yaml 等)- 但
kubeadm init卡在:[init] Waiting for the kubelet to boot up the control plane...
🔬 诊断命令:
ps aux | grep kubelet
💥 发现真相:
输出仅为:
/usr/bin/kubelet --cgroup-driver=systemd
→ 缺失三大关键参数:
--kubeconfig=/etc/kubernetes/kubelet.conf--pod-manifest-path=/etc/kubernetes/manifests--config=/var/lib/kubelet/config.yaml
→ kubelet 虽运行,但“失联”:既不注册到集群,也不加载 static pods!
🛠 四、你的解决方案:修复 /etc/systemd/system/kubelet.service
你手动编辑该文件,确保包含以下核心参数:
[Service]
ExecStart=/usr/bin/kubelet \
--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \
--kubeconfig=/etc/kubernetes/kubelet.conf \
--pod-manifest-path=/etc/kubernetes/manifests \
--config=/var/lib/kubelet/config.yaml \
--cgroup-driver=systemd
Restart=always
⚠️ 注意:若使用 drop-in(
10-kubeadm.conf),也需确保ExecStart=被重置并拼接所有变量。
然后执行:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
✅ 立即见效:kubelet 开始加载 manifests,control-plane Pod 启动,kubeadm init 继续并成功!
🔄 五、完整成功流程(你走通的路径)
- 彻底关闭 swapbash
sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab - 配置 containerdbash
sudo containerd config default | sudo tee /etc/containerd/config.toml # 修改 SystemdCgroup = true sudo systemctl restart containerd - 清理旧状态(关键!)
sudo kubeadm reset -f sudo rm -rf /etc/kubernetes/ /var/lib/kubelet/* /var/lib/etcd - 预拉取镜像(避免超时)
kubeadm config images pull --kubernetes-version=v1.28.2 - 修复 kubelet service(你的核心操作)
- 确保
/etc/systemd/system/kubelet.service包含:--kubeconfig--pod-manifest-path--config--cgroup-driver=systemd
- 确保
- 重启 kubeletbash
sudo systemctl daemon-reload sudo systemctl restart kubelet - 运行 kubeadm init
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.28.2 - 后续步骤
- 配置 kubeconfig
- 安装 CNI(通用插件 + flannel 专用插件)
- 去除 control-plane 污点
🏁 六、经验总结:为什么你会“卡这么久”?
| 原因 | 说明 |
|---|---|
| 表面成功,底层断裂 | 文件都生成了,但 kubelet 因参数缺失“视而不见” |
| 配置分散 | 关键参数分布在 3+ 个文件中,一处不一致即失败 |
| 日志误导 | kubeadm init 只说“waiting”,不报错,难以定位 |
| 依赖隐式契约 | kubeadm 假设 kubelet 会自动加载 manifests,但需显式参数支持 |
💡 你的成功,源于 不满足于“表面现象”,而是通过
ps aux直击进程真实状态,亲手重建了 kubelet 与 kubeadm 的协作契约。
✅ 最终验证命令
# 1. kubelet 参数是否完整?
ps aux | grep kubelet | grep -E 'kubeconfig|manifest-path|config'
# 2. static pods 是否加载?
sudo crictl pods | grep -E 'apiserver|etcd'
# 3. 节点是否 Ready?
kubectl get nodes
# 4. CoreDNS 是否 Running?
kubectl get pods -n kube-system | grep coredns
更多推荐



所有评论(0)