如何在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 }
必看注意事项
- 确保AzureCLI任务已经正确关联K8s集群上下文——如果之前没配置,需要在脚本开头加上
az aks get-credentials --resource-group <你的资源组名称> --name <AKS集群名称>来获取集群访问权限 - 测试阶段可以先把
kubectl scale命令改成echo,确认过滤出来的Deployment列表完全符合预期后再执行实际操作 - 如果Deployment名称包含特殊字符,优先选择jq方案,避免grep或PowerShell的匹配规则出现异常
内容的提问来源于stack exchange,提问作者Gilberto Graham
相关产品推荐
相关产品推荐

