我需要让容器在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)
| 归档时间: |
|
| 查看次数: |
4333 次 |
| 最近记录: |