2. K8s 节点生命周期管理:节点注册、证书签发、节点状态与污点基础

节点(Node)是 Kubernetes 集群的工作负载载体。理解节点从加入集群到被调度、再到可能被隔离的完整生命周期,是掌握污点与容忍策略的前提。本章聚焦节点注册、证书签发、状态机转换以及污点(Taint)的基础概念。

2.1 节点注册与身份建立

节点加入集群有两种方式:静态注册(手动指定)和动态注册(自动发现)。生产环境几乎全部采用动态注册,由 kubelet 主动向 API Server 发起注册请求。

注册方式 触发条件 适用场景 证书管理
静态注册 kubelet 启动时读取 --register-node=false 及本地 manifest 控制平面节点、边缘离线节点 手动分发证书
动态注册 kubelet 启动时自动向 API Server 创建 Node 对象 工作节点、自动扩缩容集群 自动 CSR 与签发
关键参数: kubelet 启动参数 --register-with-taints 允许节点在注册时直接携带污点,这是将节点准入策略前置的重要手段。

2.2 证书签发流程(TLS Bootstrap)

Kubernetes 1.18+ 推荐使用 TLS Bootstrap 机制完成节点身份证书的自动签发。流程分为三个阶段:

  1. 初始令牌认证: kubelet 使用预先分发的 Bootstrap (或 Secret)向 API Server 发起 CSR(CertificateSigningRequest)。
  2. 节点身份确认: 集群内的 csr-approving 控制器(或自定义审批策略)验证请求来源,自动批准 Node 客户端的 CSR。
  3. 证书轮换: kubelet 获取签发的证书,用于后续所有与 API Server 的通信。证书过期前,kubelet 自动发起轮换请求。
安全要点: Bootstrap 属于高敏感凭据。一旦节点完成注册,应立即禁用该 或设置 --experimental-bootstrap--auth 为 false。证书轮换作业的节点准入控制,正是为了在轮换期间防止恶意节点利用旧证书或未授权 混入集群。
节点注册与 TLS Bootstrap 流程 kubelet 启动 Bootstrap API Server CSR 审批 签发证书返回 kubelet 流程说明: 1. kubelet 使用 Bootstrap 向 API Server 发起 CSR。 2. CSR 控制器自动审批(基于 Subject 或策略)。 3. kubelet 获取签发的 X.509 证书,用于后续通信与证书轮换。

2.3 节点状态机与条件

节点状态由 NodeStatus 对象描述,包含多个条件(Conditions)。kubelet 定期上报心跳,API Server 根据心跳超时判定节点状态。

节点条件 含义 典型值 对调度影响
Ready 节点是否健康并准备好接收 Pod True / False / Unknown False 或 Unknown 时,节点被标记为不可调度
DiskPressure 节点磁盘空间是否不足 True / False True 时驱逐 Pod
MemoryPressure 节点内存是否紧张 True / False True 时优先驱逐低优先级 Pod
PIDPressure 节点 PID 是否耗尽 True / False True 时停止新 Pod 调度
NetworkUnavailable 节点网络是否正常 True / False True 时节点不可调度
证书轮换与节点状态关联: 当节点证书轮换失败(如 CSR 被拒绝、证书过期),kubelet 无法与 API Server 正常通信,心跳上报中断。约 40 秒后节点状态变为 Ready: Unknown,进而触发 Pod 驱逐。这正是我们需要用污点容忍策略提前控制轮换作业节点准入的原因。

2.4 污点(Taint)基础

污点是附加在节点上的键值对属性,用于排斥不符合条件的 Pod。污点由三部分组成:Key、Value(可选)和 Effect。

Effect 类型 行为描述 典型用途
NoSchedule 不调度新 Pod 到该节点(已有 Pod 不受影响) 节点维护、硬件隔离
PreferNoSchedule 尽量不调度,但不强制 软约束,用于负载均衡
NoExecute 不调度新 Pod,并驱逐已有不匹配容忍的 Pod 节点故障隔离、证书轮换期间隔离

污点操作命令示例:

# 给节点添加污点(NoExecute 效果)
kubectl taint nodes node1 cert-rotation=true:NoExecute

# 查看节点污点
kubectl describe node node1 | grep Taints

# 移除污点
kubectl taint nodes node1 cert-rotation=true:NoExecute-
污点与节点状态关系 节点状态 Ready: True 正常调度 污点注入 cert-rotation=true Effect: NoExecute 节点准入控制 仅容忍 Pod 可调度 其他 Pod 被驱逐 污点与证书轮换作业的准入关系: • 证书轮换作业(Job)通过容忍(Toleration)匹配节点污点,获得调度权限。 • 未配置容忍的普通 Pod 会被 NoExecute 污点驱逐,确保轮换期间节点负载最小化。 • 轮换完成后移除污点,节点恢复为 Ready: True 状态,重新接受正常调度。

2.5 节点生命周期与污点策略的协同

节点生命周期管理不是孤立的过程。证书轮换作业的节点准入,本质上是将节点生命周期中的“证书即将过期”阶段,通过污点机制转化为一个可控制的维护窗口。核心协同点如下:

  • 注册阶段: 节点通过 TLS Bootstrap 获取身份证书,同时可携带初始污点(如 node-role.kubernetes.io/control-plane:NoSchedule)。
  • 运行阶段: 节点状态正常,无污点或仅有软污点,接受常规调度。
  • 证书轮换触发: 检测到证书即将过期(如剩余 30 天),自动或手动为节点添加 cert-rotation=true:NoExecute 污点。
  • 准入控制: 仅带有对应容忍的证书轮换作业(Job)可以调度到该节点,执行证书更新。
  • 恢复阶段: 轮换成功,移除污点,节点状态恢复,重新加入调度池。
最佳实践: 在节点注册时通过 --register-with-taints 设置初始污点,结合 node-lifecycle-controller 自动管理证书轮换期间的污点注入与移除,可以实现零人工干预的节点证书生命周期管理。