外部 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 1
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
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
|