目前公司正在全面上 k8s 。作为一个算是边缘部门,所以就被当做第二批小白鼠强行迁移了 k8s 。
目前项目重新发布的时候业务方请求我 http 接口的时候会出现 connect timeout 或者直接 response 502 了
java 应用是单机的 spring boot 目前线上 3 节点,应用内部也实现了优雅停机相关代码。
因为线上的 k8s 对我来说就是个黑盒,我也不知道运维怎么配置的。听运维说,公司 go 那边的项目是因为服务化了,每次下线 pod 前会通知网关来下掉这个节点。所以 go 的服务没出现我这边的情况。
我那边的线路直接就是内网域名解析到 ingress 然后 ingress 负载到后面 services services 后面就是我 java 应用 3 个 pod 节点了。
有没有遇到过类似问题的小伙伴,求你们的最佳实践
1
qq850482461 2021-07-28 16:48:38 +08:00
问下运维有没有配置 readinessProbe,我认为你这个问题是 Pod 启动成功了,但是 java 应用还没有启动完毕,流量通过 ingress 就进入了你新发布的 Pod 中,所以访问 502
|
2
yongle1117 2021-07-28 16:52:14 +08:00
首先在 Spring boot 中配置优雅关闭,然后 K8S 的 readinessProbe 要配置的,K8S 的 deployment 的配置最好在关闭前让 pod 休眠一定的时间,让 pod 里的应用好处理完当前已经进来的请求
|
3
arischow 2021-07-28 16:53:58 +08:00
很有可能是像 1 楼说的情况。
|
4
0576coder OP @qq850482461
这个有健康检查 有个接口 运维会先访问该接口 我可以找运维确认下- - |
5
0576coder OP @yongle1117 感谢老哥 我问下运维
|
6
baiyi 2021-07-28 16:56:05 +08:00
看起来你的问题在于 Pod 启动后程序还没有成功跑起来,如果是这样的话可以加个就绪探测器试试
|
7
jeffh 2021-07-28 16:57:37 +08:00
应该是 pod 启动后内部的 java 程序还没启动,配置健康检查就可以了
|
8
wiken 2021-07-28 17:38:01 +08:00
探针了解下
|
9
Heroininu 2021-07-28 17:43:15 +08:00
|
11
cyaki 2021-07-29 08:19:14 +08:00 via Android
光配置了探针还不够,还需要配置 prestop hook,让睡个几秒
|
12
eudore 2021-07-29 09:43:50 +08:00
健康检查没做
|
13
gscoder 2021-07-29 10:21:57 +08:00
就绪检查+健康检查+滚动发布 k8s 支持的。 你们运维有点菜,应该就是只是部署了,但什么都不懂
|
14
eric96 2021-07-29 10:48:34 +08:00
健康检查没做,pod 启动了但是 java 程序还没完全起来导致的(自己写的启动生命周期,包括各种服务注册,初始化数据,注册端口等)
如果有检查点,价格健康检查的探针。再不济,直接规定最小的启动等待时间就行了 |
15
0576coder OP 各位老哥 我来汇报一下后续情况
发布的时候出现超时跟 502 其实是有两个原因的 * 最初的时候运维下掉 pod 的时候没做优雅停机,导致部分留在老节点里的请求没处理完就退出了 * 后面重新发布的时候还是有几条超时,其实问题的主要原因是在新拉起的节点上,因为我那边用了挺多东西的,而且我提供给运维健康检查的接口其实就是自己手动写了个 /health 接口,其实这时候 jar 包刚被拉起,很多东西刚初始化,所以它起来了,但是它还没完全就绪,所以我准备用 9 楼老哥提供的官方文档的方法 重新配一个健康检查的接口 感谢各位老哥 |
16
NUT 2021-07-30 09:11:00 +08:00
@qq850482461 #1 这个老哥正解。 用 readiness +liveness 就行。无缝滚动更新。我们 java 服务启动就得 3 分钟。 这过程太酸爽了。
|