如何知道部署推出后 Kubernetes 服务何时准备就绪?

How to know when a Kubernetes service is ready after a deployment rollout?

我正在尝试创建部署和服务,然后在推出完成后立即访问该服务:

> kubectl create -f my-deployment.yaml
> kubectl create -f my-service.yaml
> kubectl rollout status deployment/my-deployment --watch --timeout 10m # This usually takes ~30 seconds

deployment "my-deployment" successfully rolled out

> curl "my-service" # This happens inside a pod, so the service DNS name should be available

有时这行得通,但似乎存在竞争条件——如果 curl 命令执行得太快,套接字似乎无法连接,我会遇到连接超时。

如果没有准备好 pods,这似乎是我会得到的行为,根据这个问题:

我预计推出的完成意味着该服务已准备就绪。不是这样吗?是否有一些 Kubernetes 命令 "wait" 使服务可用? (我注意到服务没有条件,所以你不能kubectl wait...)

我的回答与您的要求略有不同,但可能对您有用。 我建议使用 Helm 来改善您的部署体验。

对你有什么帮助?

Helm 有几个标志,例如 --wait,可以在更新期间应用。它将确保在继续之前已成功创建所有资源。

要知道服务是否准备就绪,您可以检查是否存在具有服务名称的端点对象,以及该端点对象是否具有 IP。如果有 IP,则意味着服务已准备就绪。但是不能保证它仍然不会失败,因为您的基础架构中可能存在网络问题。

管理 pods 等 K8s 原语,例如 Deployment,仅在决策制定时考虑 pod 状态,例如滚动更新期间的进展。

例如,在部署滚动更新期间,新的 pod 准备就绪。另一方面,由于某种原因(例如 API 机器、端点控制器、kube-proxy、iptables 或基础设施编程的缓慢),服务、网络策略和负载平衡器尚未为新 pod 做好准备.这可能会导致服务中断或后端容量损失。在极端情况下,如果滚动更新在任何新的替换 pod 实际开始服务流量之前完成,这将导致服务中断。

这里是 proposal 改进 pod 就绪性的方法,这是由上述问题引起的。