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

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

  •  
  •   0576coder · 125 天前 · 1729 次点击
    这是一个创建于 125 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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

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

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

    感谢各位老哥
    NUT
        16
    NUT   123 天前
    @qq850482461 #1 这个老哥正解。 用 readiness +liveness 就行。无缝滚动更新。我们 java 服务启动就得 3 分钟。 这过程太酸爽了。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1442 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:32 · PVG 01:32 · LAX 09:32 · JFK 12:32
    ♥ Do have faith in what you're doing.