3. 节点生命周期管理:节点注册、节点状态(Ready/NotReady)、节点健康检查机制
节点(Node)是 Kubernetes 集群中承载 Pod 运行的计算资源单元。节点生命周期管理是集群运维的核心环节,涵盖从节点加入集群、状态持续上报、健康检查到最终移除的全过程。理解节点注册机制、状态转换逻辑以及健康检查原理,是保障集群稳定性和资源调度准确性的基础。
3.1 节点注册机制
节点注册是指一个物理机或虚拟机通过 kubelet 向 API Server 发起身份认证并加入集群的过程。Kubernetes 支持两种注册方式:自注册(Self-Registration)和管理员手动创建。
| 注册方式 | 触发者 | 适用场景 | 关键参数 |
|---|---|---|---|
| 自注册 | kubelet 启动时自动发起 | 自动扩缩容、云环境、大规模集群 | --register-node=true(默认) |
| 手动创建 | 集群管理员 | 边缘节点、离线环境、安全管控严格场景 | 先 kubectl create node,再配置 kubelet |
自注册流程包含以下关键步骤:
- kubelet 启动:读取本地配置文件(
--kubeconfig),向 API Server 发起 TLS 证书请求。 - 身份认证与授权:API Server 验证 kubelet 证书,通过后授予节点相关权限(
system:node组)。 - 创建 Node 对象:kubelet 提交包含节点名称、IP 地址、操作系统、容器运行时版本、资源容量(CPU、内存、最大 Pod 数)等信息的 Node 资源。
- 节点准入:API Server 将 Node 对象写入 etcd,并触发节点准入控制器(如
NodeRestriction)校验。 - 状态初始化:节点状态初始为
NotReady,等待 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 保护关键服务不被过早驱逐。
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 | 节点启动期间放宽心跳超时容忍度 |
node.kubernetes.io/unreachable 或 node.kubernetes.io/not-ready 污点(Taint)。调度器根据 Toleration 决定是否将 Pod 调度到该节点。如果 Pod 没有对应的 Toleration,才会被驱逐。
3.4 节点故障排查与恢复实践
当节点进入 NotReady 或 Unknown 状态时,建议按以下步骤排查:
- 检查 kubelet 状态:登录节点执行
systemctl status kubelet或journalctl -u kubelet -n 50 --no-pager。 - 验证容器运行时:执行
crictl ps或ctr namespace list确认容器运行时是否正常。 - 检查磁盘与内存:
df -h、free -m、cat /proc/sys/kernel/pid_max。 - 查看节点事件:
kubectl describe node <node-name>查看 Conditions 和 Events 字段。 - 重启 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 则告警)。