在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:启动核心服务

  1. 启动 kubelet(核心代理)

    systemctl start kubelet
    
    • 作用:管理 Pod 生命周期、挂载存储卷、报告节点状态
    • 配置文件/var/lib/kubelet/config.yaml
  2. 启动 kube-proxy(网络代理)

    systemctl start kube-proxy
    
    • 作用:维护节点网络规则(iptables/IPVS),实现 Service 负载均衡
  3. 启动容器运行时

    systemctl start containerd  # 以 containerd 为例
    

**阶段 3:TLS 认证与节点注册(关键步骤)

  1. kubelet 发起 TLS Bootstrapping 请求

    • 使用预置的 Bootstrap Tokenkubeconfig 向 API Server 发起认证
    • 生成私钥和证书签名请求 (CSR)
    # CSR 内容示例
    Subject: O=system:nodes, CN=system:node:<node-name>
    
  2. 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
    
  3. kubelet 获取节点证书

    • 将签发的证书保存到 /var/lib/kubelet/pki/kubelet-client-current.pem
    • 后续通信使用正式证书

阶段 4:节点注册与配置同步

  1. kubelet 向 API Server 注册节点

    kubectl get nodes
    NAME       STATUS     ROLES    AGE   VERSION
    worker-1   NotReady   <none>   5s    v1.27.3
    
  2. kube-proxy 获取集群网络配置

    • 监听 API Server 获取 Service/Endpoint 变化
    • 配置本地 iptables/IPVS 规则
    iptables -t nat -L | grep KUBE-SVC
    
  3. 节点控制器(Node Controller)工作

    • Control Plane 中的控制器:
      • 监控节点状态(通过 kubelet 心跳)
      • 若超时未收到心跳,标记节点为 NotReadyUnknown(默认 40s/5m)

阶段 5:节点就绪与工作负载调度

  1. kubelet 自检通过

    • 检查容器运行时、内核、磁盘压力等
    • 更新节点状态为 Ready
    kubectl get nodes
    NAME       STATUS   ROLES    AGE   VERSION
    worker-1   Ready    <none>   30s   v1.27.3
    
  2. 拉取系统 Pod

    • 部署 CNI 插件(如 Calico Pod)
    • 部署 kube-proxy DaemonSet
    kubectl -n kube-system get pods -o wide | grep worker-1
    
  3. 接受工作负载调度

    • 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 容器引擎配置

故障排查命令

  1. 检查 kubelet 状态

    journalctl -u kubelet -f  # 实时日志
    systemctl status kubelet   # 服务状态
    
  2. 诊断证书问题

    openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text
    
  3. 验证网络连通性

    curl -k https://<API-Server-IP>:6443/version
    
  4. 检查节点注册错误

    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:手动配置加入

  1. 复制 Control Plane 的 /etc/kubernetes/admin.conf 到 Worker 节点
  2. 配置 kubelet 参数:
    # /etc/kubernetes/kubelet.conf
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: <CA-CERT>
        server: https://<API-SERVER>:6443
    
  3. 启动服务

核心安全机制

  1. TLS Bootstrapping

    • 防止未授权节点加入
    • 自动轮换证书(默认 1 年有效期)
  2. Node Restriction 准入控制器

    • 限制 kubelet 只能修改自身节点对象
    # /etc/kubernetes/manifests/kube-apiserver.yaml
    - --enable-admission-plugins=NodeRestriction
    
  3. RBAC 权限控制

    # 系统自动创建的 ClusterRoleBinding
    kubectl describe clusterrolebinding system:node:worker-1
    

总结:Worker 节点加入的关键流程

  1. 准备:安装组件 → 配置网络
  2. 认证:TLS Bootstrapping → 证书签发
  3. 注册:kubelet 上报节点 → 控制器标记状态
  4. 就绪:自检通过 → 接收 Pod 调度

整个过程体现了 Kubernetes 的声明式设计:

  • Worker 节点主动声明加入意愿(启动服务)
  • Control Plane 验证并授权(签发证书)
  • 双方持续同步状态(心跳机制)
posted @ 2025-08-15 13:50  天道酬勤zjh  阅读(49)  评论(0)    收藏  举报