linux装kubernetes最稳方式是用kubeadm,但必须严格对齐容器运行时、cgroup驱动、内核模块和网络插件;kubeadm init卡在[wait-control-plane]主因是kubelet无法健康连接控制平面,常见于cgroup驱动不一致、br_netfilter未加载、swap未彻底关闭、hostname或uuid重复、containerd配置中systemdcgroup=false等问题。

直接说结论:在 Linux 上装 Kubernetes,别从零手搭,用 kubeadm 是当前最稳、最省事、也最贴近生产逻辑的方式;但必须严格对齐容器运行时、cgroup 驱动、内核模块和网络插件这四块,错一个就卡在 kubeadm init 或节点 NotReady。
为什么 kubeadm init 一直卡在 [wait-control-plane]?
这是最常见阻塞点,根本原因不是网络慢,而是 kubelet 没法跟控制平面建立健康连接。常见触发条件:
-
kubelet启动失败(查systemctl status kubelet,常因 cgroup 驱动不一致) -
/etc/containerd/config.toml里SystemdCgroup = false(k8s v1.24+ 必须为true) - 没加载
br_netfilter模块,或sysctl net.bridge.bridge-nf-call-iptables = 0 - swap 没关彻底(
swapoff -a+ 注释/etc/fstab中 swap 行) - hostname、MAC 地址、
product_uuid在多节点中重复(虚拟机克隆后极易发生)
containerd 和 Docker 到底选哪个?
自 k8s v1.24 起,kubeadm 已移除对 Docker Engine 的原生支持,Docker 不再是“开箱即用”的运行时。你有两个选择:
- 用
containerd(推荐):轻量、稳定、与 systemd 集成好;安装后必须改/etc/containerd/config.toml,把SystemdCgroup = false改成true,再systemctl restart containerd - 用
cri-dockerd(兼容旧习惯):本质是给 Docker 加一层 CRI 接口桥接;需额外下载二进制、配置cri-docker.service,并在kubeadm init时加--cri-socket /var/run/cri-dockerd.sock
注意:dockerd 本身仍要配置 {"exec-opts": ["native.cgroupdriver=systemd"]},否则和 kubelet 冲突。
kubeadm join 失败,Node 一直 NotReady 怎么办?
不是 token 过期就是网络插件没起作用。先确认:
- 执行
kubectl get pods -n kube-system,看calico-node或coredns是否Running;如果全是Pending或ContainerCreating,八成是 CNI 插件没装或 CIDR 冲突 - 检查
kubeadm init时是否指定了--pod-network-cidr(如 Calico 要求192.168.0.0/16,Flannel 是10.244.0.0/16),且和后续 CNI 配置一致 - 节点上
iptables规则是否被 firewalld/ufw 拦截(CentOS 7 关 firewalld,Ubuntu 关 ufw,或放行 6443、10250、2379 等端口) -
kubelet日志里是否有failed to load KubeConfig或connection refused—— 往往是 control plane endpoint 地址写错了
KubeSphere 能不能直接套在已有 k8s 上?
可以,但有硬性约束:KubeSphere 版本和底层 Kubernetes 版本必须匹配。比如 KubeSphere v3.4.x 官方支持 v1.23.x~v1.26.x,但 v1.23 是唯一保证边缘节点功能完整的版本。如果你用 kubeadm 自建了集群,再装 KubeSphere,务必:
- 确认
kubectl get nodes全部Ready,且corednsPod 正常运行 - 提前装好
curl、openssl、socat(KubeKey 依赖) - 用
kk创建集群时显式指定版本:./kk create config --with-kubernetes v1.23.10 --with-kubesphere v3.4.1 - 别跳过
config.yaml里的controlPlaneEndpoint配置 —— 多 master 场景下,这里必须填负载均衡 VIP 或 DNS 名,不能留空
最容易被忽略的是 etcd 存储路径权限和证书有效期:KubeKey 默认生成的证书只有 1 年,生产环境务必在部署前通过 cert-manager 或手动轮换机制规划续期流程。











