3. 节点生命周期管理:节点注册、节点状态(Ready/NotReady)、节点健康检查机制

节点(Node)是 Kubernetes 集群中承载 Pod 运行的计算资源单元。节点生命周期管理是集群运维的核心环节,涵盖从节点加入集群、状态持续上报、健康检查到最终移除的全过程。理解节点注册机制、状态转换逻辑以及健康检查原理,是保障集群稳定性和资源调度准确性的基础。

3.1 节点注册机制

节点注册是指一个物理机或虚拟机通过 kubelet 向 API Server 发起身份认证并加入集群的过程。Kubernetes 支持两种注册方式:自注册(Self-Registration)和管理员手动创建。

注册方式 触发者 适用场景 关键参数
自注册 kubelet 启动时自动发起 自动扩缩容、云环境、大规模集群 --register-node=true(默认)
手动创建 集群管理员 边缘节点、离线环境、安全管控严格场景 先 kubectl create node,再配置 kubelet

自注册流程包含以下关键步骤:

  1. kubelet 启动:读取本地配置文件(--kubeconfig),向 API Server 发起 TLS 证书请求。
  2. 身份认证与授权:API Server 验证 kubelet 证书,通过后授予节点相关权限(system:node 组)。
  3. 创建 Node 对象:kubelet 提交包含节点名称、IP 地址、操作系统、容器运行时版本、资源容量(CPU、内存、最大 Pod 数)等信息的 Node 资源。
  4. 节点准入:API Server 将 Node 对象写入 etcd,并触发节点准入控制器(如 NodeRestriction)校验。
  5. 状态初始化:节点状态初始为 NotReady,等待 kubelet 首次心跳上报。
关键参数说明: 自注册时,kubelet 通过 --node-ip 指定节点 IP,通过 --hostname-override 覆盖主机名。若未指定,kubelet 会自动检测默认网络接口 IP 和系统主机名。

3.2 节点状态体系与转换

节点状态由一组条件(Conditions)组成,每个条件包含 status(True/False/Unknown)、lastHeartbeatTime、lastTransitionTime 和 reason 字段。核心状态条件如下:

条件类型 含义 典型异常原因
Ready 节点是否能够正常接收 Pod kubelet 心跳超时、容器运行时故障、网络不可达
DiskPressure 节点磁盘空间是否充足 根分区或镜像分区使用率超过阈值(默认 85%)
MemoryPressure 节点内存是否紧张 可用内存低于 --eviction-hard 阈值
PIDPressure 节点 PID 数量是否接近上限 进程数超过 kernel.pid_max 的 90%
NetworkUnavailable 节点网络配置是否正常 CNI 插件未就绪、网络接口异常

节点状态转换的核心逻辑围绕 Ready 条件展开。kubelet 每隔 --node-status-update-frequency(默认 10s)向 API Server 上报心跳。若 node-monitor-grace-period(默认 40s)内未收到心跳,节点控制器将 Ready 置为 Unknown;若超过 pod-eviction-timeout(默认 5m)仍未恢复,节点上的 Pod 将被驱逐。

生产建议: 在云环境或大规模集群中,建议将 --node-status-update-frequency 调整为 5s,node-monitor-grace-period 调整为 20s,以加快故障检测速度。同时配合 PodDisruptionBudget 保护关键服务不被过早驱逐。
节点状态转换与健康检查流程 节点状态转换与健康检查流程 kubelet 自注册 / 管理员手动创建 初始状态:NotReady(等待首次心跳) kubelet 健康检查循环(每 10s) 检查项:容器运行时 / 磁盘 / 内存 / PID / 网络 全部正常? Ready = True Ready = False 节点控制器(Node Controller) 40s 未收到心跳 → Ready=Unknown → 5min 未恢复 → 驱逐 Pod 节点恢复 → 重新进入健康检查循环

3.3 节点健康检查机制

节点健康检查由 kubelet 自检和节点控制器(Node Controller)监控两层构成,形成端到端的故障检测与自愈闭环。

3.3.1 kubelet 自检(Node Status Updates)

kubelet 在每个心跳周期内执行以下检查,并将结果汇总为 NodeStatus 上报:

  • 容器运行时探活:通过 gRPC 调用 CRI 接口检查容器运行时(containerd / CRI-O / Docker)是否响应。
  • 磁盘空间检查:监控 /var/lib/kubelet、/var/log、根分区等路径的磁盘使用率,触发 DiskPressure 条件。
  • 内存与 PID 检查:对比 --eviction-hard 阈值,触发 MemoryPressure 或 PIDPressure。
  • 网络插件状态:检查 CNI 插件是否就绪,更新 NetworkUnavailable 条件。

3.3.2 节点控制器监控(Node Controller)

节点控制器是 kube-controller-manager 中的一个核心控制器,负责集群级别的节点健康管理:

监控维度 参数 默认值 触发动作
心跳超时 --node-monitor-grace-period 40s 将 Ready 置为 Unknown
Pod 驱逐 --pod-eviction-timeout 5m 开始驱逐节点上的 Pod(受 Taint 和 Toleration 影响)
节点自愈 --node-startup-grace-period 2m 节点启动期间放宽心跳超时容忍度
重要: 节点控制器驱逐 Pod 时,不会立即删除 Pod,而是先给节点添加 node.kubernetes.io/unreachable 或 node.kubernetes.io/not-ready 污点(Taint)。调度器根据 Toleration 决定是否将 Pod 调度到该节点。如果 Pod 没有对应的 Toleration,才会被驱逐。
节点健康检查双层架构 节点健康检查双层架构 节点控制器(kube-controller-manager) 集群级监控:心跳超时检测 / 污点管理 / Pod 驱逐 API Server(etcd 存储) kubelet 节点自检(每 10s 上报) 容器运行时探活 | 磁盘空间 | 内存压力 | PID 压力 | 网络状态 结果 → NodeStatus.Conditions → 写入 API Server 自检频率 --node-status- update-frequency 监控超时 --node-monitor- grace-period Node 对象(etcd 持久化)

3.4 节点故障排查与恢复实践

当节点进入 NotReady 或 Unknown 状态时,建议按以下步骤排查:

  1. 检查 kubelet 状态:登录节点执行 systemctl status kubelet 或 journalctl -u kubelet -n 50 --no-pager。
  2. 验证容器运行时:执行 crictl ps 或 ctr namespace list 确认容器运行时是否正常。
  3. 检查磁盘与内存:df -h、free -m、cat /proc/sys/kernel/pid_max。
  4. 查看节点事件:kubectl describe node <node-name> 查看 Conditions 和 Events 字段。
  5. 重启 kubelet:systemctl restart kubelet 并观察 2-3 个心跳周期。
自动化恢复策略: 在生产环境中,建议部署 node-problem-detector 组件,它可以检测内核死锁、Docker 挂死、硬件故障等底层问题,并通过 NodeCondition 或 Event 上报,触发自动化修复流程(如重启 kubelet、重置网络、甚至触发节点替换)。

3.5 节点生命周期管理最佳实践

  • 设置合理的资源预留:通过 --system-reserved 和 --kube-reserved 为系统进程和 kubelet 预留 CPU/内存,避免节点因资源耗尽进入 MemoryPressure。
  • 配置 Pod 驱逐策略:根据业务容忍度调整 --eviction-hard 和 --eviction-soft 阈值,避免磁盘写满导致节点崩溃。
  • 使用节点自动修复:在云环境中,结合 Cluster Autoscaler 和节点组(Node Group),当节点持续 NotReady 时自动替换实例。
  • 监控节点状态指标:通过 Prometheus 采集 kube_node_status_condition 指标,设置告警规则(如 Ready 状态持续 2 分钟以上为 False 则告警)。