Kubernetes 為容器的生命周期事件設(shè)置處理函數(shù)

2022-06-10 14:02 更新

為容器的生命周期事件設(shè)置處理函數(shù)

這個頁面將演示如何為容器的生命周期事件掛接處理函數(shù)。Kubernetes 支持 postStart 和 preStop 事件。 當一個容器啟動后,Kubernetes 將立即發(fā)送 postStart 事件;在容器被終結(jié)之前, Kubernetes 將發(fā)送一個 preStop 事件。容器可以為每個事件指定一個處理程序。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:

要檢查版本,請輸入 ?kubectl version?。

定義 postStart 和 preStop 處理函數(shù) 

在本練習中,你將創(chuàng)建一個包含一個容器的 Pod,該容器為 postStart 和 preStop 事件提供對應(yīng)的處理函數(shù)。

下面是對應(yīng) 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 命令在容器的 ?/usr/share? 目錄下寫入文件 ?message?。 命令 preStop 負責優(yōu)雅地終止 nginx 服務(wù)。當因為失效而導(dǎo)致容器終止時,這一處理方式很有用。

創(chuàng)建 Pod:

kubectl apply -f https://k8s.io/examples/pods/lifecycle-events.yaml

驗證 Pod 中的容器已經(jīng)運行:

kubectl get pod lifecycle-demo

使用 shell 連接到你的 Pod 里的容器:

kubectl exec -it lifecycle-demo -- /bin/bash

在 shell 中,驗證 ?postStart ?處理函數(shù)創(chuàng)建了 ?message ?文件:

root@lifecycle-demo:/# cat /usr/share/message

命令行輸出的是 ?postStart ?處理函數(shù)所寫入的文本

Hello from the postStart handler

討論 

Kubernetes 在容器創(chuàng)建后立即發(fā)送 postStart 事件。 然而,postStart 處理函數(shù)的調(diào)用不保證早于容器的入口點(entrypoint) 的執(zhí)行。postStart 處理函數(shù)與容器的代碼是異步執(zhí)行的,但 Kubernetes 的容器管理邏輯會一直阻塞等待 postStart 處理函數(shù)執(zhí)行完畢。 只有 postStart 處理函數(shù)執(zhí)行完畢,容器的狀態(tài)才會變成 RUNNING。

Kubernetes 在容器結(jié)束前立即發(fā)送 preStop 事件。除非 Pod 寬限期限超時,Kubernetes 的容器管理邏輯 會一直阻塞等待 preStop 處理函數(shù)執(zhí)行完畢。

Note: Kubernetes 只有在 Pod 結(jié)束(Terminated) 的時候才會發(fā)送 preStop 事件, 這意味著在 Pod 完成(Completed) 時 preStop 的事件處理邏輯不會被觸發(fā)。這個限制在 issue #55087 中被追蹤。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號