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

K8S 如何优雅滚动发布 Java 应用,每次重新发布都会出现超时跟 502

  •  
  •   0576coder · 2021-07-28 16:37:51 +08:00 · 3251 次点击
    这是一个创建于 1205 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前公司正在全面上 k8s 。作为一个算是边缘部门,所以就被当做第二批小白鼠强行迁移了 k8s 。

    目前项目重新发布的时候业务方请求我 http 接口的时候会出现 connect timeout 或者直接 response 502 了

    java 应用是单机的 spring boot 目前线上 3 节点,应用内部也实现了优雅停机相关代码。

    因为线上的 k8s 对我来说就是个黑盒,我也不知道运维怎么配置的。听运维说,公司 go 那边的项目是因为服务化了,每次下线 pod 前会通知网关来下掉这个节点。所以 go 的服务没出现我这边的情况。

    我那边的线路直接就是内网域名解析到 ingress 然后 ingress 负载到后面 services services 后面就是我 java 应用 3 个 pod 节点了。

    有没有遇到过类似问题的小伙伴,求你们的最佳实践

    16 条回复    2021-07-30 09:11:00 +08:00
    qq850482461
        1
    qq850482461  
       2021-07-28 16:48:38 +08:00
    问下运维有没有配置 readinessProbe,我认为你这个问题是 Pod 启动成功了,但是 java 应用还没有启动完毕,流量通过 ingress 就进入了你新发布的 Pod 中,所以访问 502
    yongle1117
        2
    yongle1117  
       2021-07-28 16:52:14 +08:00
    首先在 Spring boot 中配置优雅关闭,然后 K8S 的 readinessProbe 要配置的,K8S 的 deployment 的配置最好在关闭前让 pod 休眠一定的时间,让 pod 里的应用好处理完当前已经进来的请求
    arischow
        3
    arischow  
       2021-07-28 16:53:58 +08:00
    很有可能是像 1 楼说的情况。
    0576coder
        4
    0576coder  
    OP
       2021-07-28 16:54:11 +08:00
    @qq850482461
    这个有健康检查 有个接口 运维会先访问该接口 我可以找运维确认下- -
    0576coder
        5
    0576coder  
    OP
       2021-07-28 16:55:37 +08:00
    @yongle1117 感谢老哥 我问下运维
    baiyi
        6
    baiyi  
       2021-07-28 16:56:05 +08:00
    看起来你的问题在于 Pod 启动后程序还没有成功跑起来,如果是这样的话可以加个就绪探测器试试
    jeffh
        7
    jeffh  
       2021-07-28 16:57:37 +08:00
    应该是 pod 启动后内部的 java 程序还没启动,配置健康检查就可以了
    wiken
        8
    wiken  
       2021-07-28 17:38:01 +08:00
    探针了解下
    Heroininu
        9
    Heroininu  
       2021-07-28 17:43:15 +08:00
    echo1937
        10
    echo1937  
       2021-07-28 17:44:51 +08:00 via iPhone
    cyaki
        11
    cyaki  
       2021-07-29 08:19:14 +08:00 via Android
    光配置了探针还不够,还需要配置 prestop hook,让睡个几秒
    eudore
        12
    eudore  
       2021-07-29 09:43:50 +08:00
    健康检查没做
    gscoder
        13
    gscoder  
       2021-07-29 10:21:57 +08:00
    就绪检查+健康检查+滚动发布 k8s 支持的。 你们运维有点菜,应该就是只是部署了,但什么都不懂
    eric96
        14
    eric96  
       2021-07-29 10:48:34 +08:00
    健康检查没做,pod 启动了但是 java 程序还没完全起来导致的(自己写的启动生命周期,包括各种服务注册,初始化数据,注册端口等)
    如果有检查点,价格健康检查的探针。再不济,直接规定最小的启动等待时间就行了
    0576coder
        15
    0576coder  
    OP
       2021-07-29 10:56:13 +08:00
    各位老哥 我来汇报一下后续情况


    发布的时候出现超时跟 502 其实是有两个原因的

    * 最初的时候运维下掉 pod 的时候没做优雅停机,导致部分留在老节点里的请求没处理完就退出了

    * 后面重新发布的时候还是有几条超时,其实问题的主要原因是在新拉起的节点上,因为我那边用了挺多东西的,而且我提供给运维健康检查的接口其实就是自己手动写了个 /health 接口,其实这时候 jar 包刚被拉起,很多东西刚初始化,所以它起来了,但是它还没完全就绪,所以我准备用 9 楼老哥提供的官方文档的方法 重新配一个健康检查的接口

    感谢各位老哥
    NUT
        16
    NUT  
       2021-07-30 09:11:00 +08:00
    @qq850482461 #1 这个老哥正解。 用 readiness +liveness 就行。无缝滚动更新。我们 java 服务启动就得 3 分钟。 这过程太酸爽了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1031 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:11 · PVG 05:11 · LAX 13:11 · JFK 16:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.