【问题标题】:How to wait for a rollout to complete in Kubernetes如何在 Kubernetes 中等待部署完成
【发布时间】:2020-11-12 22:49:31
【问题描述】:

作为我们 CI 管道的一部分,我们有一个用于许多 Web 服务的部署脚本,如下所示:

kubectl apply -f deployment1.yml
kubectl apply -f deployment2.yml

问题是管道的下一阶段有时会失败,因为服务在启动时还没有准备好。

我想在脚本中添加一行,内容如下:

Wait until all deployments are in the Ready state, or fail if more than 30 seconds has elapsed.

我认为以下方法会起作用,但不幸的是,超时标志似乎不可用:

kubectl rollout status deployment deployment1 --timeout=30s
kubectl rollout status deployment deployment2 --timeout=30s

我不想在没有超时的情况下运行“kubectl rollout status”,因为如果其中一个部署出现故障,这将导致我们的构建挂起。

【问题讨论】:

    标签: kubernetes


    【解决方案1】:

    我找到了一个行之有效的解决方案。将属性 .spec.progressDeadlineSeconds 设置为 30 之类的值(默认为 600 或 10 分钟),kubectl rollout status deployment 将等待这段时间,然后显示错误消息并以非零退出代码退出:

    $ kubectl rollout status deploy/nginx
    Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
    error: deployment "nginx" exceeded its progress deadline
    

    文档在这里:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#failed-deployment

    【讨论】:

    • 注意:它不会等到旧的 pod 被终止并且新的 pod 正在运行。因此,从技术上讲,它不会等到推出真正“完成”。
    【解决方案2】:

    kubectl 的最新版本确实支持超时选项:

    $ kubectl create -f ds-overlaytest.yml
    daemonset.apps/overlaytest created
    $ kubectl rollout status ds/overlaytest --timeout=10s
    Waiting for daemon set spec update to be observed...
    error: timed out waiting for the condition
    $
    

    查看kubectl 参考以了解如何使用此选项: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#-em-status-em-

    【讨论】:

    • 具体在哪个版本引入了超时参数?您能否指出记录此参数的位置?
    【解决方案3】:

    你可以用纯 bash 来处理这个问题,即:

    ATTEMPTS=0
    ROLLOUT_STATUS_CMD="kubectl rollout status deployment/myapp -n namespace"
    until $ROLLOUT_STATUS_CMD || [ $ATTEMPTS -eq 60 ]; do
      $ROLLOUT_STATUS_CMD
      ATTEMPTS=$((attempts + 1))
      sleep 10
    done
    

    这是在blog中指定的

    但是,我不相信有 Kubernetes 原生方式来等待部署推出,如果你想要真正花哨的话,你可以使用 HelmWebhooks 中的钩子来实现这一点

    【讨论】:

    • kubectl rollout status deployment 已经在等待了。 Op 询问他是否可以指定一个特定的等待时间而不是默认的 10 分钟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2015-04-19
    • 2016-08-31
    • 2022-08-17
    • 2013-07-13
    • 1970-01-01
    相关资源
    最近更新 更多