在 Kubernetes 中,exec
探針是一種通過 在容器內執行命令 來檢測容器健康狀態的機制。它的核心邏輯是:執行命令后,若命令返回值為 0(表示成功),則認為容器健康;否則認為不健康。
一、exec
探針的機制
-
執行命令
Kubernetes 的kubelet
會進入目標容器內部,運行指定的命令(如cat /tmp/healthy
)。- 命令的執行環境與容器內的 shell 環境一致(例如
/bin/sh
)。 - 如果命令執行成功(返回碼為 0),探針認為容器健康;否則認為不健康。
- 命令的執行環境與容器內的 shell 環境一致(例如
-
觸發時機
- 存活探針(livenessProbe):定期檢查容器是否存活。如果失敗,Kubernetes 會重啟容器。
- 就緒探針(readinessProbe):檢查容器是否準備好接收流量。如果失敗,Pod 會被標記為
NotReady
,不會接收流量。 - 啟動探針(startupProbe):在容器啟動階段使用,確保容器初始化完成后再啟用其他探針。
-
資源消耗
每次執行命令會啟動一個新的進程,可能對容器性能有一定影響(尤其是高頻探測時)。
二、exec
探針的檢測方式
1. 基礎用法
檢測某個文件是否存在且可讀:
readinessProbe:exec:command:- cat- /tmp/healthy
- 邏輯:
cat
命令嘗試讀取/tmp/healthy
文件。如果文件存在且可讀(命令返回 0),則認為容器健康。
2. 組合命令
通過 Shell 腳本組合多個命令進行檢測:
livenessProbe:exec:command:- sh- -c- "curl -s http://localhost:8080/healthz | grep 'OK'"
- 邏輯:使用
sh -c
執行一段 Shell 命令,檢查 HTTP 接口返回結果是否包含 “OK”。如果包含(命令返回 0),則認為健康。
3. 腳本檢測
執行自定義腳本文件:
readinessProbe:exec:command:- /bin/sh- /opt/health_check.sh
- 邏輯:運行
/opt/health_check.sh
腳本,腳本的退出碼決定探針結果。
三、exec
探針的寫法(YAML 配置)
1. 基本結構
<probe_type>:exec:command:- <command>- <arg1>- <arg2>...
<probe_type>
可以是livenessProbe
、readinessProbe
或startupProbe
。command
是一個數組,第一個元素是命令名,后續是參數。
2. 完整示例
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagelivenessProbe:exec:command:- sh- -c- "curl -s http://localhost:8080/healthz | grep 'OK'"initialDelaySeconds: 5 # 容器啟動后等待 5 秒開始探測periodSeconds: 10 # 每 10 秒探測一次
3. 關鍵參數說明
參數 | 作用 | 默認值 |
---|---|---|
initialDelaySeconds | 容器啟動后等待多少秒開始首次探測 | 0 |
periodSeconds | 探測間隔時間(單位秒) | 10 |
timeoutSeconds | 探測超時時間(單位秒) | 1 |
failureThreshold | 連續失敗多少次后判定為失敗 | 3(存活探針必須為 1) |
successThreshold | 連續成功多少次后判定為成功 | 1(存活探針必須為 1) |
四、注意事項
-
局限性
- 僅能驗證命令退出碼:無法直接檢測服務的實際可用性(例如數據庫連接是否正常)。
- 誤判風險:如果命令本身有缺陷(如文件存在但服務已崩潰),可能導致誤判。
-
安全風險
- 執行命令可能暴露敏感信息(如日志文件中的密碼)。
- 建議避免執行復雜或危險的命令。
-
替代方案
- HTTP 探針:通過 HTTP 請求檢測服務狀態(更高效且通用)。
- TCP 探針:通過 TCP 連接檢測端口是否開放(適合無 HTTP 接口的服務)。
-
最佳實踐
- 簡單場景:使用
cat /path/to/file
快速驗證文件是否存在。 - 復雜場景:結合
curl
、grep
等工具驗證服務接口。 - 腳本封裝:將復雜邏輯封裝到腳本中,提高可維護性。
- 簡單場景:使用
五、總結
特性 | 說明 |
---|---|
檢測方式 | 執行命令,通過退出碼判斷健康狀態 |
適用場景 | 文件存在性檢查、簡單命令驗證、自定義腳本 |
優點 | 靈活,可適配任意命令邏輯 |
缺點 | 性能開銷較大,依賴命令實現,可能誤判 |
如果你需要更高效的健康檢查,建議優先使用 HTTP 探針 或 TCP 探針。接下來有時間也會研究一下這兩種探針。