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

如何在Azure Pipeline的AzureCLI任务中排除指定Deployment执行缩容/扩容

解决Azure Pipeline中Kubernetes Deployment批量扩缩容并排除特定名称的方案

我之前在项目里刚好遇到过这个需求,踩了几个坑之后终于找到靠谱的实现方式,给你分享几个能直接在Azure Pipeline的AzureCLI任务里用的方案:

方案一:Bash脚本结合kubectl+grep过滤(适合Linux代理)

这个方案利用kubectl的jsonpath输出所有Deployment名称,再通过grep排除包含指定字符串的对象,最后循环执行扩缩容命令,逻辑简单直接。

直接贴Azure Pipeline任务的配置示例:

- task: AzureCLI@2
  displayName: '批量扩缩容Deployment(排除含randomname的实例)'
  inputs:
    azureSubscription: '你的Azure订阅名称'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # 配置参数,根据你的实际情况修改
      NAMESPACE="your-target-namespace"
      TARGET_REPLICAS=0  # 缩容到0填0,扩容填对应数量
      EXCLUDE_KEYWORD="randomname"

      # 获取所有不包含排除关键词的Deployment名称
      DEPLOY_LIST=$(kubectl get deployments -n $NAMESPACE -o jsonpath='{.items[*].metadata.name}' | tr ' ' '\n' | grep -v "$EXCLUDE_KEYWORD")

      # 循环处理每个符合条件的Deployment
      for DEPLOY in $DEPLOY_LIST; do
        echo "开始调整Deployment [$DEPLOY] 的副本数为 $TARGET_REPLICAS"
        kubectl scale deployment $DEPLOY -n $NAMESPACE --replicas=$TARGET_REPLICAS
      done

关键细节说明:

  • jsonpath='{.items[*].metadata.name}':从kubectl的输出中只提取Deployment的名称字段,减少不必要的数据处理
  • tr ' ' '\n':把空格分隔的名称转换成换行格式,方便grep做行级匹配
  • grep -v "$EXCLUDE_KEYWORD":反向匹配,排除所有名称包含指定关键词的Deployment

方案二:用jq做更灵活的过滤(适合复杂场景)

如果你的排除规则更复杂(比如要排除多个关键词、匹配特定前缀/后缀),可以用jq来解析kubectl的JSON输出,过滤逻辑会更清晰可控:

只需要修改inlineScript里的获取列表部分即可:

# 用jq过滤排除指定关键词的Deployment
DEPLOY_LIST=$(kubectl get deployments -n $NAMESPACE -o json | jq -r '.items[] | select(.metadata.name | contains("'$EXCLUDE_KEYWORD'") | not) | .metadata.name')

# 后续循环扩缩容的代码和方案一完全一致

扩展:排除多个关键词的写法

如果需要同时排除randomname和test-deploy,只要调整jq的select表达式:

DEPLOY_LIST=$(kubectl get deployments -n $NAMESPACE -o json | jq -r '.items[] | select(.metadata.name | contains("randomname") | not) | select(.metadata.name | contains("test-deploy") | not) | .metadata.name')

方案三:PowerShell版本(适合Windows代理)

如果你的Azure Pipeline用的是Windows代理,把脚本类型改成PowerShell,对应的命令调整如下:

- task: AzureCLI@2
  displayName: '批量扩缩容Deployment(排除含randomname的实例)'
  inputs:
    azureSubscription: '你的Azure订阅名称'
    scriptType: 'ps'
    scriptLocation: 'inlineScript'
    inlineScript: |
      $namespace = "your-target-namespace"
      $targetReplicas = 0
      $excludeKeyword = "randomname"

      # 获取所有Deployment名称并过滤
      $deployList = kubectl get deployments -n $namespace -o jsonpath='{.items[*].metadata.name}' -split ' ' | Where-Object { $_ -notlike "*$excludeKeyword*" }

      # 循环调整副本数
      foreach ($deploy in $deployList) {
        Write-Host "开始调整Deployment [$deploy] 的副本数为 $targetReplicas"
        kubectl scale deployment $deploy -n $namespace --replicas=$targetReplicas
      }

必看注意事项

  1. 确保AzureCLI任务已经正确关联K8s集群上下文——如果之前没配置,需要在脚本开头加上az aks get-credentials --resource-group <你的资源组名称> --name <AKS集群名称>来获取集群访问权限
  2. 测试阶段可以先把kubectl scale命令改成echo,确认过滤出来的Deployment列表完全符合预期后再执行实际操作
  3. 如果Deployment名称包含特殊字符,优先选择jq方案,避免grep或PowerShell的匹配规则出现异常

内容的提问来源于stack exchange,提问作者Gilberto Graham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:50:29