如何在Kubernetes中等待发布完成

时间:2019-09-18 09:59:25

标签: kubernetes

作为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推出状态”,因为如果其中一个部署失败,这将导致我们的构建挂起。

3 个答案:

答案 0 :(得分:2)

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

$ 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

答案 1 :(得分: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-

答案 2 :(得分:0)

您可以使用纯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中的钩子来实现。 >