K8S 如何优雅滚动发布 Java 应用,每次重新发布都会出现超时跟 502

2021-07-28 16:37:51 +08:00
 0576coder

目前公司正在全面上 k8s 。作为一个算是边缘部门,所以就被当做第二批小白鼠强行迁移了 k8s 。

目前项目重新发布的时候业务方请求我 http 接口的时候会出现 connect timeout 或者直接 response 502 了

java 应用是单机的 spring boot 目前线上 3 节点,应用内部也实现了优雅停机相关代码。

因为线上的 k8s 对我来说就是个黑盒,我也不知道运维怎么配置的。听运维说,公司 go 那边的项目是因为服务化了,每次下线 pod 前会通知网关来下掉这个节点。所以 go 的服务没出现我这边的情况。

我那边的线路直接就是内网域名解析到 ingress 然后 ingress 负载到后面 services services 后面就是我 java 应用 3 个 pod 节点了。

有没有遇到过类似问题的小伙伴,求你们的最佳实践

3009 次点击
所在节点    程序员
16 条回复
qq850482461
2021-07-28 16:48:38 +08:00
问下运维有没有配置 readinessProbe,我认为你这个问题是 Pod 启动成功了,但是 java 应用还没有启动完毕,流量通过 ingress 就进入了你新发布的 Pod 中,所以访问 502
yongle1117
2021-07-28 16:52:14 +08:00
首先在 Spring boot 中配置优雅关闭,然后 K8S 的 readinessProbe 要配置的,K8S 的 deployment 的配置最好在关闭前让 pod 休眠一定的时间,让 pod 里的应用好处理完当前已经进来的请求
arischow
2021-07-28 16:53:58 +08:00
很有可能是像 1 楼说的情况。
0576coder
2021-07-28 16:54:11 +08:00
@qq850482461
这个有健康检查 有个接口 运维会先访问该接口 我可以找运维确认下- -
0576coder
2021-07-28 16:55:37 +08:00
@yongle1117 感谢老哥 我问下运维
baiyi
2021-07-28 16:56:05 +08:00
看起来你的问题在于 Pod 启动后程序还没有成功跑起来,如果是这样的话可以加个就绪探测器试试
jeffh
2021-07-28 16:57:37 +08:00
应该是 pod 启动后内部的 java 程序还没启动,配置健康检查就可以了
wiken
2021-07-28 17:38:01 +08:00
探针了解下
Heroininu
2021-07-28 17:43:15 +08:00
echo1937
2021-07-28 17:44:51 +08:00
cyaki
2021-07-29 08:19:14 +08:00
光配置了探针还不够,还需要配置 prestop hook,让睡个几秒
eudore
2021-07-29 09:43:50 +08:00
健康检查没做
gscoder
2021-07-29 10:21:57 +08:00
就绪检查+健康检查+滚动发布 k8s 支持的。 你们运维有点菜,应该就是只是部署了,但什么都不懂
eric96
2021-07-29 10:48:34 +08:00
健康检查没做,pod 启动了但是 java 程序还没完全起来导致的(自己写的启动生命周期,包括各种服务注册,初始化数据,注册端口等)
如果有检查点,价格健康检查的探针。再不济,直接规定最小的启动等待时间就行了
0576coder
2021-07-29 10:56:13 +08:00
各位老哥 我来汇报一下后续情况


发布的时候出现超时跟 502 其实是有两个原因的

* 最初的时候运维下掉 pod 的时候没做优雅停机,导致部分留在老节点里的请求没处理完就退出了

* 后面重新发布的时候还是有几条超时,其实问题的主要原因是在新拉起的节点上,因为我那边用了挺多东西的,而且我提供给运维健康检查的接口其实就是自己手动写了个 /health 接口,其实这时候 jar 包刚被拉起,很多东西刚初始化,所以它起来了,但是它还没完全就绪,所以我准备用 9 楼老哥提供的官方文档的方法 重新配一个健康检查的接口

感谢各位老哥
NUT
2021-07-30 09:11:00 +08:00
@qq850482461 #1 这个老哥正解。 用 readiness +liveness 就行。无缝滚动更新。我们 java 服务启动就得 3 分钟。 这过程太酸爽了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/792313

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX