在K8S中,Worker节点加入集群的全过程?
在 Kubernetes 中,Worker 节点加入集群是一个涉及多个组件协同工作的流程,以下是详细步骤和底层原理:
Worker 节点加入集群的全过程
sequenceDiagram
participant Worker_Node
participant Kubelet
participant Kube-Proxy
participant Container_Runtime
participant Control_Plane
Note over Control_Plane: API Server/Controller Manager/Scheduler
Worker_Node->>Kubelet: 1. 启动 kubelet 服务
Worker_Node->>Kube-Proxy: 2. 启动 kube-proxy
Worker_Node->>Container_Runtime: 3. 启动容器运行时
Kubelet->>Control_Plane: 4. 发起 TLS Bootstrapping 请求
Control_Plane->>Kubelet: 5. 签发节点证书
Kubelet->>Control_Plane: 6. 注册节点信息
Control_Plane->>Kubelet: 7. 返回加入成功
Kubelet->>Container_Runtime: 8. 拉取必要系统 Pod
Kube-Proxy->>Control_Plane: 9. 获取集群网络配置
详细步骤解析
阶段 1:节点初始化准备
| 组件 | 操作 |
|---|---|
| 操作系统 | 安装容器运行时(containerd/Docker/CRI-O)、kubelet、kube-proxy、kubeadm(可选) |
| 网络配置 | 确保与 Control Plane 网络连通(API Server 可达) |
| 防火墙 | 开放端口:10250 (kubelet)、6443 (API Server) 等 |
阶段 2:启动核心服务
-
启动 kubelet(核心代理)
systemctl start kubelet- 作用:管理 Pod 生命周期、挂载存储卷、报告节点状态
- 配置文件:
/var/lib/kubelet/config.yaml
-
启动 kube-proxy(网络代理)
systemctl start kube-proxy- 作用:维护节点网络规则(iptables/IPVS),实现 Service 负载均衡
-
启动容器运行时
systemctl start containerd # 以 containerd 为例
**阶段 3:TLS 认证与节点注册(关键步骤)
-
kubelet 发起 TLS Bootstrapping 请求
- 使用预置的 Bootstrap Token 或 kubeconfig 向 API Server 发起认证
- 生成私钥和证书签名请求 (CSR)
# CSR 内容示例 Subject: O=system:nodes, CN=system:node:<node-name> -
Control Plane 处理 CSR
- Controller Manager 自动批准 CSR(需配置
--cluster-signing-cert-file)
# 查看 CSR 状态 kubectl get csr NAME AGE SIGNERNAME REQUESTOR CONDITION csr-9xvh2 10s kubernetes.io/kubelet kubelet-bootstrap Approved,Issued - Controller Manager 自动批准 CSR(需配置
-
kubelet 获取节点证书
- 将签发的证书保存到
/var/lib/kubelet/pki/kubelet-client-current.pem - 后续通信使用正式证书
- 将签发的证书保存到
阶段 4:节点注册与配置同步
-
kubelet 向 API Server 注册节点
kubectl get nodes NAME STATUS ROLES AGE VERSION worker-1 NotReady <none> 5s v1.27.3 -
kube-proxy 获取集群网络配置
- 监听 API Server 获取 Service/Endpoint 变化
- 配置本地 iptables/IPVS 规则
iptables -t nat -L | grep KUBE-SVC -
节点控制器(Node Controller)工作
- Control Plane 中的控制器:
- 监控节点状态(通过 kubelet 心跳)
- 若超时未收到心跳,标记节点为
NotReady→Unknown(默认 40s/5m)
- Control Plane 中的控制器:
阶段 5:节点就绪与工作负载调度
-
kubelet 自检通过
- 检查容器运行时、内核、磁盘压力等
- 更新节点状态为
Ready
kubectl get nodes NAME STATUS ROLES AGE VERSION worker-1 Ready <none> 30s v1.27.3 -
拉取系统 Pod
- 部署 CNI 插件(如 Calico Pod)
- 部署 kube-proxy DaemonSet
kubectl -n kube-system get pods -o wide | grep worker-1 -
接受工作负载调度
- Scheduler 开始向该节点分配 Pod
kubectl describe node worker-1 | grep -A 10 Allocated
关键配置文件与路径
| 组件 | 配置文件 | 作用 |
|---|---|---|
| kubelet | /etc/kubernetes/kubelet.conf |
连接 API Server 的认证信息 |
/var/lib/kubelet/config.yaml |
节点参数(cgroup 驱动等) | |
| kube-proxy | /var/lib/kube-proxy/kubeconfig.conf |
网络规则同步凭证 |
| 容器运行时 | /etc/containerd/config.toml |
容器引擎配置 |
故障排查命令
-
检查 kubelet 状态
journalctl -u kubelet -f # 实时日志 systemctl status kubelet # 服务状态 -
诊断证书问题
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -
验证网络连通性
curl -k https://<API-Server-IP>:6443/version -
检查节点注册错误
kubectl describe node worker-1
加入集群的两种典型方式
方式 1:kubeadm 自动化加入(推荐)
# 在 Control Plane 生成加入命令
kubeadm token create --print-join-command
# 输出:kubeadm join 10.0.0.100:6443 --token xyz... --discovery-token-ca-cert-hash sha256:...
# 在 Worker 节点执行上述命令
方式 2:手动配置加入
- 复制 Control Plane 的
/etc/kubernetes/admin.conf到 Worker 节点 - 配置 kubelet 参数:
# /etc/kubernetes/kubelet.conf apiVersion: v1 clusters: - cluster: certificate-authority-data: <CA-CERT> server: https://<API-SERVER>:6443 - 启动服务
核心安全机制
-
TLS Bootstrapping
- 防止未授权节点加入
- 自动轮换证书(默认 1 年有效期)
-
Node Restriction 准入控制器
- 限制 kubelet 只能修改自身节点对象
# /etc/kubernetes/manifests/kube-apiserver.yaml - --enable-admission-plugins=NodeRestriction -
RBAC 权限控制
# 系统自动创建的 ClusterRoleBinding kubectl describe clusterrolebinding system:node:worker-1
总结:Worker 节点加入的关键流程
- 准备:安装组件 → 配置网络
- 认证:TLS Bootstrapping → 证书签发
- 注册:kubelet 上报节点 → 控制器标记状态
- 就绪:自检通过 → 接收 Pod 调度
整个过程体现了 Kubernetes 的声明式设计:
- Worker 节点主动声明加入意愿(启动服务)
- Control Plane 验证并授权(签发证书)
- 双方持续同步状态(心跳机制)
浙公网安备 33010602011771号