V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dunhanson
V2EX  ›  Kubernetes

k8s tomcat 进程 killed 访问 nginx 502 问题

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

    外部 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  
       2021-10-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   ·   实用小工具   ·   1240 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 91ms · UTC 23:55 · PVG 07:55 · LAX 15:55 · JFK 18:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.