./kk create cluster 默认不校验ssh连通性、conntrack可用性及容器运行时预装,易在etcd初始化或镜像拉取阶段静默失败;须手动安装依赖、配置ssh、设置hosts、显式声明etcd节点并匹配k8s版本。

直接用 ./kk create cluster 能跑起来,但大概率会在 etcd 初始化或 containerd 镜像拉取阶段失败——不是工具问题,是默认行为没适配你的环境。
为什么 ./kk create cluster 会静默失败
KubeKey 默认不校验节点间 SSH 连通性、不检查 conntrack 是否可用、也不确认 containerd 或 docker 是否已预装。它假设你已按文档清过环境,而现实里:CentOS 7 默认没开 conntrack,Ubuntu 22.04 默认用 systemd-resolved 导致 DNS 解析异常,所有节点没做 ssh-copy-id 就跑命令,kk 会在第一个节点卡住且不报错。
- 执行前必须手动在所有节点运行:
sudo apt install -y conntrack socat ipset ebtables(Ubuntu/Debian)或sudo yum install -y conntrack socat ipset ebtables(CentOS/RHEL) - 确保
sshd_config中PermitRootLogin yes或你用的非 root 用户已配置sudo NOPASSWD: ALL -
kk不自动处理/etc/hosts,如果节点用主机名通信,必须提前互相写入 IP + 主机名映射
./kk create config 生成的 YAML 里哪些字段不能省
生成的 config-sample.yaml 看似可选字段多,但以下三项漏掉一个,集群就起不来:
-
hosts下每个节点的address和internalAddress必须填真实 IP(不能是127.0.0.1或localhost),且两者在多网卡场景下要区分内外网 -
roleGroups中etcd组至少含一个节点;若只写control-plane和worker,etcd会默认复用 control-plane 节点,但高版本 KubeKey(v3.x+)要求显式声明 -
kubernetes.version必须与你本地能访问的镜像仓库匹配;比如用v1.31.0,就得确认registry.k8s.io/kube-apiserver:v1.31.0可达,否则卡在pulling images
容器运行时选 containerd 还是 docker?
从 v1.24 开始 Kubernetes 官方弃用 dockershim,KubeKey 默认仍设 containerManager: docker,这会导致:控制平面组件启动失败、kubectl get nodes 显示 NotReady、日志里反复出现 failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"。
- 推荐强制指定
containerManager: containerd,并在所有节点提前安装好containerd(不是只装docker-ce) - 若坚持用
docker,必须同步cgroup driver:修改/etc/docker/daemon.json加"exec-opts": ["native.cgroupdriver=systemd"],再sudo systemctl restart docker -
containerd的config.toml中SystemdCgroup = true必须为true,否则 kubelet 启动后立即 crash
离线部署时最容易被忽略的三件事
离线不是把 kk 二进制拷过去就行。KubeKey 的离线逻辑分三层:工具层、K8s 组件层、容器镜像层。少一层,kk up 就停在 “Pulling image” 并超时退出。
- 必须用
./kk init registry在一台节点上搭私有 registry,并提前kk add images把所有镜像推上去;光下载images.tar.gz不够,kk不会自动 load -
kubeadm、kubelet、kubectl二进制文件需手动放到每个节点的/usr/bin/下,并加执行权限;KubeKey 不负责分发这些二进制 - 证书生成依赖
openssl和cfssl,离线环境里cfssl不在系统包管理器中,得单独下载二进制并放入$PATH
真正卡点不在命令怎么敲,而在每台节点的底层状态是否被 kk 的预检逻辑覆盖到——它不会告诉你 iptables 规则冲突,也不会提醒 swap 没关,这些都得自己先扫一遍。











