You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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个Pod
  • maxUnavailable=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:55:30