Concourse Kubernetes Put执行kubectl时如何仅检查目标Pod就绪状态?
解决Concourse CI自动检查所有Pod就绪状态导致部署误报失败的问题
问题场景
使用Concourse CI的put参数将Docker容器部署到Kubernetes集群时,每次执行kubectl命令后,Concourse都会自动检查videoautomationcapabilities命名空间下所有22个Pod的就绪状态,但仅关注自身部署的video-buffer-detect-app Pod(仅1个副本)。当前因其他Pod处于未就绪或崩溃状态,导致put步骤误报失败,需要取消对非目标Pod的就绪检查,仅验证目标Pod状态。
相关配置及执行日志
Concourse Pipeline配置
type: kubernetes icon: kubernetes source: insecure_skip_tls_verify: false kubeconfig: {{kubernetes-config}} - name: deploy_capability_docker_kubernetes plan: - get: bufferautomationsourcecode - get: docker_hub_details_capability_development passed: [build_deploy_hub] trigger: true - get: version - get: concoursesourcecode - task: update_deploymentfile_git file: concoursesourcecode/task/kubernetes_fileupdate_task_parameterized1.yaml params: BRANCH: "Dev" SOURCE_CODE: "bufferautomationsourcecode" - put: kubernetes-cluster-deployment params: kubectl: config current-context - put: kubernetes-cluster-deployment params: kubectl: get pods -l app=video-buffer-detect-app -n videoautomationcapabilities - put: kubernetes-cluster-deployment params: kubectl: get pods -n videoautomationcapabilities --show-labels - put: kubernetes-cluster-deployment params: kubectl: apply -f bufferautomationsourcecode/kubernetes/Dev/Deployment.yaml -n videoautomationcapabilities ensure: do: - put: kubernetes-cluster-deployment params: kubectl: wait --for=condition=Ready pod -l app=video-buffer-detect-app -n videoautomationcapabilities --timeout=300s || true ensure: do: - put: kubernetes-cluster-deployment params: kubectl: rollout status deployment/video-buffer-detect-app --timeout=300s
执行日志
+ kubectl config current-context anvil-dev-01-videoautomationcapabilities Waiting for pods to be ready for 30s (interval: 3s, selector: '') Waiting for pods to be ready... (22/22) + kubectl get pods -l app=video-buffer-detect-app -n videoautomationcapabilities NAME READY STATUS RESTARTS AGE video-buffer-detect-app-7cddd646cb-m589k 1/1 Running 0 15m Waiting for pods to be ready for 30s (interval: 3s, selector: '') Waiting for pods to be ready... (22/22) + kubectl apply -f bufferautomationsourcecode/kubernetes/Dev/Deployment.yaml -n videoautomationcapabilities deployment.apps/video-buffer-detect-app configured Waiting for pods to be ready for 30s (interval: 3s, selector: '') Waiting for pods to be ready... (22/22) + kubectl wait --for=condition=Ready pod -l app=video-buffer-detect-app -n videoautomationcapabilities --timeout=300s pod/video-buffer-detect-app-7cddd646cb-m589k condition met Waiting for pods to be ready for 30s (interval: 3s, selector: '') Waiting for pods to be ready... (22/22) To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. + kubectl rollout status deployment/video-buffer-detect-app --timeout=300s deployment "video-buffer-detect-app" successfully rolled out Waiting for pods to be ready for 30s (interval: 3s, selector: '') Waiting for pods to be ready... (22/22)
解决方案
Concourse的kubernetes资源默认会检查目标命名空间下所有Pod的就绪状态,可通过以下两种方式修改:
方式1:指定仅检查目标Pod的就绪状态
在每个put步骤的params中添加wait_for_ready_selector参数,指定目标Pod的标签选择器,让Concourse只检查匹配该标签的Pod:
修改部署步骤示例
- put: kubernetes-cluster-deployment params: kubectl: apply -f bufferautomationsourcecode/kubernetes/Dev/Deployment.yaml -n videoautomationcapabilities wait_for_ready_selector: app=video-buffer-detect-app wait_for_ready_timeout: 300s
修改查看类命令的步骤示例
对于仅执行查看命令的put步骤(如kubectl get pods),也可以添加该参数,或直接关闭自动检查:
- put: kubernetes-cluster-deployment params: kubectl: get pods -l app=video-buffer-detect-app -n videoautomationcapabilities wait_for_ready: false
方式2:完全关闭Concourse的自动就绪检查
如果希望完全通过自定义的kubectl wait和kubectl rollout status命令验证状态,可在所有put步骤中设置wait_for_ready: false,彻底禁用Concourse的自动检查逻辑:
- put: kubernetes-cluster-deployment params: kubectl: apply -f bufferautomationsourcecode/kubernetes/Dev/Deployment.yaml -n videoautomationcapabilities wait_for_ready: false
这样Concourse执行完kubectl命令后不会自动检查任何Pod的就绪状态,仅依赖你自定义的验证步骤判断部署是否成功。
内容的提问来源于stack exchange,提问作者Ramya Thiyagarajan
相关产品推荐
相关产品推荐

