將處理常式附加到容器生命週期事件
本頁說明如何將處理常式附加到容器生命週期事件。 Kubernetes 支援 postStart 和 preStop 事件。 Kubernetes 在容器啟動後立即傳送 postStart 事件,並在容器終止之前立即傳送 preStop 事件。 一個容器可以為每個事件指定一個處理常式。
準備開始
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。 建議在至少有兩個節點且不充當控制平面主機的叢集上執行本教學課程。 如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 實驗環境之一
若要檢查版本,請輸入kubectl version
。定義 postStart 和 preStop 處理常式
在本練習中,您將建立一個具有一個容器的 Pod。 該容器具有 postStart 和 preStop 事件的處理常式。
以下是 Pod 的組態檔
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]
在組態檔中,您可以看到 postStart 命令將 message
檔案寫入容器的 /usr/share
目錄。 preStop 命令會優雅地關閉 nginx。 如果容器因故障而終止,這會很有幫助。
建立 Pod
kubectl apply -f https://k8s.io/examples/pods/lifecycle-events.yaml
驗證 Pod 中的容器正在執行中
kubectl get pod lifecycle-demo
取得進入 Pod 中執行的容器的 Shell
kubectl exec -it lifecycle-demo -- /bin/bash
在您的 Shell 中,驗證 postStart
處理常式是否已建立 message
檔案
root@lifecycle-demo:/# cat /usr/share/message
輸出顯示 postStart 處理常式寫入的文字
Hello from the postStart handler
討論
Kubernetes 在容器建立後立即傳送 postStart 事件。 但是,不保證在呼叫容器的進入點之前會呼叫 postStart 處理常式。 postStart 處理常式相對於容器程式碼非同步執行,但 Kubernetes 對容器的管理會封鎖,直到 postStart 處理常式完成為止。 在 postStart 處理常式完成之前,容器的狀態不會設定為 RUNNING。
Kubernetes 會在容器終止之前立即發送 preStop 事件。Kubernetes 對容器的管理會被阻止,直到 preStop 處理程序完成,除非 Pod 的寬限期到期。如需更多詳細資訊,請參閱Pod 生命周期。
注意
僅當 Pod 或 Pod 中的容器被終止時,Kubernetes 才會發送 preStop 事件。這表示當 Pod 完成時,不會調用 preStop Hook。關於此限制的詳細資訊,請參閱容器 Hook。下一步
- 深入了解容器生命週期 Hook。
- 深入了解 Pod 的生命週期。