2016-09-14 133 views
2

我需要让容器在kubectl终止后5分钟运行。它在销毁之前需要做一些工作。看起来kubernetes包含我所需要的:优雅的吊舱终结

terminationGracePeriodSeconds: 300 

所以我在我的yaml中定义了它。我更新了正在运行的RCs,删除当前的窗格,以便创建新的窗格,现在我可以看到一个窗格恰好通过get pod xyz -o=yaml包含此设置。

不幸的是,当我试图做rolling-update时,原来的吊舱在1分钟后死亡,而不是在5分钟后死亡。我对目标机器执行ssh操作,我可以看到码头工人在这段时间之后对容器进行了规定。

我试图做一些调查该功能如何工作。我终于找到了文档kubectl delete那里有一个约正常终止期限的概念:

http://kubernetes.io/docs/user-guide/pods/

默认情况下,所有的删除是在30秒内优雅。 kubectl delete命令支持--grace-period =选项,它允许用户覆盖默认值并指定它们自己的值。值为0表示删除应立即生效,并立即删除API中的窗格,以便可以使用相同的名称创建新的窗格。在被设置为立即终止节的豆荚将仍然之前给予小宽限期力杀死

于是我带着一个吊舱,nginx的,并尝试与grace-period=30将其删除。原来,原来的吊舱立即被删除,并且get pods显示新的吊舱正在启动。

所以没有30秒。我究竟做错了什么?看来所有的豆荚都不考虑这些值。 请注意,我正在使用kubernetes v1.2.2

我还发现此问题https://github.com/kubernetes/kubernetes/issues/24695记者遇到同样的问题,他以同样的方式解决了这个问题。所以例如kubernetes 300秒不是太多。

回答

1

您可以在'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"] 
0

https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html 可能这可以帮助你。

在某些情况下,SIGTERM会猛烈地杀死应用程序,从而无法正常关闭应用程序。例如,Nginx快速退出SIGTERM。

+1

尽管这可能在理论上回答这个问题,但[这将是更可取的](// meta.stackoverflow.com/q/8259)在这里包含答案的基本部分,并提供供参考的链接。 – Draken