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

本頁說明如何將處理常式附加到容器生命週期事件。 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 生命周期

下一步

參考

上次修改時間為 2023 年 8 月 24 日下午 6:38 PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)