將處理程式附加到容器生命週期事件

本頁面展示瞭如何將處理程式附加到容器生命週期事件。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 生命週期

下一步

參考

最後修改於 2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 簡碼代替 code 簡碼 (e8b136c3b3)