![](/img/trans.png)
[英]Kubernetes graceful pod termination on SpringApplication.exit
[英]Graceful pod termination
我需要让该容器在kubectl
终止后5分钟运行。 它需要做一些工作才能销毁。 看来kubernetes完全包含我需要的东西:
terminationGracePeriodSeconds: 300
所以我在yaml中定义了它。 我已经更新了正在运行的RCs
,删除了当前的Pod,因此创建了新的Pod,现在我可以通过get pod xyz -o=yaml
看到一个Pod完全包含此设置。
不幸的是,当我尝试进行rolling-update
,原来的Pod在1分钟后(而不是5分钟后)就被杀死了。 我确实对目标计算机执行了ssh操作,然后可以看到Docker在该时间之后终止了该容器。
我试图做一些调查功能如何工作。 我终于找到了kubectl delete
的文档,其中有关于kubectl delete
终止的概念:
http://kubernetes.io/docs/user-guide/pods/
默认情况下,所有删除都会在30秒内正常进行。 kubectl delete命令支持--grace-period =选项,该选项允许用户覆盖默认值并指定自己的值。 值0表示删除应立即生效,并立即删除API中的容器,以便可以创建具有相同名称的新容器。 在节点上设置为立即终止的Pod仍将被给予短暂的宽限期,然后被强制杀死
所以我拿了一个pod nginx,尝试用grace-period=30
删除它。 原来,原来的Pod已被立即删除,而get pods
显示新的get pods
正在启动。
所以没有30秒。 我究竟做错了什么? 似乎所有pod kubernetes都没有考虑这些值。 请注意,我正在使用kubernetes v1.2.2
我还发现了这个问题https://github.com/kubernetes/kubernetes/issues/24695 ,那里的记者遇到了同样的问题,他以同样的方式解决了。 因此,对于berbernetes而言,例如300秒并不是太多。
您可能可以在“ preStop”挂钩中设置魔术睡眠。 在kubectl
将SIGTERM
发送到您的容器之前,该钩子将被保护。
http://kubernetes.io/docs/user-guide/production-pods/#lifecycle-hooks-and-termination-notice
就像是:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
command: ["/bin/sleep","300"]
https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html可能对您有帮助。
在某些情况下,SIGTERM会猛烈杀死该应用程序,从而使您无法正常关闭该应用程序。 例如,Nginx在SIGTERM上快速退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.