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=15m3. 恢复服务或回退#
通过受保护内部入口验证读写、幂等、消息消费、依赖连接;先开放少量业务再解除维护。恢复 HPA/KEDA/GitOps 前提交新的镜像和 strategy,防止旧 Git 覆盖。
若 schema 仍兼容旧版:再次停止新进程、确认退出、set image 回 $old_image 后恢复副本。若 schema 不兼容:保持维护,从快照恢复到隔离实例并验证,再切连接并启动旧版;明确快照后的数据重放/丢失范围。rollout undo 不恢复数据。
验收:真实测量停机和恢复时间,确认重复启动被锁阻止、备份可用。PDB 不阻止 Deployment 自身更新/主动缩容,不能作为停机保护。
参考:Deployment 策略。