3、Kubernetes节点扩容概述:节点扩容的触发条件、扩容流程、扩容中的常见问题

节点扩容是集群应对业务流量增长或资源不足时的核心运维操作。在Kubernetes与Containerd的组合架构下,节点扩容不仅仅是“加一台机器”,而是涉及节点注册、kubelet启动、Pod调度与容器运行时初始化的完整链路。理解触发条件与流程细节,是设计状态同步与回滚机制的前提。

3.1 节点扩容的触发条件

节点扩容通常由以下三类场景触发,每类场景对扩容速度与一致性要求不同:

触发类型 典型场景 扩容特征
资源驱动 集群CPU/内存平均利用率超过阈值(如80%),或节点剩余可调度Pod数不足 批量扩容,通常由Cluster Autoscaler触发,要求快速上线
时间驱动 预定的业务高峰窗口(如电商大促、月末结算) 计划性扩容,可提前准备,对回滚预案要求高
故障驱动 节点宕机、网络分区或Containerd异常导致节点NotReady 紧急扩容,需快速替换故障节点,同时避免数据不一致
关键指标:在资源驱动场景中,Cluster Autoscaler 通常依赖 Pending Pod 数量作为扩容信号。当 Pod 因资源不足无法调度超过 30 秒时,触发扩容请求。

3.2 节点扩容核心流程

一个完整的节点扩容流程包含三个阶段:节点注册、kubelet启动与Containerd初始化、Pod调度。下图展示了从基础设施层到调度层的完整链路:

Kubernetes节点扩容核心流程 节点扩容核心流程(三个阶段) 阶段一:节点注册 1. 基础设施层创建VM/物理机 2. 节点初始化(网络、存储、OS) 3. 节点加入集群(kubeadm join) 阶段二:kubelet启动与Containerd初始化 4. kubelet启动,读取节点配置 5. kubelet连接Containerd(CRI接口) 6. 节点状态上报(NodeReady) 阶段三:Pod调度 7. Scheduler调度Pod 8. kubelet创建Pod 9. Containerd拉取镜像并运行 说明:三个阶段串行执行,前一个阶段未完成则后一个阶段无法开始。 回滚设计需覆盖每个阶段的失败点,确保集群状态一致性。

3.2.1 节点注册阶段

节点注册是扩容的起点,主要完成基础设施层面的准备:

  • 基础设施创建:云平台或裸金属管理工具创建虚拟机或物理机,分配IP地址、挂载存储、配置网络。
  • 节点初始化:安装操作系统依赖、配置内核参数(如 net.bridge.bridge-nf-call-iptables=1)、安装Containerd与kubelet二进制文件。
  • 集群加入:执行 kubeadm join 或通过节点引导向API Server发起注册请求,生成Node对象。

3.2.2 kubelet启动与Containerd初始化阶段

此阶段是节点扩容的关键质量节点,直接影响后续Pod调度:

  • kubelet启动:kubelet读取本地配置文件(/var/lib/kubelet/config.yaml),向API Server注册自身信息(节点IP、资源容量、标签)。
  • CRI接口连接:kubelet通过CRI(Container Runtime Interface)连接Containerd,验证Containerd的gRPC端点是否可用。若Containerd未启动或版本不兼容,kubelet将无法进入Ready状态。
  • 节点状态上报:kubelet周期性上报节点状态,包括 NodeReady、NodeDiskPressure、NodeMemoryPressure 等条件。只有 NodeReady 为 True 时,Scheduler才会将Pod调度到该节点。
Containerd关键检查项:在kubelet启动前,建议手动验证Containerd运行状态:
# 检查Containerd服务状态
systemctl status containerd

# 验证CRI插件是否正常
crictl info

# 检查Containerd版本与kubelet兼容性
containerd --version

3.2.3 Pod调度阶段

当节点状态变为 Ready 后,Scheduler开始将Pending Pod调度到新节点:

  • 调度决策:Scheduler根据节点资源(CPU、内存、存储)、污点容忍、节点亲和性等策略,将Pod绑定到新节点。
  • Pod创建:kubelet监听到Pod绑定事件后,调用CRI接口请求Containerd创建Pod沙箱(Sandbox)和业务容器。
  • 镜像拉取与运行:Containerd根据镜像名称从镜像仓库拉取镜像,创建容器并启动进程。此阶段可能因镜像拉取超时、磁盘空间不足而失败。

3.3 扩容中的常见问题

根据生产环境经验,节点扩容过程中最常遇到的问题集中在以下五个方面:

问题类别 具体表现 根因分析 影响范围
节点注册失败 kubeadm join超时,Node对象未创建 过期、API Server不可达、证书不匹配 节点无法加入集群,扩容失败
Containerd未就绪 kubelet报错 "failed to get runtime" Containerd服务未启动、CRI插件未启用、版本不兼容 节点状态NotReady,Pod无法调度
节点状态NotReady 节点长时间处于NotReady状态 网络插件(CNI)未部署、kubelet心跳上报失败、磁盘压力 节点不可用,Pod无法运行
Pod调度失败 Pod一直Pending 节点资源不足、污点未容忍、镜像拉取失败 业务无法扩容,影响SLA
镜像拉取超时 Pod状态ImagePullBackOff 镜像仓库限流、网络带宽不足、磁盘空间不足 容器无法启动,业务中断
常见误区:很多运维人员认为节点状态变为 Ready 后扩容就成功了。实际上,Pod调度与容器运行阶段才是业务真正可用的标志。在设计回滚流程时,必须将“Pod是否成功运行”作为扩容完成的最终判定条件,而非仅依赖节点状态。

3.4 扩容流程中的状态同步关键点

从状态同步的角度看,节点扩容涉及三个核心状态的一致性:

节点扩容状态同步三角 节点扩容状态同步三角 API Server 状态 kubelet 本地状态 Containerd 运行时状态 状态同步要求:API Server记录的Node状态 = kubelet上报的状态 = Containerd实际运行状态 任何一方的状态不一致,都可能导致Pod调度异常或数据不一致