3. 节点扩容基础:水平扩容与垂直扩容

在 Kubernetes 集群的生命周期管理中,节点扩容是应对业务负载变化、保障服务可用性的核心手段。根据资源调整维度的不同,扩容策略可分为水平扩容(Scale-Out)与垂直扩容(Scale-Up)两种基本模式。理解二者的差异、适用场景及对容器运行时(如 Containerd)的影响,是进行集群资源规划与性能调优的前提。

3.1 水平扩容 vs 垂直扩容:概念与对比

维度 水平扩容(Scale-Out) 垂直扩容(Scale-Up)
操作方式 增加集群中的节点数量(如新增一台物理机或虚拟机) 增加单个节点的资源配额(如升级 CPU、内存、磁盘 IO)
资源粒度 节点级,整体计算能力线性增长 单机级,受物理硬件上限约束
对 Pod 影响 Pod 通过调度器分配到新节点,原有 Pod 无感 通常需要重启节点或迁移 Pod 才能生效
弹性伸缩能力 强,可快速增减节点,适合突发流量 弱,扩容周期长(采购/配置硬件),缩容困难
Containerd 视角 新节点需初始化 Containerd 配置、镜像缓存预热 已有节点上 Containerd 可分配更多资源给 Pod
典型场景 Web 服务、微服务、无状态应用 数据库、有状态中间件、AI 训练任务
关键认知:在云原生架构中,水平扩容是首选策略。它天然适配 Kubernetes 的声明式调度与弹性设计,而垂直扩容更多作为补充手段,用于解决单 Pod 资源瓶颈或硬件升级场景。

3.2 水平扩容的典型场景与流程

水平扩容的核心在于“增加节点”,这不仅仅是简单的机器加入,还涉及集群注册、节点初始化、资源注册与调度准入等步骤。以下 SVG 展示了从触发扩容到 Pod 调度成功的完整流程。

水平扩容(增加节点)典型流程 触发扩容 CA / HPA / 手动 节点准备 OS / Containerd / kubelet 加入集群 kubeadm join / TLS 资源注册 Node Ready / 容量上报 调度决策 kube-scheduler 预选/优选 Pod 调度到新节点 Bind / 更新 etcd 镜像拉取与启动 Containerd pull / run ⚠️ 关键说明: • 节点准备阶段需确保 Containerd 版本与集群一致,并配置好镜像仓库认证。 • 新节点加入后,kube-scheduler 会根据节点资源(CPU/Memory/Ephemeral Storage)进行调度。 • 镜像拉取是水平扩容的常见瓶颈,建议提前预热或使用 P2P 分发(如 Dragonfly)。

3.3 垂直扩容的典型场景与局限

垂直扩容通常发生在以下场景:

  • 有状态服务资源不足:数据库、缓存等组件无法通过增加副本解决性能问题,需要提升单机规格。
  • 节点硬件升级:集群中部分节点因业务增长,CPU/内存成为瓶颈,需在线或离线升级。
  • Pod 资源限制调整:修改 Deployment 的 resources.requests 和 resources.limits,触发 Pod 重建。
垂直扩容的局限性:单节点资源存在物理上限(如最大内存插槽数、CPU 核数);扩容过程通常需要节点排水(drain)或 Pod 重启,对在线服务有影响;且无法解决单点故障问题。在 Containerd 层面,垂直扩容意味着需要调整 CRI 资源分配参数(如 cpu.cfs_quota_us、memory.limit_in_bytes),并可能触发 OOM 或 CPU 节流。

3.4 扩容策略选择矩阵

在实际集群运维中,通常需要根据工作负载特征组合使用两种扩容方式。以下矩阵可辅助决策:

工作负载特征 推荐扩容方式 Containerd 调优关注点
无状态微服务(高并发、弹性) 水平扩容 镜像缓存预热、并发拉取限速
有状态数据库(单点性能瓶颈) 垂直扩容 调整 cgroup 资源上限、IO 隔离
AI 训练任务(GPU 密集型) 垂直扩容 + 少量水平 GPU 设备插件、NVIDIA Container Toolkit
批处理任务(离线、可中断) 水平扩容(弹性节点组) 快速启动、镜像复用、临时存储配置
混合负载(在线 + 离线) 水平扩容 + 节点资源超分 CPU Manager、Memory Manager、混部策略

3.5 节点扩容对 Containerd 的直接影响

无论采用哪种扩容方式,Containerd 作为节点级的容器运行时,都会受到直接影响:

  • 镜像存储:新节点加入后,Containerd 需要从镜像仓库拉取 Pod 所需的镜像,这会消耗网络带宽和磁盘 IO。建议配置 registry.mirrors 或使用本地缓存。
  • 资源隔离:垂直扩容后,Containerd 需要重新配置 cgroup 参数,确保 Pod 能使用新增资源。需检查 systemd cgroup driver 是否与 kubelet 一致。
  • 日志与监控:扩容后节点数量增加,Containerd 的日志量(如 containerd.log)和监控指标(如 container_tasks_state)会线性增长,需提前规划日志轮转与指标采集。
最佳实践:在集群扩容前,建议使用 ctr 或 crictl 工具对新节点进行预检,确认 Containerd 版本、镜像仓库连通性、cgroup 配置均与集群现有节点一致。可编写如下预检脚本:
#!/bin/bash
# 节点扩容预检脚本片段
echo "=== Containerd 版本检查 ==="
ctr version | grep Version
echo "=== cgroup 驱动检查 ==="
kubelet --version && kubelet --config /var/lib/kubelet/config.yaml 2>/dev/null | grep cgroupDriver
echo "=== 镜像仓库连通性 ==="
ctr image pull --plain-http registry.example.com/library/nginx:alpine