在 Kubernetes 中部署时解决 5xx 错误
在 Kubernetes 中进行滚动部署时,有时会在部署过程中出现 502、503 错误。 <https://github.com/kubernetes/kubernetes/issues/96858 <https://github.com/kubernetes/kubernetes/issues/20473 <htt
目录
在 Kubernetes 中进行滚动部署时,有时会在部署过程中出现 502、503 错误。 <https://github.com/kubernetes/kubernetes/issues/96858 <https://github.com/kubernetes/kubernetes/issues/20473 <htt
目录
在 Kubernetes 中进行滚动部署时,有时会在部署过程中出现 502、503 错误。
https://github.com/kubernetes/kubernetes/issues/96858
https://github.com/kubernetes/kubernetes/issues/20473
https://github.com/foriequal0/pod-graceful-drain
关于这个问题有相关的 issue,也有人为了解决它开发了 pod-graceful-drain。
当然,我会用 sleep 来处理。
解释一下:部署新 Pod 时,旧 Pod 会进入 Terminating 状态, 即使进入了 Terminating 状态,请求仍会持续发送到正在终止的 Pod。
此时,即使请求是在 Pod 处于 Terminating 状态时到达的,Pod 也不能在请求处理过程中终止。 这就是要让 nginx 和 php-fpm sleep 的原因。
也就是说,如果 php-fpm 先被关闭,nginx 就会返回 stream 错误。 因此,php-fpm 必须始终比 nginx 更晚终止。
不过无论如何,php-fpm 和 nginx 具体何时终止,其实都不太重要。
重要的是,至少要 sleep 足够长的时间,让 AWS 网络中的 ALB、LB 完成连接摘除。
这个过程大约需要 15 秒。
也就是说,在这 15 秒内,即使 Pod 处于 Terminating 状态,仍然可能有请求到达。
所以,至少必须设置 15 秒以上的 sleep。(nginx、php-fpm)
至于之后还要额外设置多长时间的 sleep,似乎要根据服务器环境来定。
例如,如果有一个请求需要 10 秒才能完成,
那么设置为 15(网络)+ 5(余量)+ 10(最长请求时间)= 30 秒即可。
此外,terminationGracePeriodSeconds 的值必须始终大于 sleep 的时长。
如果 sleep 设置为 30 秒,那么 terminationGracePeriodSeconds 可以设置为 40 秒左右。
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- sleep 20
terminationGracePeriodSeconds: 30所以通常这样设置即可。