3. 节点池基础概念:定义、弹性伸缩与调度策略

节点池(Node Pool)是集群中一组具有相同配置、规格和标签的节点集合。在 GitOps 交付场景中,节点池是承载工作负载的“计算单元池”,其健康状态直接决定应用能否按时、按量完成 Sync Wave 部署。

3.1 节点池定义与核心属性

节点池将节点按“模板”进行分组管理,每个节点池包含以下核心属性:

属性 说明 典型值
实例规格 节点使用的云服务器类型(CPU/内存/GPU) ecs.g7.2xlarge, Standard_D8s_v3
系统盘大小 节点根分区容量 100GB, 200GB
节点数量 当前运行节点数 / 期望节点数 min=3, max=20, desired=5
标签 附加到节点的键值对,用于调度匹配 node.kubernetes.io/role=worker
污点 阻止 Pod 调度到该节点的策略 CriticalAddonsOnly=true:NoSchedule
自动缩放 是否启用集群自动缩放器(Cluster Autoscaler) enabled / disabled
GitOps 视角: 节点池配置应作为基础设施代码(IaC)纳入 Git 仓库管理。每次节点池规格、数量或标签变更,都应通过 Pull Request 审批后自动同步到集群,确保节点池状态与 Git 仓库一致。

3.2 节点池与集群自动缩放的关系

集群自动缩放器(Cluster Autoscaler, CA)是节点池弹性伸缩的核心组件。CA 会持续监控集群中因资源不足而处于 Pending 状态的 Pod,并触发节点池扩容;当节点利用率持续低于阈值时,触发缩容。

节点池与 CA 的协作流程如下:

  1. 资源不足检测: Pod 因 CPU/内存不足无法调度,状态变为 Pending。
  2. CA 评估: 检查所有节点池的剩余容量,判断是否需要扩容。
  3. 扩容触发: 调用云厂商 API 创建新节点,节点加入节点池并自动注册到集群。
  4. Pod 调度: 新节点 Ready 后,调度器将 Pending Pod 分配到新节点。
  5. 缩容判断: 节点利用率低于阈值(如 50%)且 Pod 可迁移,CA 驱逐 Pod 并删除节点。
巡检要点: 在 Sync Wave 交付高峰期,需重点检查节点池的“期望节点数”与“当前节点数”是否一致。若 CA 频繁触发扩容但节点始终无法 Ready,说明节点池可能存在配额不足或镜像拉取失败问题。
节点池与集群自动缩放协作流程 节点池与集群自动缩放协作流程 Pending Pod Cluster Autoscaler 节点池扩容 新节点 Ready 缩容判断 驱逐 Pod 并删除节点 说明: CA 根据节点池的 min/max 边界进行扩缩容。若节点池配额不足(如云账号 vCPU 上限), CA 会持续重试扩容但失败,此时需巡检配额并校准节点池期望值。

3.3 节点池标签与污点策略

标签(Labels)和污点(Taints)是节点池调度策略的两大核心工具。在 GitOps 交付中,合理使用标签和污点可以实现工作负载的精准调度与隔离。

3.3.1 标签策略

标签是附加到节点上的键值对,用于标识节点的属性。Pod 可以通过 nodeSelector 或 nodeAffinity 选择匹配的节点。

推荐标签规范:

  • 角色标签: node.kubernetes.io/role=worker、node.kubernetes.io/role=system
  • 硬件标签: node.kubernetes.io/instance-type=gpu、node.kubernetes.io/disk=ssd
  • 拓扑标签: topology.kubernetes.io/zone=us-east-1a、topology.kubernetes.io/region=us-east-1
  • 业务标签: app.kubernetes.io/team=payment、app.kubernetes.io/env=production
避坑指南: 避免在节点池创建后手动修改节点标签。节点池的标签应通过 IaC 统一管理,手动修改会导致 Git 仓库状态与集群状态不一致,GitOps 自动同步时会覆盖手动修改。

3.3.2 污点策略

污点用于阻止 Pod 调度到特定节点,除非 Pod 显式容忍该污点。污点由 key=value:Effect 组成,Effect 支持三种类型:

Effect 类型 行为 典型场景
NoSchedule 不允许调度新 Pod,已运行 Pod 不受影响 将 GPU 节点标记为仅 AI 任务可用
PreferNoSchedule 尽量不调度,但不强制 将高成本节点标记为优先避免调度
NoExecute 不允许调度,且驱逐已运行且未容忍的 Pod 节点故障时快速驱逐非关键 Pod

节点池污点配置示例:

# 节点池污点定义(YAML 片段)
spec:
  taints:
    - key: "CriticalAddonsOnly"
      value: "true"
      effect: "NoSchedule"
    - key: "gpu"
      value: "true"
      effect: "NoSchedule"

对应 Pod 的容忍度配置:

# Pod 容忍度配置
spec:
  tolerations:
    - key: "CriticalAddonsOnly"
      operator: "Equal"
      value: "true"
      effect: "NoSchedule"
    - key: "gpu"
      operator: "Exists"
      effect: "NoSchedule"
节点池标签与污点调度策略 节点池标签与污点调度策略 标签调度(nodeSelector / nodeAffinity) Pod: app=web 节点: role=worker 节点: role=gpu Pod 通过 nodeSelector 匹配 role=worker 不匹配 role=gpu,因此不会调度到 GPU 节点 污点调度(Taints & Tolerations) Pod: 容忍 gpu=true 节点: gpu=true:NoSchedule 节点: 无污点 Pod 容忍 gpu=true:NoSchedule,可调度到 GPU 节点 无污点节点也可调度(容忍不是必须匹配)

3.4 节点池巡检核心指标

在 Sync Wave 交付过程中,节点池巡检应重点关注以下指标:

指标 正常范围 异常表现 影响
节点 Ready 率 ≥ 95% 节点频繁 NotReady Pod 无法调度,交付延迟
节点池配额使用率 ≤ 80% 接近 100% CA 无法扩容,Pending Pod 堆积
节点标签一致性 100% 匹配 Git 定义 标签被手动修改 调度策略失效,Pod 调度到错误节点
污点配置一致性 100% 匹配 Git 定义 污点被手动删除或修改 非预期 Pod 调度到关键节点
CA 扩缩容事件 无异常失败事件 扩容失败、缩容卡住 资源浪费或交付阻塞
实战建议: 在 GitOps 仓库中为每个节点池创建独立的 node-pool.yaml 文件,包含标签、污点、min/max 数量等配置。使用 kubectl diff 或 argocd app diff 定期比对集群实际状态与 Git 仓库定义,自动发现漂移并告警。