# 監測 Pod 的健康程度:[Probes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/) Probe 描述了對 Container 執行的健康檢查,以確定它是否存活或準備好接收流量。 Kubernetes 有三種 Probe 來監測 Pod 的健康程度:**`livenessProbe`**、**`readinessProbe`**、**`startupProbe`**。 + **`livenessProbe`**:來了解何時重新啟動 Container。 + Liveness probe 可能會捕獲 deadlock,即應用程式正在運行但無法進行下去。在這種狀態下重新啟動 Container 有助於提高應用程式的可用性,儘管存在錯誤。 + **`readinessProbe`**:來了解 Container 何時準備好開始接受流量。 + 當 Pod 的所有 Container 都準備就緒時,該 Pod 就被視為準備就緒。此訊號的一種用途是控制哪些 Pod 用作服務的後端。當 Pod 未準備好時,它將從服務負載平衡器中刪除。 + **`startupProbe`**:來了解 Container 應用程式何時啟動。 + 如果配置了 startup probe,liveness probe 和 readiness probe 在其成功之前不會啟動,確保這些 probe 不會干擾應用程序的啟動。這可以用來對啟動較慢的 Container 進行存活檢查,避免它們在啟動並運行之前被 kubelet 殺死。 使用 Probe 來檢查 Container 狀態有四種方法: + exec - 在 Container 內執行指令 + grpc + httpGet + tcpSocket ## 範例 ```yaml apiVersion: v1 kind: Pod metadata: name: redis-server spec: containers: - name: redis image: redis:latest ports: - containerPort: 6379 livenessProbe: tcpSocket: port: 6379 initialDelaySeconds: 10 periodSeconds: 5 timeoutSeconds: 10 readinessProbe: exec: command: - "redis-cli" - "ping" initialDelaySeconds: 10 periodSeconds: 3 timeoutSeconds: 5 ``` 上面的例子 **`livenessProbe`** 是使用 tcpSocket 的方法來判斷 redis 這個 Container 是否還活著,kubelet 能跟這個 Container 建立 TCP 連線則算成功。**`readinessProbe`** 則是利用 **`redis-cli`** 對 redis 發出 **`ping`** 這個請求,用這個方式來判斷 redis 是否能接收請求。 在 Probe 的配置上有不同的選項可以控制 probe 的頻率、怎樣算是成功等等。比較常用的有: + **`initialDelaySeconds`**:等 Container 啟動之後等待多久進行第一次檢查。如果定義了 startup probe,則 liveness & readiness probe 的 initial delay 會等到 startup probe 成功後才開始計算。如果 **`periodSeconds`** 的值大於 **`initialDelaySeconds`**,則 **`initialDelaySeconds`** 將被忽略。預設為 0 秒,最小值為 0。 + **`periodSeconds`**:檢查的間隔。預設為 10 秒,最小值為 1 秒。 + **`timeoutSeconds`**:多久才算是 timeout。預設為 1 秒,最小值為 1 秒。 + **`successThreshold`**:Probe 檢查失敗後,被認為成功的最小連續請求成功次數。預設為 1,對 liveness & startup probes 來說必須為 1 。最小值為 1。 + **`failureThreshold`**:幾次失敗才將這個 Container 視為還沒準備好接受請求/不健康。