kubeadm join 做什么
kubeadm join 把一台已经装好容器运行时、kubelet、kubeadm 的机器接入现有集群。新节点用控制面签发的 bootstrap token 证明加入资格,再用 CA 证书哈希校验它连上的确实是本集群的控制面,随后自动写入 kubelet 配置、创建必要目录并注册到集群。加入成功后节点会先处于 NotReady,等 CNI 插件就绪并完成容器网络初始化后转为 Ready。
基本信息
| 适用平台 | kubeadm 自建集群,Linux 节点 |
|---|---|
| 前置条件 | 容器运行时可用、kubelet 与 kubeadm 已安装、关闭 swap、主机名与 hosts 正确 |
| 认证方式 | bootstrap token + CA 证书哈希双校验 |
| token 有效期 | 默认 24 小时,过期可重新生成 |
| 加入后状态 | 先 NotReady,CNI 就绪后自动转 Ready |
典型使用场景
- 集群扩容:新节点接入后承载业务副本,扩大可调度余量
- 节点替换:旧机器下线,用新机器以相同角色重新加入
- 边缘或分支机房:以相同流程批量接入多台节点
- 角色变更:把原先的工作节点重建后以带标签的方式重新加入
- 演练与重建:节点配置损坏时放弃原地修复,重新 join 更省时
第一步:在控制面生成加入命令
第一步:在控制面生成加入命令
kubeadm token create --print-join-command # 一条命令拿到 token 与 CA 哈希,最省事
kubeadm token list # 查看现有 token 与剩余有效期
# 已有 token 时单独取 CA 哈希
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex第二步:在新节点执行
第二步:在新节点执行
kubeadm join 10.0.0.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:<哈希> # 注意续行符,整条命令一次性粘贴
systemctl status kubelet --no-pager # 加入失败时先看 kubelet 服务状态
journalctl -u kubelet -n 100 --no-pager # 配置或运行时问题在这里留原文常见失败对照
| 报错 | 原因 | 处理 |
|---|---|---|
| token is not valid / unknown token | token 过期或已被删除 | 控制面重新 create,无需重装节点 |
| certificate has expired or is not yet valid | 节点时钟偏差过大 | 校准时间同步后重试 |
| failed to get sandbox image | 容器运行时未就绪或镜像缺失 | 确认运行时服务正常并预拉取基础镜像 |
| 节点显示 NotReady | CNI 未部署或未就绪 | 检查网络插件 DaemonSet 是否在全部节点运行 |
| 加入成功但 kubelet 反复重启 | swap 未关闭、cgroup 驱动不匹配 | 按 kubelet 日志修正系统配置 |
kubelet 与容器运行时的 cgroup 驱动必须一致(systemd 对 systemd 或 cgroupfs 对 cgroupfs)。这个不一致不会让 join 失败,但会让节点起来一小会儿后开始报错,属于最容易被忽略的检查项。
批量扩容时不要并发执行所有节点的 join:镜像拉取与控制面注册会集中冲击网络和 apiserver。分批进行,并确认每批节点都已 Ready、CNI 正常后再继续。