【发布时间】:2020-02-06 21:18:02
【问题描述】:
我有一个应用程序在负载均衡器后面的三个 pod 上运行,所有这些都使用 Kubernetes 设置。我的问题是,当我关闭或更新 Pod 时,这会在负载均衡器注意到 Pod 不可用并停止向其发送流量之前导致几个 503 秒。有什么方法可以直接通知负载均衡器它应该停止向 Pod 发送流量?所以我们可以避免 pod update 的 503s
【问题讨论】:
我有一个应用程序在负载均衡器后面的三个 pod 上运行,所有这些都使用 Kubernetes 设置。我的问题是,当我关闭或更新 Pod 时,这会在负载均衡器注意到 Pod 不可用并停止向其发送流量之前导致几个 503 秒。有什么方法可以直接通知负载均衡器它应该停止向 Pod 发送流量?所以我们可以避免 pod update 的 503s
【问题讨论】:
您需要记住,如果 pod 关闭,负载均衡器仍会将流量重定向到指定的服务端口,并且没有 pod 为这些端口提供服务。
因此,您应该在 kubernetes 中使用滚动更新机制,这可以使部署的停机时间为零。 link
【讨论】:
由于负载均衡器后面运行了 3 个 pod,我相信您必须使用 Deployment/Statefulset 来管理它们。
如果更新 pod 是指更新 pod 中运行的 docker 镜像版本,那么您可以使用 Update strategies in Deployment 进行滚动更新。这将以零停机时间更新您的 pod。
此外,您还可以使用 startup, readiness and liveness probe 仅在 Pod 准备好/上线以提供流量时将流量引导到 Pod。
【讨论】:
pre-stop 钩子,并在实际发送 TERM 信号或删除 pod 之前等待宽限期秒(默认 30 秒)。在您的情况下,您需要编写一个 pre-stop 挂钩,它将停止接受任何新的传入连接后为当前连接提供服务。希望这会有所帮助
您应该为 pod 实现探针。阅读Configure Liveness, Readiness and Startup Probes。
【讨论】:
您可以使用readinessProbe 和LivenessProbes。在您的情况下,我认为您可以使用 readinessProbe,只有当您的 readinessProbe 通过时,kubernetes 才会开始向您的 Pod 发送流量。
例如
apiVersion: v1
Kind: Pod
metadata:
name: my-nginx-pod
spec:
containers:
- name: my-web-server
image: nginx
readinessProbe:
httpGet:
path: /login
port: 3000
在上面这个例子中,nginx Pod 只会在它通过 readinessProbe 的情况下接收流量。
你可以在这里找到更多关于探针的信息https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
【讨论】: