3. 节点池概念:节点池定义、节点池与集群自动缩放、节点池标签与污点
3.1 节点池定义
节点池(Node Pool)是 Kubernetes 集群中一组具有相同配置的节点集合。在云原生基础设施中,节点池是连接集群控制面与底层计算资源的逻辑抽象层。每个节点池内的节点共享相同的实例规格、操作系统镜像、磁盘类型、网络配置以及初始化脚本。
节点池的核心属性包括:
| 属性 | 说明 | 典型值 |
|---|---|---|
| 实例规格 | 节点使用的云服务器类型(CPU/内存/GPU) | ecs.g7.4xlarge、g4dn.xlarge |
| 节点数量 | 当前池中运行的节点数(含 Min/Max 边界) | Min: 2, Max: 20, Current: 5 |
| 操作系统 | 节点使用的 OS 镜像版本 | Alibaba Cloud Linux 3、Ubuntu 22.04 |
| 数据盘配置 | 挂载的云盘类型、大小、挂载点 | ESSD PL2 500GiB /data |
| 初始化脚本 | 节点启动时执行的 Shell 或 Cloud-init 脚本 | 安装 eBPF 内核模块、配置 sysctl |
| 标签(Labels) | 自动附加到节点上的键值对 | node-pool-type: ebpf |
| 污点(Taints) | 阻止普通 Pod 调度到该节点 | ebpf=true:NoSchedule |
eBPF 场景要点: 节点池是 eBPF 程序运行的基础设施单元。不同 eBPF 程序对内核版本、内核配置(如 CONFIG_BPF、CONFIG_DEBUG_INFO_BTF)有严格依赖,因此需要将同类型 eBPF 工作负载调度到同一节点池,避免因内核差异导致程序加载失败。
3.2 节点池与集群自动缩放
集群自动缩放(Cluster Autoscaler, CA)是节点池的核心配套组件。CA 根据 Pod 调度状态自动调整节点池内的节点数量,实现计算资源的弹性伸缩。节点池与 CA 的协作流程如下:
- Pod 调度失败:因资源不足导致 Pod 处于 Pending 状态。
- CA 检测:扫描所有 Pending Pod,判断是否因节点资源不足引起。
- 节点池匹配:CA 根据 Pod 的节点选择器(nodeSelector)、亲和性(Affinity)以及容忍度(Tolerations)选择可扩容的节点池。
- 扩容触发:调用云厂商 API 创建新节点,节点加入节点池并注册到集群。
- Pod 调度:新节点 Ready 后,调度器将 Pending Pod 绑定到新节点。
- 缩容评估:CA 周期性检查节点利用率,低于阈值且可驱逐 Pod 的节点将被回收。
节点池的弹性边界由 Min 和 Max 参数控制:
- Min:节点池保底节点数,即使无负载也不低于此值,用于承载系统组件和常驻 eBPF 程序。
- Max:节点池最大节点数,防止资源无限扩张导致成本失控。
- 扩缩容冷却时间:两次扩容或缩容之间的最小间隔,避免频繁抖动。
容量规划建议: 对于 eBPF 节点池,建议将 Min 设置为 2~3 个节点,确保 eBPF DaemonSet 或 Sidecar 有足够的冗余副本;Max 根据业务峰值预估上浮 30%~50%。同时开启 CA 的
scale-down-utilization-threshold 参数(默认 0.5),避免低负载节点长期空转。
3.3 节点池标签与污点
节点池标签(Labels)和污点(Taints)是控制 Pod 调度到节点池的核心机制。标签用于标识节点属性,污点用于排斥非容忍的 Pod。在 eBPF 节点池场景中,这两者共同保障 eBPF 工作负载被精确调度到兼容内核的节点上。
3.3.1 节点池标签
节点池标签在节点创建时自动附加,通常包含以下类别:
| 标签键 | 标签值示例 | 用途 |
|---|---|---|
node-pool-type |
ebpf, gpu, general | 标识节点池用途,用于 Pod 的 nodeSelector |
kernel-version |
5.10, 5.15, 6.1 | 标识内核版本,eBPF 程序依赖特定内核特性 |
ebpf-features |
btf, kprobe, tracepoint | 标识节点支持的 eBPF 特性 |
topology.kubernetes.io/zone |
cn-hangzhou-a | 可用区信息,用于跨 AZ 高可用调度 |
node.kubernetes.io/instance-type |
ecs.g7.4xlarge | 实例规格,用于资源匹配 |
eBPF 标签最佳实践: 在节点池创建时,通过 Cloud-init 或云厂商标签注入机制,自动添加
ebpf-features=btf 和 kernel-version=5.15 等标签。Deployment 的 Pod 模板中使用 nodeSelector 精确匹配这些标签,确保 eBPF 程序只调度到兼容节点。
3.3.2 节点池污点
污点用于阻止非目标 Pod 调度到节点池。eBPF 节点池通常需要设置污点,防止普通业务 Pod 占用 eBPF 节点资源。污点由三个部分组成:
- Key:污点键,如
ebpf - Value:污点值,如
true - Effect:调度效果,包括
NoSchedule、PreferNoSchedule、NoExecute
常见污点配置示例:
# 阻止非容忍 Pod 调度到 eBPF 节点池
kubectl taint nodes -l node-pool-type=ebpf ebpf=true:NoSchedule
# 优先不调度,但资源紧张时可容忍
kubectl taint nodes -l node-pool-type=ebpf ebpf=true:PreferNoSchedule
# 驱逐已有非容忍 Pod
kubectl taint nodes -l node-pool-type=ebpf ebpf=true:NoExecute
对应的 Pod 容忍度配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ebpf-collector
spec:
template:
spec:
tolerations:
- key: "ebpf"
operator: "Equal"
value: "true"
effect: "NoSchedule"
nodeSelector:
node-pool-type: ebpf
kernel-version: "5.15"
注意: 使用
NoExecute 效果时,会立即驱逐节点上所有不满足容忍度的 Pod。在 eBPF 节点池上设置 NoExecute 前,务必确认所有需要运行在该节点池的 Pod 都已配置正确的容忍度,否则可能导致系统组件被驱逐。
3.4 节点池设计原则
在 eBPF 节点池容量规划中,遵循以下设计原则可提升资源利用率和调度可靠性:
- 同质化原则:同一节点池内的节点规格、内核版本、eBPF 特性必须一致,避免调度后因内核差异导致 eBPF 程序加载失败。
- 隔离性原则:通过污点将 eBPF 节点池与普通业务节点池隔离,防止非 eBPF Pod 抢占资源。
- 弹性边界原则:根据 eBPF 程序的资源消耗模型(CPU、内存、网络吞吐)设定节点池的 Min/Max,预留 20%~30% 的缓冲资源应对突发流量。
- 可观测性原则:为节点池附加详细的标签(如内核版本、eBPF 特性、可用区),便于 Prometheus 等监控系统按维度聚合指标。
容量规划检查清单:
✅ 节点池内所有节点内核版本一致(建议 ≥ 5.10)
✅ 已设置
✅ 已添加
✅ 节点池 Min ≥ 2,确保 eBPF DaemonSet 高可用
✅ 已开启集群自动缩放,并配置合理的冷却时间
✅ 节点池内所有节点内核版本一致(建议 ≥ 5.10)
✅ 已设置
ebpf=true:NoSchedule 污点,防止非目标 Pod 调度✅ 已添加
node-pool-type=ebpf 和 kernel-version=5.15 标签✅ 节点池 Min ≥ 2,确保 eBPF DaemonSet 高可用
✅ 已开启集群自动缩放,并配置合理的冷却时间