优美的吊舱终止

Mar*_*val 3 kubernetes

我需要让容器在kubectl终止后5分钟内运行。它需要做一些工作才能销毁。看来kubernetes完全包含我需要的东西:

terminationGracePeriodSeconds: 300
Run Code Online (Sandbox Code Playgroud)

所以我在yaml中定义了它。我已经更新了运行状态RCs,删除了当前的Pod,因此创建了新的Pod,现在我可以通过看到Pod恰好包含此设置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 nginx,并尝试用删除它grace-period=30。原来,原来的Pod已被立即删除,并get pods表明新的Pod 正在启动。

所以没有30秒。我究竟做错了什么?似乎所有pod kubernetes都没有考虑这些值。请注意,我正在使用kubernetes v1.2.2

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

小智 5

您可能可以在'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"]
Run Code Online (Sandbox Code Playgroud)