目前,Kubernetes 支持兩種類型的鉤子:
- PostStart:當容器創建后立即運行,無論容器的主進程是否啟動成功。
- PreStop:當容器即將被終止之前運行,用于在容器終止前優雅地釋放資源或通知其他系統。
這些鉤子允許用戶在容器生命周期的特定點執行自定義邏輯。
PostStart 鉤子
一旦容器被創建并已經準備好運行(即容器已經處于 Running 狀態),PostStart 鉤子就會立即執行。如果 PostStart 鉤子執行失敗,它將不會阻止容器繼續運行。
示例
以下是一個簡單的 Pod 配置示例,該配置在 PostStart 鉤子中執行一個命令:
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/nginx/html/index.html"]
在這個例子中,當 lifecycle-demo-container 容器啟動時,它會運行 postStart 鉤子,該鉤子將執行 exec 命令來修改 Nginx 的默認首頁內容。
PreStop 鉤子
PreStop 鉤子在容器即將被終止之前運行。在接收到終止信號(SIGTERM)之后,Kubernetes 會先運行 PreStop 鉤子,然后再等待一段寬限期(默認是 30 秒),之后才會強制停止容器。如果 PreStop 鉤子執行的時間超過了寬限期,則進程將被 SIGKILL 信號強制殺死。PreStop 鉤子提供了執行清理操作或通知其他系統容器即將關閉的機會。
示例
以下是一個 Pod 配置示例,該配置在 PreStop 鉤子中執行一個命令:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "nginx -s quit"]
在這個例子中,當 lifecycle-demo-container 容器即將被終止時,它會運行 preStop 鉤子,該鉤子將執行 exec 命令來優雅地關閉 Nginx 服務器。
鉤子實現
鉤子可以通過兩種方式實現:
-
Exec:運行容器內的一個命令。如果命令成功退出,則認為鉤子成功。如果命令返回非零退出碼,則認為鉤子失敗。
-
HTTP:發送 HTTP 請求到容器內指定的端點。如果響應的狀態碼是 200-399,則認為鉤子成功。其他狀態碼都認為鉤子失敗。
請注意,不是所有的容器運行時都支持 HTTP 鉤子。目前,只有 Docker 支持 HTTP 鉤子。
鉤子處理程序的限制
鉤子處理程序(無論是 Exec 還是 HTTP)都有一些限制:
- 它們不能阻止容器的啟動或終止。即使鉤子處理程序失敗,容器仍將按照其生命周期繼續執行。
- 它們沒有自己的資源限制,而是使用容器的資源限制。因此,在鉤子中運行的命令不應該消耗大量的資源。
- 它們的執行時間有限制。如果鉤子處理程序在容器寬限期內沒有完成,則進程可能會被強制終止。
了解并正確使用容器生命周期鉤子可以幫助你更好地管理 Pod 和容器的行為,特別是在需要優雅地處理容器啟動和終止場景時。