好的!以下是对你昨天完整 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

→ 缺失三大关键参数

  1. --kubeconfig=/etc/kubernetes/kubelet.conf
  2. --pod-manifest-path=/etc/kubernetes/manifests
  3. --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 继续并成功!


🔄 五、完整成功流程(你走通的路径)

  1. 彻底关闭 swapbash
    sudo swapoff -a && sudo sed -i '/swap/s/^/#/' /etc/fstab
  2. 配置 containerdbash
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    # 修改 SystemdCgroup = true
    sudo systemctl restart containerd
  3. 清理旧状态(关键!)
    sudo kubeadm reset -f
    sudo rm -rf /etc/kubernetes/ /var/lib/kubelet/* /var/lib/etcd
  4. 预拉取镜像(避免超时)
    kubeadm config images pull --kubernetes-version=v1.28.2
  5. 修复 kubelet service(你的核心操作)
    • 确保 /etc/systemd/system/kubelet.service 包含:
      • --kubeconfig
      • --pod-manifest-path
      • --config
      • --cgroup-driver=systemd
  6. 重启 kubeletbash
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
  7. 运行 kubeadm init
    sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.28.2
  8. 后续步骤
    • 配置 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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐