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 的协作流程如下:

  1. Pod 调度失败:因资源不足导致 Pod 处于 Pending 状态。
  2. CA 检测:扫描所有 Pending Pod,判断是否因节点资源不足引起。
  3. 节点池匹配:CA 根据 Pod 的节点选择器(nodeSelector)、亲和性(Affinity)以及容忍度(Tolerations)选择可扩容的节点池。
  4. 扩容触发:调用云厂商 API 创建新节点,节点加入节点池并注册到集群。
  5. Pod 调度:新节点 Ready 后,调度器将 Pending Pod 绑定到新节点。
  6. 缩容评估:CA 周期性检查节点利用率,低于阈值且可驱逐 Pod 的节点将被回收。

节点池的弹性边界由 Min 和 Max 参数控制:

  • Min:节点池保底节点数,即使无负载也不低于此值,用于承载系统组件和常驻 eBPF 程序。
  • Max:节点池最大节点数,防止资源无限扩张导致成本失控。
  • 扩缩容冷却时间:两次扩容或缩容之间的最小间隔,避免频繁抖动。
容量规划建议: 对于 eBPF 节点池,建议将 Min 设置为 2~3 个节点,确保 eBPF DaemonSet 或 Sidecar 有足够的冗余副本;Max 根据业务峰值预估上浮 30%~50%。同时开启 CA 的 scale-down-utilization-threshold 参数(默认 0.5),避免低负载节点长期空转。
节点池与集群自动缩放协作流程 Pending Pod CA 检测 节点池匹配 扩容触发 Pod 调度 缩容评估 循环检测 关键参数说明 • Min/Max:节点池弹性边界,eBPF 节点池建议 Min=2~3,Max=峰值上浮 30%~50% • scale-down-utilization-threshold:缩容利用率阈值,默认 0.5,避免低负载空转 • 冷却时间:扩缩容间隔,建议扩容 30s,缩容 5min,防止抖动

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 都已配置正确的容忍度,否则可能导致系统组件被驱逐。
节点池标签与污点调度控制 eBPF 节点池 节点 1:kernel-version=5.15 节点 2:kernel-version=5.15 节点 3:kernel-version=5.15 污点:ebpf=true:NoSchedule 标签:node-pool-type=ebpf Pod 调度决策 eBPF Collector Pod 容忍度:ebpf=true:NoSchedule nodeSelector:node-pool-type=ebpf 普通业务 Pod 无容忍度 无 nodeSelector 允许调度 拒绝调度 调度结果 eBPF Pod → 调度到节点池 普通 Pod → 被污点阻止

3.4 节点池设计原则

在 eBPF 节点池容量规划中,遵循以下设计原则可提升资源利用率和调度可靠性:

  • 同质化原则:同一节点池内的节点规格、内核版本、eBPF 特性必须一致,避免调度后因内核差异导致 eBPF 程序加载失败。
  • 隔离性原则:通过污点将 eBPF 节点池与普通业务节点池隔离,防止非 eBPF Pod 抢占资源。
  • 弹性边界原则:根据 eBPF 程序的资源消耗模型(CPU、内存、网络吞吐)设定节点池的 Min/Max,预留 20%~30% 的缓冲资源应对突发流量。
  • 可观测性原则:为节点池附加详细的标签(如内核版本、eBPF 特性、可用区),便于 Prometheus 等监控系统按维度聚合指标。
容量规划检查清单:
✅ 节点池内所有节点内核版本一致(建议 ≥ 5.10)
✅ 已设置 ebpf=true:NoSchedule 污点,防止非目标 Pod 调度
✅ 已添加 node-pool-type=ebpf 和 kernel-version=5.15 标签
✅ 节点池 Min ≥ 2,确保 eBPF DaemonSet 高可用
✅ 已开启集群自动缩放,并配置合理的冷却时间