我最近一直在试验kubernetes,我一直在尝试通过一个复制控制器测试pod中的故障转移,其中容器一旦使用就会崩溃(从而导致重启).
我已经为此调整了bashttpd项目:https: //github.com/Chronojam/bashttpd
(我在哪里设置它以便它提供容器的主机名,然后退出)
这很好用,除了重启对于我要做的事情来说要慢得多,因为它适用于前几个请求,然后停止一段时间 - 然后在重新启动pod时再次开始工作.(理想情况下,id在访问服务时看不到任何中断).
我认为(但不确定)这里提到的备份延迟应该归咎于: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.ukchronojam-serve-once-j8uyc
#] curl http://serve-once.chronojam.co.ukchronojam-serve-once-r8pi4
#] curl http://serve-once.chronojam.co.ukchronojam-serve-once-yb9hc
#] curl http://serve-once.chronojam.co.ukchronojam-serve-once-46jck
#] curl http://serve-once.chronojam.co.uk #] curl http://serve-once.chronojam.co.uk
你还会注意到即使在那里应该有2个仍然健康的豆荚,它会在第4天后停止返回.
所以我的问题有两个:
1)
我可以调整退避延迟吗?
2)
为什么我的服务不将我的请求发送到健康容器?
我认为可能是网络服务器本身无法快速开始提供请求,因此kubernetes认为这些pod是健康的,并在那里发送请求(但由于流程尚未开始,所以什么也没回来?)
我提出了一个问题来记录推荐的做法.我在问题中列出了方法的草图:
https://github.com/kubernetes/kubernetes/issues/20473
确保pod设置了非零的terminationGracePeriodSeconds
在pod的主服务容器上配置readinessProbe
在应用程序中处理SIGTERM:使readinessProbe失败但继续*来处理正常请求而不退出
将maxUnavailable和/或maxSurge设置得足够大,以确保Deployment API规范中有足够的服务实例(1.2中提供)
容器重启,特别是当他们拉图像时,系统相当昂贵.Kubelet支持重新启动崩溃的容器,以便使用DOSing docker,注册表,apiserver等优雅地降级.