1. 灾备基础:Kubernetes集群灾备概述、灾备等级与RTO/RPO目标、镜像预拉取在灾备中的角色
1.1 Kubernetes集群灾备概述
Kubernetes集群灾备是指通过一系列技术手段和策略,确保在发生区域性故障、数据中心宕机、网络分区或人为误操作时,业务工作负载能够快速恢复或持续可用。与传统的单体应用灾备不同,K8s集群的灾备需要同时考虑控制平面、etcd数据、工作负载状态、持久化存储以及镜像分发等多个维度。
核心挑战: K8s集群的分布式特性使得灾备不再是简单的“数据复制+应用拉起”,而是需要协调多个组件(etcd、API Server、Scheduler、kubelet、CNI、CSI)的状态一致性与启动顺序。
典型的K8s集群灾备场景包括:
- 同城双活/主备: 两个可用区之间延迟较低,通过DNS或全局负载均衡实现流量切换。
- 异地灾备: 跨地域(如华北-华南)部署,主集群故障后由备集群接管,通常存在分钟级RTO。
- 多云/混合云灾备: 跨云厂商或自建IDC与公有云之间的集群切换,镜像仓库和网络互通是主要瓶颈。
1.2 灾备等级与RTO/RPO目标
灾备等级决定了集群在故障后能承受的数据丢失量和恢复时间。在K8s场景下,RTO(Recovery Time Objective)和RPO(Recovery Point Objective)是衡量灾备方案有效性的核心指标。
| 灾备等级 | RTO目标 | RPO目标 | 典型方案 | 镜像预拉取需求 |
|---|---|---|---|---|
| L0 - 无灾备 | 不可控(小时~天) | 不可控 | 无 | 无 |
| L1 - 冷备 | 30分钟 ~ 2小时 | 24小时 | etcd定期备份 + 镜像仓库同步 | 低(手动触发拉取) |
| L2 - 温备 | 5 ~ 15分钟 | 1小时 | etcd近实时同步 + 镜像预拉取 | 高(必须预拉取) |
| L3 - 热备/双活 | < 1分钟 | < 5分钟 | 多集群联邦 + 实时镜像同步 + 流量分发 | 极高(持续预拉取) |
| L4 - 多云/混合云 | < 30秒 | 秒级 | Global Load Balancer + 跨云镜像复制 | 关键(跨地域预拉取) |
关键结论: 当RTO目标小于15分钟时,镜像预拉取不再是可选项,而是必须项。因为从远端镜像仓库拉取大型镜像(如AI推理镜像10GB+)在网络带宽受限时可能耗时数十分钟,直接导致RTO超标。
1.3 镜像预拉取在灾备中的角色
镜像预拉取(Image Pre-pulling)是指在灾备集群的Worker节点上,在故障发生之前就将所需容器镜像从远端仓库拉取到本地节点缓存中。在K8s Deployment的Pod启动流程中,kubelet会检查节点本地是否存在指定镜像,若不存在则从镜像仓库拉取。预拉取的核心价值在于:将拉取时间从RTO中剥离。
镜像预拉取在灾备中的具体角色包括:
- 消除镜像拉取延迟: 大型镜像(如包含CUDA库的GPU镜像)的拉取时间可能占Pod启动总时间的60%~80%。预拉取后,Pod启动仅需容器运行时初始化时间(通常<5秒)。
- 降低对镜像仓库的依赖: 灾备切换时,主集群的镜像仓库可能不可用。预拉取确保备集群节点本地已有镜像,无需依赖外部仓库。
- 支持离线灾备场景: 在断网或网络限流情况下,预拉取的本地镜像使灾备集群仍能正常拉起工作负载。
- 配合Deployment的imagePullPolicy参数: 通过设置
imagePullPolicy: IfNotPresent或Never,可以强制kubelet使用本地缓存镜像,避免灾备切换时触发不必要的远程拉取。
1.4 镜像预拉取的关键参数与灾备关联
在Kubernetes Deployment中,与镜像预拉取直接相关的参数包括:
| 参数 | 位置 | 灾备场景推荐值 | 说明 |
|---|---|---|---|
imagePullPolicy |
Pod spec.containers | IfNotPresent 或 Never |
灾备切换时禁止重新拉取,强制使用本地缓存 |
imagePullSecrets |
Pod spec | 预配置到所有Worker节点 | 确保预拉取阶段有权限访问私有仓库 |
nodeSelector / affinity |
Pod spec | 灾备节点标签匹配 | 确保Pod调度到已预拉取镜像的节点 |
terminationGracePeriodSeconds |
Pod spec | 根据业务调整(默认30s) | 灾备切换时优雅关闭旧Pod,避免数据损坏 |
initContainers |
Pod spec | 可用来做预拉取前置检查 | 在init容器中验证镜像是否已缓存 |
常见误区: 很多团队在灾备集群中仍然使用
imagePullPolicy: Always,导致灾备切换时kubelet重新拉取镜像,即使节点本地已有缓存也会触发不必要的远程请求,增加RTO。在灾备场景下,应统一使用 IfNotPresent 并配合定期的预拉取Job来更新镜像。
1.5 本章小结
本章建立了K8s集群灾备的基础认知框架:
- 灾备等级从L0到L4,RTO/RPO目标逐级收紧,镜像预拉取在L2及以上等级中成为刚性需求。
- 镜像预拉取的核心价值是将镜像拉取时间从RTO中剥离,使Pod启动时间从分钟级降至秒级。
- Deployment的
imagePullPolicy参数是灾备切换时的关键控制点,必须与预拉取策略协同配置。