优雅的pod终止

时间:2016-09-14 14:29:53

标签: kubernetes

我需要让容器在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秒并不算太多。

2 个答案:

答案 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上快速退出。

相关问题