我需要让容器在kubectl
'之后运行5分钟。终止。它需要做一些工作才能被摧毁。看来kubernetes正是我所需要的:
terminationGracePeriodSeconds: 300
所以我在我的yaml中定义了它。我已更新正在运行的RCs
,删除了当前的广告连播,因此创建了新广告,现在我可以通过get pod xyz -o=yaml
看到广告连播正好包含此设置。
不幸的是,当我尝试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秒并不算太多。
答案 0 :(得分:3)
您可以在' 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"]
答案 1 :(得分:0)
https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html 这可以帮到你。
在某些情况下,SIGTERM会猛烈地杀死应用程序,从而消除了您优雅地关闭它的所有努力。例如,Nginx在SIGTERM上快速退出。