并行执行Pipeline致Helm升级失败,求助排查与解决
解决Helm并行升级冲突与Pending操作排查问题
问题概述
并行运行两条Pipeline时触发Helm升级失败,核心报错:
Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress
执行helm revert时额外出现Deployment就绪异常:
ready.go:303: [debug] Deployment is not ready: com-front-dev/client-deployment. 0 out of 1 expected pods are ready
且目标Pod内未预装helm/kubectl工具,无法直接排查锁定状态。
涉及的Pipeline配置片段:
.pre-deploy: image: dtzar/helm-kubectl:latest stage: deploy tags: - k8s before_script: - | GREEN='\033[0;32m' NC='\033[0m' if kubectl get ns "$NAMESPACE"; then echo -e "${GREEN}namespace for project already exists${NC}" else echo -e "${GREEN}creating namespace for project${NC}" kubectl create namespace "$NAMESPACE" echo fi - *kubectl_secret_fallback - wget https://github.com/a8m/envsubst/releases/download/v1.4.2/envsubst-Linux-x86_64 - chmod +x envsubst-Linux-x86_64 - mv envsubst-Linux-x86_64 /bin/envsubst script: - envsubst < ${CHART_PATH}/values.${ENVIRONMENT}.yaml > ${CHART_PATH}/values_deploy.${ENVIRONMENT}.yaml - helm upgrade -n ${NAMESPACE} ${PROJECT_NAME} ${CHART_PATH} --install --atomic -f ${CHART_PATH}/values_deploy.${ENVIRONMENT}.yaml --debug
排查与解决步骤
1. 识别Pending的Helm操作
Helm v3通过命名空间内的ConfigMap存储Release状态,直接用Kubernetes命令排查:
- 定位目标Release对应的ConfigMap:
kubectl get configmaps -n ${NAMESPACE} -l "owner=helm,name=${PROJECT_NAME}" - 查看ConfigMap的状态字段,确认是否存在未完成的操作:
重点检查kubectl get configmap <configmap-name> -n ${NAMESPACE} -o yamldata.status中的operation字段,若值为upgrade/rollback且长时间未变更,说明操作处于锁定状态。
2. 手动解除Helm操作锁定
确认锁定后,通过修改ConfigMap清除锁定状态:
kubectl patch configmap <configmap-name> -n ${NAMESPACE} --type merge -p '{"data":{"status":"{\"operation\":null}"}}'
注意:操作前务必备份ConfigMap内容,避免误修改导致Release状态损坏。
3. 修复Deployment未就绪问题
针对回滚时的Pod就绪失败,先排查根因:
- 查看Pod日志定位启动错误:
kubectl logs -n ${NAMESPACE} <pod-name> - 检查Pod事件,排查镜像拉取、资源分配或探针配置问题:
常见问题包括镜像地址错误、节点资源不足、存活探针配置不合理,修复后再执行回滚或升级。kubectl describe pod -n ${NAMESPACE} <pod-name>
4. 避免后续并行冲突
修改Pipeline配置,添加串行执行限制(以GitLab CI为例):
.pre-deploy: image: dtzar/helm-kubectl:latest stage: deploy tags: - k8s resource_group: ${ENVIRONMENT}-${PROJECT_NAME} # 新增资源组,确保同一环境的部署串行执行 before_script: # 保留原before_script内容 script: # 保留原script内容
验证操作
完成上述步骤后,重新执行Helm升级命令确认恢复:
helm upgrade -n ${NAMESPACE} ${PROJECT_NAME} ${CHART_PATH} --install --atomic -f ${CHART_PATH}/values_deploy.${ENVIRONMENT}.yaml --debug
内容的提问来源于stack exchange,提问作者Winter Wind
相关产品推荐
相关产品推荐

