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 节点池生命周期

节点池从创建到销毁会经历一系列状态。理解这些状态是排障的基础。下图展示了节点池的完整生命周期流转:

节点池生命周期状态流转图 节点池生命周期状态流转图 创建中 (Creating) 运行中 (Running) 升级中 (Upgrading) 扩缩容中 (Scaling) 异常 (Error) 删除中 (Deleting) 虚线箭头表示自动恢复路径 实线箭头表示主动操作路径

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 配置或工作负载的优雅终止逻辑。