外部 nginx->ingress->service->pod
dockerfile 启动 catalina.sh 就不会生成 catalina.out 问题
所以第一版的 dockerfile 是这样的
第一版会存在可能 tomcat 进程挂了,但是容器没有挂导致流量会正常过来,导致用户访问返回 nginx 502 错误
sh /usr/local/tomcat/bin/startup.sh tee /opt/health.sh <<-'EOF' while true do if test $( ps -aux | grep java | grep tomcat | wc -l ) -eq 0 then ps -aux | grep catalina.out | grep -v grep | awk '{print$2}' | xargs kill -9 fi done EOF sh /opt/health.sh & tail -f /usr/local/tomcat/logs/catalina.out
第二版做了改进,增加了一个脚本去进行健康检查(如果 tomcat 进程挂了就结束 tail 进程)
sh /usr/local/tomcat/bin/startup.sh tee /opt/health.sh <<-'EOF' while true do if test $( ps -aux | grep java | grep tomcat | wc -l ) -eq 0 then ps -aux | grep catalina.out | grep -v grep | awk '{print$2}' | xargs kill -9 fi done EOF sh /opt/health.sh & tail -f /usr/local/tomcat/logs/catalina.out
第二版暂时没发现什么问题,不晓得还有没有其他更简便的方式?
我有写探针
readinessProbe: httpGet: path: /clogin.do port: 8080 initialDelaySeconds: 60 timeoutSeconds: 30 livenessProbe: httpGet: path: /clogin.do port: 8080 initialDelaySeconds: 60 timeoutSeconds: 45 periodSeconds: 90
![]() | 1 defunct9 2021-10-18 16:01:33 +08:00 ![]() catalina.sh run |
![]() | 4 liuhan907 2021-10-18 16:17:08 +08:00 你都 k8s 了,直接挂一个探针不就行了? |
8 davinci 2021-10-18 16:51:45 +08:00 完全可以把你的检测脚本做成一个自定义探针,让 kubelet 去执行 |
![]() | 9 dier 2021-10-18 17:00:11 +08:00 #4 你要是多看一下官方关于“存活、就绪和启动”的探针配置说明就不会有这样的想法了 |
![]() | 10 defunct9 2021-10-18 17:08:02 +08:00 @dunhanson 你的理解有误吧。容器就是一个不会掉下去的进程,你把 tomcat 扔到后台,还生成 catalina.out 日志文件。浪费感情啊,tomcat 跑前台,标准输出就是 catalina.out 的内容。符合实践啊。还再造个脚本探测,不若你 tomcat 加一个 ok.jsp ,从外部 probe 不是更好? |
12 salmon5 2021-10-18 19:50:24 +08:00 /usr/local/tomcat/bin/catalina.sh run >> /usr/local/tomcat/logs/catalina.out 2>&1 |
![]() | 13 liuxu 2021-10-18 20:00:32 +08:00 ![]() 1 楼和 10 楼是正解,容器就是应该运行一个前端进程,而不是 daemon 方式 存活 k8s 有 livenessProbe 参数 你目前就是典型的常规物理机运维方式迁移到 k8s 的不适应阶段,不仅是运维方式,还有好些程序 /语言 runtime 的配置参数都应该调整,k8s 还是有很多和常规运维有差异的地方,我一直在想着专门为这个写一个专题 |
![]() | 16 dunhanson OP @salmon5 就是按原来的方式启动 startup.sh ,会生成 catalina.out 文件,也会按日期进行切割 |
![]() | 18 dunhanson OP 抱歉各位,下午有事,没能及时回复 |
19 salmon5 2021-10-18 21:51:32 +08:00 用 springboot 吧,tomcat war 包老掉牙了 |
![]() | 21 liuhan907 2021-10-18 22:22:14 +08:00 @dunhanson 你的探针效果很差的原因是你把间隔和超时时间设置的太长了。我设置探针一般一秒一次,超时 1s,五次就算挂了。 |
![]() | 23 liuhan907 2021-10-19 13:15:49 +08:00 @dunhanson 负载高到已经能让 health check 接口都超时了,说明你的容量已经不够了,该加机器了,而不是拉大延迟。 |
![]() | 24 dunhanson OP 探针会有延迟的,就算设置每次 1 秒,失败 1,超时 1s 。 经过测试,好几秒后容器才会重启 直接自己脚本编写 do while,可以马上检测到 tomcat 进程不存在,然后 kill 掉 tail 进程,容器直接重启 |
![]() | 27 liuhan907 2021-10-19 15:27:06 +08:00 @dunhanson 本来上了 k8s 之后你想立即就检测错误是很难的。另外健康检查接口不应该使用业务接口,另外写一个接口来做才是正确的模式。 |
28 salmon5 2021-10-19 15:29:47 +08:00 |
29 salmon5 2021-10-19 15:31:19 +08:00 readinessprobe 和 livenessprobe 是不够的,你需要 startupprobe |