將處理程式附加到容器生命週期事件
本頁面展示瞭如何將處理程式附加到容器生命週期事件。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 事件。除非 Pod 的寬限期過期,否則 Kubernetes 對容器的管理會阻塞,直到 preStop 處理程式完成。有關更多詳細資訊,請參閱 Pod 生命週期。