正在快速重启 pods

Restarting pods quickly

我最近一直在试验 kubernetes,我一直在尝试通过复制控制器在 pods 中测试故障转移,其中容器在使用时立即崩溃(从而导致重启).

我为此调整了 bashttpd 项目: https://github.com/Chronojam/bashttpd

(我在其中设置它以便它服务于容器的主机名,然后退出)

这很好用,除了重启对于我正在尝试做的事情来说太慢了,因为它适用于前几个请求,然后停止一段时间 - 然后在 pods 重新启动。 (理想情况下,我希望访问服务时完全没有中断)。

我认为(但不确定)这里提到的备份延迟是罪魁祸首: https://github.com/kubernetes/kubernetes/blob/master/docs/user-guide/pod-states.md#restartpolicy

一些输出:

#] kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
chronojam-blog-a23ak         1/1       Running   0          6h
chronojam-blog-abhh7         1/1       Running   0          6h
chronojam-serve-once-1cwmb   1/1       Running   7          4h
chronojam-serve-once-46jck   1/1       Running   7          4h
chronojam-serve-once-j8uyc   1/1       Running   3          4h
chronojam-serve-once-r8pi4   1/1       Running   7          4h
chronojam-serve-once-xhbkd   1/1       Running   4          4h
chronojam-serve-once-yb9hc   1/1       Running   7          4h
chronojam-tactics-is1go      1/1       Running   0          5h
chronojam-tactics-tqm8c      1/1       Running   0          5h
#] curl http://serve-once.chronojam.co.uk
<h3> chronojam-serve-once-j8uyc </h3>
#] curl http://serve-once.chronojam.co.uk
<h3> chronojam-serve-once-r8pi4 </h3>
#] curl http://serve-once.chronojam.co.uk
<h3> chronojam-serve-once-yb9hc </h3>
#] curl http://serve-once.chronojam.co.uk
<h3> chronojam-serve-once-46jck </h3>
#] curl http://serve-once.chronojam.co.uk
#] curl http://serve-once.chronojam.co.uk

您还会注意到,即使那里应该有 2 个仍然健康 pods,它在第 4 个之后停止返回。

所以我的问题有两个:

1)

我可以调整退避延迟吗?

2)

为什么我的服务没有将我的请求发送到健康的容器?

观察:

我认为可能是网络服务器本身无法快速开始处理请求,所以 kubernetes 认为那些 pods 是健康的,并在那里发送请求(但返回时什么也没有,因为过程还没开始?)

我提交了一个问题来记录推荐的做法。我在问题中放了一个方法的草图:

https://github.com/kubernetes/kubernetes/issues/20473

  • 确保 pods 有一个非零的 terminationGracePeriodSeconds 集
  • 在 pods
  • 的主服务容器上配置 readinessProbe
  • 在应用程序中处理 SIGTERM:使 readinessProbe 失败但继续 * 处理正常请求并且不退出
  • 设置 maxUnavailable and/or maxSurge 足够大以确保部署中有足够的服务实例 API 规范(在 1.2 中可用)

容器重启,尤其是当它们拉取镜像时,对系统来说是相当昂贵的。 Kubelet 会阻止崩溃容器的重启,以便通过 DOSing docker、注册表、api 服务器等正常降级