2016-09-14 80 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