我需要让容器在 kubectl
' termination. It needs to do some work before it'被破坏后运行5分钟 . 看来kubernetes正是我所需要的:
terminationGracePeriodSeconds: 300
所以我在我的yaml中定义了它 . 我已经更新了运行 RCs
,删除了当前的pod,因此创建了新的pod,现在我可以通过 get pod xyz -o=yaml
看到pod正好包含此设置 .
不幸的是,当我试图做 rolling-update
时,原来的吊舱在1分钟后被杀死,而不是在5分钟后 . 我确实ssh到目标机器,我可以看到docker在这段时间之后终止了容器 .
我试着调查一下这个功能是如何工作的 . 我终于找到了 kubectl delete
的文档,其中有一个关于优雅终止期的概念:
http://kubernetes.io/docs/user-guide/pods/
默认情况下,所有删除在30秒内都是正常的 . kubectl delete命令支持--grace-period =选项,该选项允许用户覆盖默认值并指定自己的值 . 值0表示删除应该是立即的,并立即删除API中的pod,以便可以使用相同的名称创建新的pod . 在被强制终止之前,设置为立即终止的节点pod仍将被给予一个小的宽限期
所以我拿了一个pod,nginx,并尝试用 grace-period=30
删除它 . 事实证明,原始pod立即被删除,并且 get pods
显示正在启动新的pod .
所以没有30秒 . 我究竟做错了什么?似乎所有pods kubernetes都没有考虑这些值 . 请注意,我正在使用kubernetes v1.2.2
我也发现了这个问题https://github.com/kubernetes/kubernetes/issues/24695记者有同样的问题,他以同样的方式解决了这个问题 . 所以例如对于kubernetes而言,300秒并不算太多 .
2 回答
您可以在'preStop'钩子中设置魔术睡眠 . 此挂钩将在
kubectl
发送SIGTERM
到您的容器之前进行扩展 .http://kubernetes.io/docs/user-guide/production-pods/#lifecycle-hooks-and-termination-notice
就像是:
https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html这可以帮到你 .
在某些情况下,SIGTERM猛烈地杀死应用程序,消除了所有努力以优雅地关闭它 . 例如,Nginx在SIGTERM上快速退出 .