K8S 有没有能直接重新 Pod 中的 container 的 API? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhoudaiyu
V2EX    Kubernetes

K8S 有没有能直接重新 Pod 中的 container 的 API?

  •  
  •   zhoudaiyu
    PRO
    2021-03-18 14:20:24 08:00 3844 次点击
    这是一个创建于 1669 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们的场景就是想通过删除 Pod 解决一些容器内部署的应用本身的问题,比如 JVM 的 OOM 等问题,但是重启 Pod 后自动重建是比较慢的,因为要调度到其他机器再拉镜像 balabala 。重启 container 的速度是比重启 Pod 快不少的,但是 K8S 好像没有现成的能重启 container 的 API 。stack 上说有比较不优雅的方式就是 kubectl exec -it xxx kill 1,这样貌似确实可以重启 container,但是不知道有没有风险。不知道是确实没有 API 还是我没找到。如果没有 API 的话,大家有啥稳定的方式重启 container ?

    33 条回复    2021-03-19 20:15:48 +08:00
    TomatoAres
        1
    TomatoAres  
       2021-03-18 16:10:45 +08:00
    docker restart [container_id]
    eric96
        2
    eric96  
       2021-03-18 17:56:52 +08:00
    kill 1
    eric96
        3
    eric96  
       2021-03-18 17:58:42 +08:00
    优雅关闭,需要钩子。据我所知,只有关闭 pod 才支持钩子。想要重启容器,除非程序本身退出就是优雅的,不然得自己想办法去保证
    wxsm
        4
    wxsm  
       2021-03-18 18:10:48 +08:00 via iPhone
    在 container 内定义杀进程钩子,可以通过 http 请求调用。内网通过 pod ip 访问即可
    zhoudaiyu
        5
    zhoudaiyu  
    OP
    PRO
       2021-03-18 18:15:47 +08:00
    @TomatoAres 最好是 k8s 的 api,这样平台好对接。。。

    @eric96 kill 1 不算优雅吗? kill -9 1 算不优雅吧

    @wxsm 程序自杀的钩子?
    wxsm
        6
    wxsm  
       2021-03-18 18:16:46 +08:00 via iPhone
    corvofeng
        7
    corvofeng  
       2021-03-18 18:28:58 +08:00 via Android
    我们自己集群没有给用户重启这个功能, 只允许删除重建。 如果 docker 分层比较好, 而且是内网 dockerhub, pull 也不太慢吧
    Usaki
        8
    Usaki  
       2021-03-18 19:28:25 +08:00 via Android
    crictl rmp [pod name]
    dandankele
        9
    dandankele  
       2021-03-18 20:06:20 +08:00   1
    配置 livenessprobe 检测到不健康不就重启了吗?
    ETiV
        10
    ETiV  
       2021-03-18 20:09:58 +08:00 via iPhone   1
    有个命令可以滚动重启的( rollout 后面接个什么参数,忘了),

    你要的应该是服务稳定,而不是重启得快
    vzard
        11
    vzard  
       2021-03-18 20:11:25 +08:00
    内网仓库拉镜像应该很快的
    kennylam777
        12
    kennylam777  
       2021-03-18 20:12:21 +08:00   2
    livenessprobe 做, 然後配合 readinessprobe , 等新的 pod 上後才停掉的
    bwangel
        13
    bwangel  
       2021-03-18 22:01:14 +08:00
    12 楼正解,存活探针。

    https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-HTTP-request

    应用提供一个接口,k8s 会每过 N 秒就请求一次,如果这个接口返回了 500,那么 k8s 就会重启 pod 中的容器。
    zhoudaiyu
        14
    zhoudaiyu  
    OP
    PRO
       2021-03-18 22:21:50 +08:00 via iPhone
    @kennylam777
    @bwangel 我们比较粗暴 存活就绪都监控端口 只要应用启动 端口就有了 所以只能杀应用让端口不占用 然后探针重启
    kennylam777
        15
    kennylam777  
       2021-03-18 22:30:19 +08:00   1
    @zhoudaiyu 但是直接重 process 也掉有, 如果用 readyness 的, 配合好 service IP 的, pod 在 termination 十秒的新的求被引到新 pod, 而的在 termination grace period 下仍能生存一
    zhoudaiyu
        16
    zhoudaiyu  
    OP
    PRO
       2021-03-18 22:32:59 +08:00 via iPhone
    @kennylam777 我感觉主要还是现在探针不好使 如果确实能反应应用可用性 就不需要过多的人为操作了
    12101111
        17
    12101111  
       2021-03-18 22:41:42 +08:00
    容器里放一个守护进程,OOM 了自己重启,重启不了就自杀让 Pod 重建
    tiedan
        18
    tiedan  
       2021-03-18 22:45:58 +08:00
    kill -HUP
    kennylam777
        19
    kennylam777  
       2021-03-18 22:50:20 +08:00
    @zhoudaiyu 探可以是最的 TCP, 然後是 HTTP, 最後著是 exec 直接跑 command, 只要你要求的可用性都能用一固定及可以循的方法返回 exit code 就可以

    是有要求的 exec 玩法可以 Pod 去用外部的果去 k8s 做判
    bwangel
        20
    bwangel  
       2021-03-19 00:12:28 +08:00
    @zhoudaiyu

    是想通过删除 Pod 解决一些容器内部署的应用本身的问题,比如 JVM 的 OOM 等问题,
    ----
    这一点可以再详细说一下吗?

    JVM OOM 发生后应用就退出了吗?
    lifanxi
        21
    lifanxi  
       2021-03-19 00:28:27 +08:00
    镜象如果太大应该尽可能优化大小,实在不能再小的情况下,可以在所有机器上预先把镜象 pull 好,这样 Pod 可以随便 Failover 都可以秒启。
    zhoudaiyu
        22
    zhoudaiyu  
    OP
    PRO
       2021-03-19 01:23:01 +08:00 via iPhone
    @bwangel 不会退出,会 hang,除非到达了 Pod 的 limit 配置的内存限制容器才会被重启
    zhoudaiyu
        23
    zhoudaiyu  
    OP
    PRO
       2021-03-19 01:24:52 +08:00 via iPhone
    @lifanxi 镜像普遍接近 1G 左右,已经做过镜像瘦身了,我说镜像可能只是一方面,还有别的耗时的地方,主要是在 container creating 这个阶段
    zhoudaiyu
        24
    zhoudaiyu  
    OP
    PRO
       2021-03-19 01:28:00 +08:00 via iPhone
    @kennylam777 是的,其实我们我在让别的组做 HTTP 探针,就像 SpringBoot Actuator 这种
    RedrumSherlock
        25
    RedrumSherlock  
       2021-03-19 06:32:12 +08:00 via Android
    只说镜像的话,如果 imagePullPolicy 设成 ifNotPresent 的话是不会重新拉的,这也是默认和推荐的设置
    zhoudaiyu
        26
    zhoudaiyu  
    OP
    PRO
       2021-03-19 07:58:47 +08:00 via iPhone
    @RedrumSherlock 现在就么配置的
    cassyfar
        27
    cassyfar  
       2021-03-19 08:00:17 +08:00
    @zhoudaiyu

    k8s liveness and readiness 的检测肯定得反应你服务真是健康情况啊。你这样只检测端口,毫无意义。你的服务肯定得有个 endpoint 去返回 health status 。
    讲道理 container creating 多长时间是没关系的。
    lifanxi
        28
    lifanxi  
       2021-03-19 08:13:10 +08:00 via Android
    @zhoudaiyu 奇怪,为啥这么慢。我这一个镜像 20G,也是秒启动的。
    Lee2019
        29
    Lee2019  
       2021-03-19 10:00:29 +08:00
    @lifanxi 你应该是这台 node 上面已经有这个 20G 的镜像而不需要重新 pull 镜像了
    如果你 pod 调度到没有这个镜像的 node 上,那么肯定会耗一定的时间在拉镜像上
    Lee2019
        30
    Lee2019  
       2021-03-19 10:02:20 +08:00
    @zhoudaiyu
    你的镜像可以试试拆分一下呢?
    initContainers 放你的基础镜像,比如 java 服务的基础 java 镜像这类
    然后把程序单独打一个镜像,大小就会小很多
    zhoudaiyu
        31
    zhoudaiyu  
    OP
    PRO
       2021-03-19 10:05:34 +08:00
    @cassyfar 确实,因为当时推广容器的时候,还没有这种健康检查接口,现在好像快弄出来了
    @Lee2019 emmmmm,其实我提问的描述有点问题,我的意思是 container creating 的过程是比较长的,拉镜像算是其中的一步吧,还有启动容器什么的,我也看不到这个过程。。。所以就简略描述为拉镜像
    zorui
        32
    zorui  
       2021-03-19 10:29:20 +08:00
    java 跑在 K8S 的问题,spring 应用更恼火启动时会初始化一堆东西。 GraalVM 成熟了重建快很多
    panzhc
        33
    panzhc  
       2021-03-19 20:15:48 +08:00
    @ETiV kubectl rollout restart deployment/nginx
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     920 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 18:49 PVG 02:49 LAX 11:49 JFK 14:49
    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