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 的协作流程如下:
- 资源不足检测: Pod 因 CPU/内存不足无法调度,状态变为 Pending。
- CA 评估: 检查所有节点池的剩余容量,判断是否需要扩容。
- 扩容触发: 调用云厂商 API 创建新节点,节点加入节点池并自动注册到集群。
- Pod 调度: 新节点 Ready 后,调度器将 Pending Pod 分配到新节点。
- 缩容判断: 节点利用率低于阈值(如 50%)且 Pod 可迁移,CA 驱逐 Pod 并删除节点。
巡检要点: 在 Sync Wave 交付高峰期,需重点检查节点池的“期望节点数”与“当前节点数”是否一致。若 CA 频繁触发扩容但节点始终无法 Ready,说明节点池可能存在配额不足或镜像拉取失败问题。
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"
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 仓库定义,自动发现漂移并告警。