如何在 Kubernetes 中等待部署完成

4 kubernetes

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

kubectl apply -f deployment1.yml
kubectl apply -f deployment2.yml
Run Code Online (Sandbox Code Playgroud)

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

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

Wait until all deployments are in the Ready state, or fail if more than 30 seconds has elapsed.
Run Code Online (Sandbox Code Playgroud)

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

kubectl rollout status deployment deployment1 --timeout=30s
kubectl rollout status deployment deployment2 --timeout=30s
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ski 7

最近版本的kubectldo 支持超时选项:

$ 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
$
Run Code Online (Sandbox Code Playgroud)

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

  • timeout参数具体是在哪个版本引入的?您能指出该参数的记录位置吗? (2认同)

Ale*_*ing 6

我找到了一个效果很好的解决方案。将该属性设置.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
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:它不会等到旧 Pod 终止并且新 Pod 正在运行。因此,从技术上讲,它不会等到推出实际上“完成”。 (2认同)