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调度。下图展示了从基础设施层到调度层的完整链路:
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 扩容流程中的状态同步关键点
从状态同步的角度看,节点扩容涉及三个核心状态的一致性: