2. 节点池基础:节点池定义、节点池与节点组的关系、节点池生命周期
2.1 节点池定义
节点池(Node Pool)是 Kubernetes 集群中一组具有相同配置的节点(Node)的逻辑集合。它抽象了底层基础设施的差异,为集群管理员提供了一种声明式管理节点扩缩容、升级和配置变更的能力。在云原生环境中,节点池通常对应一个云服务商提供的实例组或伸缩组。
核心特征:节点池内的所有节点共享相同的实例规格(CPU/内存/GPU)、操作系统镜像、数据盘配置、初始化脚本以及标签/污点。这种同质性使得批量操作(如滚动升级)变得可预测且安全。
2.2 节点池与节点组的关系
在 Kubernetes 生态中,“节点池”和“节点组”这两个术语经常混用,但在不同语境下存在细微差别。下表梳理了它们在概念、职责和典型场景上的对比:
| 对比维度 | 节点池(Node Pool) | 节点组(Node Group) |
|---|---|---|
| 概念层级 | Kubernetes 集群层面的抽象,面向集群管理员 | 基础设施(IaaS)层面的资源集合,面向云平台 |
| 核心职责 | 管理节点的生命周期(升级、扩缩容、配置更新) | 管理底层虚拟机或物理机的创建与销毁 |
| 配置粒度 | 包含节点标签、污点、Taints、升级策略等 K8s 原生属性 | 包含实例类型、磁盘大小、网络子网、安全组等云资源属性 |
| 典型实现 | Kubelet 配置、Cluster Autoscaler 配置 | AWS Auto Scaling Group、GCP Instance Group、Azure VMSS |
| 关系 | 一个节点池通常对应一个节点组,但也可以跨多个节点组(如混合机型池) | 一个节点组通常只属于一个节点池 |
运维视角:在滚动升级场景中,我们操作的是节点池。节点池负责编排升级顺序和速率,而节点组负责执行底层实例的替换。理解这种分层关系,有助于在升级失败时快速定位问题出在 K8s 控制面还是云基础设施层。
2.3 节点池生命周期
节点池从创建到销毁会经历一系列状态。理解这些状态是排障的基础。下图展示了节点池的完整生命周期流转:
2.4 生命周期关键阶段详解
节点池的每个状态都对应一组可观测的指标和常见的排障切入点。以下是各阶段的详细说明:
- 创建中(Creating):节点池配置提交后,底层节点组开始创建实例。此时应关注云服务商 API 调用是否成功、配额是否充足、镜像是否可用。
- 运行中(Running):节点池内所有节点均处于 Ready 状态,Pod 可正常调度。这是期望的稳态。
- 升级中(Upgrading):触发滚动升级后进入此状态。节点池控制器按策略逐个替换节点。排障重点在于:节点排水是否卡住、新节点是否无法加入集群、Pod Disruption Budget 是否阻止驱逐。
- 扩缩容中(Scaling):由 Cluster Autoscaler 或手动触发。常见问题包括:节点组达到最大/最小限制、实例创建失败、节点注册超时。
- 异常(Error):节点池操作失败后的状态。可能原因:云资源不可用、K8s 版本不兼容、配置校验失败。此状态通常需要人工介入。
- 删除中(Deleting):节点池被删除时,先驱逐 Pod,再销毁实例。常见问题:Pod 无法被驱逐(如 PDB 阻止)、云资源删除失败(如依赖未清理)。
排障红线:当节点池处于“异常”状态时,不要直接对底层节点组(如 AWS ASG)进行手动修改。这会导致节点池状态与基础设施状态不一致,引发更复杂的故障。正确的做法是:先排查节点池事件和日志,修复配置后通过节点池 API 进行重试或回滚。
2.5 节点池配置清单示例
以下是一个典型的节点池 YAML 配置片段(以 Cluster API 为例),展示了关键字段:
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
name: worker-pool-1
spec:
clusterName: my-cluster
replicas: 3
template:
spec:
version: v1.28.3
bootstrap:
configRef:
name: worker-pool-1-bootstrap
infrastructureRef:
name: worker-pool-1-infra
nodeDrainTimeout: 2m
nodeVolumeDetachTimeout: 5m
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
deletePolicy: Oldest
上述配置中,nodeDrainTimeout 和 nodeVolumeDetachTimeout 是滚动升级排障的关键超时参数。如果 Pod 驱逐耗时过长,节点池升级会卡在“升级中”状态,此时需要检查 PDB 配置或工作负载的优雅终止逻辑。