如何在K8s中暂停Deployment?Helm滚动升级时如何按需暂停至两旧两新Pod
实现Deployment滚动升级暂停与指定状态停留
一、将Helm升级后的滚动暂停在2旧2新状态
要实现这个测试场景,核心是调整Deployment的滚动更新策略,引导升级过程进入2旧2新的Pod状态后,及时暂停滚动。
步骤1:调整Deployment滚动更新策略
默认滚动策略(maxSurge=25%、maxUnavailable=25%)无法直接触发目标状态,需要修改参数:
kubectl patch deployment <你的Deployment名称> -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":2,"maxUnavailable":2}}}}'
maxSurge=2:允许升级过程中最多新增2个PodmaxUnavailable=2:允许升级过程中最多有2个Pod不可用
该配置下,K8s会先删除2个旧Pod,再创建2个新Pod,当新Pod就绪后,集群会进入2旧2新的状态(总Pod数保持4个)。
步骤2:执行Helm升级(不等待完成)
添加--wait=false让Helm不等待升级完成,方便手动/脚本干预:
helm upgrade <你的Release名称> <Chart路径> --wait=false
步骤3:监控并暂停滚动
手动方式
执行kubectl get pods实时查看Pod状态,当确认2个新Pod(可通过镜像标签、创建时间区分)和2个旧Pod存在时,立即执行暂停命令:
kubectl rollout pause deployment <你的Deployment名称>
自动化脚本示例
如果需要重复测试,可使用脚本自动监控并触发暂停:
#!/bin/bash # 替换为你的实际参数 DEPLOYMENT_NAME="demo-deployment" RELEASE_NAME="demo-release" CHART_PATH="./demo-chart" OLD_IMAGE="old-image:v1" NEW_IMAGE="new-image:v2" # 调整滚动策略 kubectl patch deployment $DEPLOYMENT_NAME -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":2,"maxUnavailable":2}}}}' # 启动Helm升级 helm upgrade $RELEASE_NAME $CHART_PATH --wait=false # 循环监控Pod状态 while true; do # 统计旧Pod数量 OLD_COUNT=$(kubectl get pods -l app=$DEPLOYMENT_NAME -o jsonpath='{.items[?(@.spec.containers[0].image=="'"$OLD_IMAGE"'")].metadata.name}' | wc -w) # 统计新Pod数量 NEW_COUNT=$(kubectl get pods -l app=$DEPLOYMENT_NAME -o jsonpath='{.items[?(@.spec.containers[0].image=="'"$NEW_IMAGE"'")].metadata.name}' | wc -w) echo "当前状态:旧Pod $OLD_COUNT 个,新Pod $NEW_COUNT 个" if [ $OLD_COUNT -eq 2 ] && [ $NEW_COUNT -eq 2 ]; then echo "已到达目标状态,暂停滚动升级..." kubectl rollout pause deployment $DEPLOYMENT_NAME break fi sleep 2 done
二、K8s中暂停Deployment的通用方法
1. 暂停滚动更新
最常用的方式是使用rollout pause命令:
kubectl rollout pause deployment <你的Deployment名称>
执行后,Deployment会停止当前滚动更新,且后续的配置/镜像修改不会触发新的滚动,直到恢复。
2. 通过Patch修改字段暂停
也可以直接设置Deployment的spec.paused字段为true:
kubectl patch deployment <你的Deployment名称> -p '{"spec":{"paused":true}}'
3. 恢复滚动更新
要继续之前的滚动或允许新的更新,执行以下任一命令:
# 方式1:用rollout resume kubectl rollout resume deployment <你的Deployment名称> # 方式2:修改paused字段为false kubectl patch deployment <你的Deployment名称> -p '{"spec":{"paused":false}}'
4. 查看滚动状态
监控滚动进度或确认暂停状态:
kubectl rollout status deployment <你的Deployment名称>
内容的提问来源于stack exchange,提问作者Starbucks Admin
相关产品推荐
相关产品推荐

