2. Kubernetes 节点池基础

2.1 节点池的概念

节点池(Node Pool)是 Kubernetes 集群中一组具有相同配置、标签、污点和资源的节点集合。在托管 Kubernetes 服务(如 AKS、EKS、GKE、TKE)中,节点池是管理同质化工作节点的基本单元。每个节点池内的节点共享相同的实例规格、操作系统、磁盘类型和初始化脚本,从而简化了集群的扩缩容与运维操作。

核心定义:节点池 = 一组同质化节点 + 统一的配置模板 + 独立的扩缩容策略。

2.2 节点池的作用

作用维度 说明 关键收益
资源隔离 不同节点池使用不同的实例规格或机型,实现计算、内存、GPU 资源的物理隔离 避免业务相互干扰,保障关键工作负载的稳定性
弹性伸缩 每个节点池可独立配置 Cluster Autoscaler 策略,按需扩缩容 精准匹配业务流量波动,降低闲置成本
混合机型管理 在同一集群中同时管理标准型、计算型、内存型、GPU 型等多种节点池 满足多样化工作负载的硬件需求,提升资源利用率
升级与运维 节点池级别的滚动升级、镜像预拉取、安全补丁更新 最小化对业务的影响,实现灰度升级
成本控制 为不同节点池设置不同的实例类型和计费模式(按需/竞价/预留实例) 优化整体集群成本,竞价实例池可降低 60%-80% 计算费用

2.3 常见使用场景

2.3.1 弹性伸缩场景

节点池是 Kubernetes 弹性伸缩的基础单元。当工作负载 Pod 因资源不足而处于 Pending 状态时,Cluster Autoscaler 会检查所有节点池的剩余容量,并触发对应节点池的扩容操作。缩容时则根据节点利用率逐步回收空闲节点。

最佳实践:为每个节点池设置最小/最大节点数限制,并配置缩容冷却时间(scale-down-delay-after-add),避免频繁扩缩容导致的震荡。

2.3.2 混合机型场景

现代云原生应用通常包含多种类型的工作负载,单一机型无法满足所有需求。通过节点池可以实现混合机型管理:

  • 标准型节点池:运行常规微服务、Web 应用,平衡计算与内存资源。
  • 计算型节点池:运行批处理任务、CI/CD 构建、视频转码等 CPU 密集型工作负载。
  • 内存型节点池:运行缓存、数据库、内存分析等内存密集型应用。
  • GPU 型节点池:运行 AI 训练、推理、图形渲染等需要 GPU 加速的工作负载。
  • 竞价实例节点池:运行无状态、可中断的弹性任务,大幅降低成本。

2.3.3 节点池升级与镜像预拉取场景

节点池的升级操作(如更新操作系统版本、Kubernetes 版本、容器运行时)通常采用滚动升级策略。在升级过程中,新节点加入集群前需要拉取业务镜像,这一过程往往成为升级速度的瓶颈。容器镜像预拉取策略正是为了解决这一问题而设计——在节点加入集群之前,提前将目标镜像拉取到节点本地,从而加速节点就绪时间。

注意:节点池升级时,如果未使用镜像预拉取,每个新节点启动后需要同时拉取多个业务镜像,可能导致 Pod 调度延迟 30 秒到数分钟不等,具体取决于镜像大小和网络带宽。
节点池概念架构图 Kubernetes 集群 节点池 A 标准型 (4C8G) 节点-1 节点-2 节点-3 弹性范围: 1~10 标签: type=standard 节点池 B GPU 型 (8C32G V100) gpu-node-1 gpu-node-2 弹性范围: 0~5 标签: type=gpu 节点池 C 竞价实例 (2C4G) spot-node-1 spot-node-2 spot-node-3 弹性范围: 0~20 标签: type=spot 每个节点池独立管理实例规格、弹性策略、标签和污点,支持混合机型部署

2.4 节点池与工作负载的关联

工作负载通过 nodeSelector、节点亲和性(nodeAffinity) 或 污点容忍(Toleration) 将 Pod 调度到指定的节点池。以下是一个将 Pod 调度到 GPU 节点池的示例:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-inference-pod
spec:
  containers:
  - name: inference
    image: inference-server:latest
    resources:
      requests:
        nvidia.com/gpu: 1
      limits:
        nvidia.com/gpu: 1
  nodeSelector:
    type: gpu
  tolerations:
  - key: "nvidia.com/gpu"
    operator: "Exists"
    effect: "NoSchedule"

2.5 节点池的生命周期管理

节点池的典型生命周期包含以下阶段:

  1. 创建:指定实例规格、磁盘大小、操作系统、初始节点数、标签和污点。
  2. 扩缩容:手动调整节点数或通过 Cluster Autoscaler 自动调整。
  3. 升级:滚动升级节点池内的节点(Kubernetes 版本、操作系统、容器运行时)。
  4. 维护:替换故障节点、打安全补丁、更新配置。
  5. 删除:清空节点上的 Pod 后移除节点池。
关键指标:节点池升级速度通常由“节点就绪时间”衡量。未使用镜像预拉取时,节点就绪时间 = 节点初始化时间 + 镜像拉取时间;使用预拉取后,节点就绪时间 ≈ 节点初始化时间,可缩短 40%-70%。
节点池升级流程对比:无预拉取 vs 有预拉取 无镜像预拉取 ① 节点创建 / 加入集群 ② 节点初始化(系统配置) ③ 拉取业务镜像(耗时瓶颈) ④ 节点就绪,调度 Pod 总耗时:60s ~ 300s+ 有镜像预拉取 ① 节点创建 + 预拉取镜像(并行) ② 节点初始化(系统配置) ③ 镜像已就绪,跳过拉取 ④ 节点就绪,立即调度 Pod 总耗时:30s ~ 90s

2.6 节点池配置示例(TKE / AKS)

以下是一个使用 Terraform 创建混合节点池的配置片段:

# 标准型节点池
resource "tencentcloud_kubernetes_node_pool" "standard" {
  cluster_id     = tencentcloud_kubernetes_cluster.main.id
  name           = "standard-pool"
  node_count     = 3
  max_size       = 10
  min_size       = 1
  instance_type  = "S5.LARGE8"    # 4C8G
  subnet_ids     = [var.subnet_id]
  labels = {
    "type" = "standard"
  }
}

# GPU 型节点池
resource "tencentcloud_kubernetes_node_pool" "gpu" {
  cluster_id     = tencentcloud_kubernetes_cluster.main.id
  name           = "gpu-pool"
  node_count     = 1
  max_size       = 5
  min_size       = 0
  instance_type  = "GN10X.LARGE96" # 8C32G V100
  subnet_ids     = [var.subnet_id]
  labels = {
    "type" = "gpu"
  }
  taints {
    key    = "nvidia.com/gpu"
    value  = "true"
    effect = "NoSchedule"
  }
}
小结:节点池是 Kubernetes 集群实现资源隔离、弹性伸缩和混合机型管理的核心抽象。理解节点池的概念与生命周期,是后续学习容器镜像预拉取策略加速节点池升级的基础。在下一章中,我们将深入分析节点池升级过程中的性能瓶颈,并量化镜像拉取时间对升级速度的影响。