12

我有一个简单的 Kubernetes 部署。它由一个单一的、未复制的容器组成。没有暴露容器的服务。容器有一个健康检查,检查它是否正确配置并可以与其外部依赖项通信。我使用kubectl apply.

更新部署后,我想检查新版本是否已完全推出并通过了健康检查。我不知道如何配置我的部署来实现这一点。

我尝试了各种活性和就绪探针、部署策略和就绪/进展部署属性的组合。我试过检查部署的状态、它的 pod 和 rollout 命令。一切都无济于事。

我的印象是我应该查看部署条件以了解状态,但我找不到关于这些条件是什么或如何实现它们的清晰文档。

4

1 回答 1

15

你没有提到你的部署策略。但是我在 k8s 部署中看到的一个普遍问题是,如果应用程序无法启动,它将无限重启。因此,您可能必须kubectl delete deploy/******在检测到部署失败状态后明确说明。(也有failureThreshold探针,但我还没有尝试)。

案例重建

您可以使用 和 的progressDeadlineSeconds组合readinessProbe。假设您的应用程序需要 60 秒来启动/启动。您需要配置progressDeadlineSeconds多一点 60 秒只是在更安全的一面。现在,在运行您的 后kubectl apply -f my-deploy.yaml,运行kubectl rollout status deploy/my-deployment命令。对我来说,它看起来像这样:

12:03:37 kubectl apply -f deploy.yaml
12:03:38 deployment "my-deployment" configured
12:04:18 kubectl rollout status deploy/my-deployment
12:04:18 Waiting for rollout to finish: 0 of 1 updated replicas are available (minimum required: 1)...
12:04:44 deployment "my-deployment" successfully rolled out

一旦你执行了这个rollout命令,kubectl 会一直等到它有答案。它还返回正确的退出代码echo $?- 您可以通过编程方式检查并删除部署。

案例滚动更新

如果您有多个副本,那么上述技巧应该可以工作。如果您只有一个副本,请使用maxUnavailable: 0maxSurge: 1连同上述配置。

于 2017-06-22T13:12:59.320 回答