k8s tomcat 进程 killed 访问 nginx 502 问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX    Kubernetes

k8s tomcat 进程 killed 访问 nginx 502 问题

  •  
  •   dunhanson 2021-10-18 15:48:24 +08:00 2646 次点击
    这是一个创建于 1454 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第二版暂时没发现什么问题,不晓得还有没有其他更简便的方式?

    第 1 条附言    2021-10-18 21:30:14 +08:00

    我有写探针

     readinessProbe: httpGet: path: /clogin.do port: 8080 initialDelaySeconds: 60 timeoutSeconds: 30 livenessProbe: httpGet: path: /clogin.do port: 8080 initialDelaySeconds: 60 timeoutSeconds: 45 periodSeconds: 90 
    29 条回复    2021-10-19 15:31:19 +08:00
    defunct9
        1
    defunct9  
       2021-10-18 16:01:33 +08:00   1
    chendy
        2
    chendy  
       2021-10-18 16:06:11 +08:00
    @defunct9 +1 直接在前台运行 tomcat 就可以了
    dunhanson
        3
    dunhanson  
    OP
       2021-10-18 16:07:17 +08:00
    @defunct9 这样没有 catalina.out 日志文件
    liuhan907
        4
    liuhan907  
       2021-10-18 16:17:08 +08:00
    你都 k8s 了,直接挂一个探针不就行了?
    dunhanson
        5
    dunhanson  
    OP
       2021-10-18 16:23:43 +08:00
    @liuhan907 探针有加,不适用于这种场景,本身的探针是用来检查假死的情况
    dunhanson
        6
    dunhanson  
    OP
       2021-10-18 16:25:16 +08:00
    @liuhan907 或者说探针可以,但是只能添加一种,所以有局限性
    gengchun
        7
    gengchun  
       2021-10-18 16:37:38 +08:00
    @dunhanson ?什么意思,直接加 readiness probes 不就好了吗?
    davinci
        8
    davinci  
       2021-10-18 16:51:45 +08:00
    完全可以把你的检测脚本做成一个自定义探针,让 kubelet 去执行
    dier
        9
    dier  
       2021-10-18 17:00:11 +08:00
    #4 你要是多看一下官方关于“存活、就绪和启动”的探针配置说明就不会有这样的想法了
    defunct9
        10
    defunct9  
       2021-10-18 17:08:02 +08:00
    @dunhanson 你的理解有误吧。容器就是一个不会掉下去的进程,你把 tomcat 扔到后台,还生成 catalina.out 日志文件。浪费感情啊,tomcat 跑前台,标准输出就是 catalina.out 的内容。符合实践啊。还再造个脚本探测,不若你 tomcat 加一个 ok.jsp ,从外部 probe 不是更好?
    liuhan907
        11
    liuhan907  
       2021-10-18 17:39:47 +08:00
    @dunhanson 我不能理解,你那个脚本不就是个蹩脚版的探针么。。
    salmon5
        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
    liuxu
        13
    liuxu  
       2021-10-18 20:00:32 +08:00   1
    1 楼和 10 楼是正解,容器就是应该运行一个前端进程,而不是 daemon 方式

    存活 k8s 有 livenessProbe 参数

    你目前就是典型的常规物理机运维方式迁移到 k8s 的不适应阶段,不仅是运维方式,还有好些程序 /语言 runtime 的配置参数都应该调整,k8s 还是有很多和常规运维有差异的地方,我一直在想着专门为这个写一个专题
    dunhanson
        14
    dunhanson  
    OP
       2021-10-18 21:21:54 +08:00
    @gengchun 就是我启动探针和存活探针已经有写了,楼下的回复应该可以
    dunhanson
        15
    dunhanson  
    OP
       2021-10-18 21:23:07 +08:00
    @liuhan907 哈哈 是的,今天晚上上线还发现一个问题,没加 sleep 1s,导致负载有点高
    dunhanson
        16
    dunhanson  
    OP
       2021-10-18 21:24:17 +08:00
    @salmon5 就是按原来的方式启动 startup.sh ,会生成 catalina.out 文件,也会按日期进行切割
    dunhanson
        17
    dunhanson  
    OP
       2021-10-18 21:25:04 +08:00
    @liuxu 感觉 8 楼的方式比较可行
    dunhanson
        18
    dunhanson  
    OP
       2021-10-18 21:25:45 +08:00
    抱歉各位,下午有事,没能及时回复
    salmon5
        19
    salmon5  
       2021-10-18 21:51:32 +08:00
    用 springboot 吧,tomcat war 包老掉牙了
    liuxu
        20
    liuxu  
       202110-18 21:52:33 +08:00
    @dunhanson 8 楼的方式就是 livenessProbe
    liuhan907
        21
    liuhan907  
       2021-10-18 22:22:14 +08:00
    @dunhanson 你的探针效果很差的原因是你把间隔和超时时间设置的太长了。我设置探针一般一秒一次,超时 1s,五次就算挂了。
    dunhanson
        22
    dunhanson  
    OP
       2021-10-19 09:10:03 +08:00
    @liuhan907 因为负载的时候,确实有时候会存在超时的情况,不可能设置超时 1s
    liuhan907
        23
    liuhan907  
       2021-10-19 13:15:49 +08:00
    @dunhanson 负载高到已经能让 health check 接口都超时了,说明你的容量已经不够了,该加机器了,而不是拉大延迟。
    dunhanson
        24
    dunhanson  
    OP
       2021-10-19 14:54:38 +08:00
    探针会有延迟的,就算设置每次 1 秒,失败 1,超时 1s 。
    经过测试,好几秒后容器才会重启
    直接自己脚本编写 do while,可以马上检测到 tomcat 进程不存在,然后 kill 掉 tail 进程,容器直接重启
    dunhanson
        25
    dunhanson  
    OP
       2021-10-19 14:55:04 +08:00
    @salmon5 老项目呀,说改就改?
    dunhanson
        26
    dunhanson  
    OP
       2021-10-19 14:55:40 +08:00
    @liuhan907 生产环境很复杂的,有可能各种原因会导致超过 1s
    liuhan907
        27
    liuhan907  
       2021-10-19 15:27:06 +08:00
    @dunhanson 本来上了 k8s 之后你想立即就检测错误是很难的。另外健康检查接口不应该使用业务接口,另外写一个接口来做才是正确的模式。
    salmon5
        28
    salmon5  
       2021-10-19 15:29:47 +08:00
    salmon5
        29
    salmon5  
       2021-10-19 15:31:19 +08:00
    readinessprobe 和 livenessprobe 是不够的,你需要 startupprobe
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5542 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 08:59 PVG 16:59 LAX 01:59 JFK 04:59
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86