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

2021-03-18 14:20:24 +08:00
 zhoudaiyu

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

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

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

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

你要的应该是服务稳定,而不是重启得快
vzard
2021-03-18 20:11:25 +08:00
内网仓库拉镜像应该很快的
kennylam777
2021-03-18 20:12:21 +08:00
livenessprobe 做檢測, 然後配合 readinessprobe , 等新的 pod 上來後才停掉舊的
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
2021-03-18 22:21:50 +08:00
@kennylam777
@bwangel 我们比较粗暴 存活就绪都监控端口 只要应用启动 端口就有了 所以只能杀应用让端口不占用 然后探针重启
kennylam777
2021-03-18 22:30:19 +08:00
@zhoudaiyu 但是直接重啟 process 也會殺掉現有連線, 如果用 readyness 的話, 配合好 service IP 的設計, 舊 pod 在 termination 十幾秒的時間內新的請求會被導引到新 pod, 而舊的連線在 termination grace period 下仍能生存一會
zhoudaiyu
2021-03-18 22:32:59 +08:00
@kennylam777 我感觉主要还是现在探针不好使 如果确实能反应应用可用性 就不需要过多的人为操作了
12101111
2021-03-18 22:41:42 +08:00
容器里放一个守护进程,OOM 了自己重启,重启不了就自杀让 Pod 重建
tiedan
2021-03-18 22:45:58 +08:00
kill -HUP
kennylam777
2021-03-18 22:50:20 +08:00
@zhoudaiyu 探針可以是最簡單的 TCP, 然後是 HTTP, 最後殺著是 exec 直接跑 command, 只要你要求的可用性都能用一個固定及可以循環的方法返回 exit code 就可以

還是有要求的話 exec 這種玩法可以讓 Pod 去調用外部的檢測結果去讓 k8s 做判斷
bwangel
2021-03-19 00:12:28 +08:00
@zhoudaiyu

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

JVM OOM 发生后应用就退出了吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/762813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX