用的是 Azure 的 k8s ,生产环境默认 3 个 pod ,但偶尔会发生某个 pod 突然坏了。
请求到正常的 pod 就没事,如果请求到坏的 pod 就会报超时,感觉是连接数据库出问题了,但进入到 pod 手动连数据库也正常。
查看出问题的 pod 的 log ,也没什么记录。
重启 pod 之后又正常了,可能是啥情况?
1
hahastudio 2022-06-28 13:33:21 +08:00
那个坏了的 pod 里,进程里用的 sql connection 断开了没有重连?
手工连数据库应该是新开了一个 connection 吧 |
2
hetal 2022-06-28 13:50:28 +08:00
不是 pod 异常,而是 pod 里的服务异常...
|
4
Martin9 OP @hahastudio #1 用的 springboot 自带的连接池,不知道是不是连接池的问题。
|
5
novolunt 2022-06-28 14:15:55 +08:00
debug 开起来看看,有没有监控 cpu 和内存,是不是超出限制。
|
6
dayeye2006199 2022-06-28 14:17:09 +08:00
建议先配置一下 readiness probe ,先保证如果一个 pod 响应异常,至少应该不下发流量
|
7
nicholasxuu 2022-06-28 14:32:20 +08:00
pod 加 health check 了吗?
|
8
konakona 2022-06-28 15:14:07 +08:00
考虑到实效性,没能第一时间看到 Resource 的 Event ,那么就建议将主进程和关联服务的日志都 stdout ,然后由 logstage 收集。
方便你追溯问题。如果不是 restart:always ,那么异常 POD 就会保持状态,可以方便排查。 |
9
cheng6563 2022-06-28 15:28:54 +08:00
Java 服务遇到莫名“卡死”时首先看看有无 OOM 异常。
然后,加个 spring boot actuator 依赖,暴露个检查的接口 /actuator/health ,把这个接口配到 k8s 的 readiness probe 上去 |
10
wtfedc 2022-06-28 17:51:09 +08:00
ingress 和 service 的连通最好也测一下
|
11
yyttrr 2022-06-28 18:13:06 +08:00
1.加可读探针、存活探针避免请求到异常的 pod
|
12
tanghanyu 2022-06-29 09:11:20 +08:00
LiveinessProbe 和 ReadinessProbe 都配置一下吧
|
13
psydonki 2022-06-29 11:05:34 +08:00 via Android
@Martin9 感觉跟我现在遇到的问题很像…目前的想法是看能不能用 ephemeral container, 挂载到出问题的 pod 上, 再通过 netstat 看具体的连接状态。
https://kubernetes.io/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container |
14
panzhc 2022-07-03 23:12:13 +08:00
1. 这种问题一般先看看网络连接情况,对比连接池配置;再抓个堆栈,看看线程情况。
2. 应用提供健康检查接口,配置到 Deployment 上,健康检查接口如果走数据库连接(最简单的方式,不会带来很大压力),可以在数据库连接出问题时及时重启 Pod 。 |
15
Martin9 OP 不知道为什么不能 append 了,问题找到了:
是因为并发提高导致 JDBC 连接数不够,服务无响应了; 解决方式是修改了连接池的配置,提高了连接数。 |