在K8S中,Worker节点加入集群的全过程?

在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:

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

kubelet 获取节点证书

将签发的证书保存到 /var/lib/kubelet/pki/kubelet-client-current.pem

后续通信使用正式证书

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

kubelet 向 API Server 注册节点

kubectl get nodes

NAME STATUS ROLES AGE VERSION

worker-1 NotReady 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)

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

kubelet 自检通过

检查容器运行时、内核、磁盘压力等

更新节点状态为 Ready

kubectl get nodes

NAME STATUS ROLES AGE VERSION

worker-1 Ready 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://: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:

server: https://: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 验证并授权(签发证书)

双方持续同步状态(心跳机制)

相关文章

ps绘图工具有哪些
office365打不开doc文件

ps绘图工具有哪些

📅 07-23 👁️ 4534
缬沙坦胶囊(缬克)
下载365App

缬沙坦胶囊(缬克)

📅 07-31 👁️ 8331
赫迪拉38岁生日,回顾德国中场大师的辉煌生涯
office365打不开doc文件

赫迪拉38岁生日,回顾德国中场大师的辉煌生涯

📅 08-21 👁️ 1770