Recreate 与维护窗口发布

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
GitOps GitOps 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式
HPA Horizontal Pod Autoscaler Pod 水平自动扩缩容器
ID Identifier 标识符
KEDA Kubernetes Event-driven Autoscaling Kubernetes 事件驱动自动扩缩容
PDB Pod Disruption Budget Pod 中断预算,约束自愿驱逐
RPO Recovery Point Objective 恢复点目标,可接受的数据丢失时间范围
RTO Recovery Time Objective 恢复时间目标,可接受的恢复耗时
RWO ReadWriteOnce 卷访问模式:由一个节点以读写方式挂载

场景:旧新进程不能共存、存在单写者或独占设备。此路径接受明确停机;RWO 卷本身不等于应用必须 Recreate。前置备份已实际恢复演练,明确 RTO/RPO、最后回退时间及不可逆操作。

1. 冻结入口与写入#

在预生产演练窗口通知上下游;网关进入维护模式、暂停定时任务和消费者,应用确认 in-flight=0、队列安全积压、数据库无写入会话。记录副本数和旧镜像:

set -euo pipefail
kubectl -n orders get deployment orders-api -o json > before-recreate.json
old_image=$(jq -r '.spec.template.spec.containers[]|select(.name=="api")|.image' before-recreate.json)
replicas=$(jq -r '.spec.replicas' before-recreate.json)

暂停该工作负载 GitOps 自动同步/HPA/KEDA,记录其配置;否则缩容会被恢复。先停止写入再取一致性快照,保存快照 ID 与恢复验证记录。

2. 确认旧进程退出后更新#

kubectl -n orders scale deployment/orders-api --replicas=0
kubectl -n orders wait --for=delete pod -l app=orders-api --timeout=10m
kubectl -n orders patch deployment orders-api --type=merge -p '{"spec":{"strategy":{"type":"Recreate","rollingUpdate":null}}}'
export NEW_IMAGE='REPLACE_APPROVED_IMAGE_AT_DIGEST'
kubectl -n orders set image deployment/orders-api "api=$NEW_IMAGE"

确认卷已卸载、外部锁已释放;禁止强删卡住 Pod 后立即启动第二个写者。按经过审查的迁移 Job 执行数据库升级,检查退出码、schema version 和数据校验;破坏性迁移需停在已约定的不可回退关口确认备份可恢复。

kubectl -n orders scale deployment/orders-api --replicas="$replicas"
kubectl -n orders rollout status deployment/orders-api --timeout=15m

3. 恢复服务或回退#

通过受保护内部入口验证读写、幂等、消息消费、依赖连接;先开放少量业务再解除维护。恢复 HPA/KEDA/GitOps 前提交新的镜像和 strategy,防止旧 Git 覆盖。

若 schema 仍兼容旧版:再次停止新进程、确认退出、set image 回 $old_image 后恢复副本。若 schema 不兼容:保持维护,从快照恢复到隔离实例并验证,再切连接并启动旧版;明确快照后的数据重放/丢失范围。rollout undo 不恢复数据。

验收:真实测量停机和恢复时间,确认重复启动被锁阻止、备份可用。PDB 不阻止 Deployment 自身更新/主动缩容,不能作为停机保护。

参考:Deployment 策略。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭