---
# System prepended metadata

title: 監測 Pod 的健康程度：Probes
tags: [K3D]

---

# 監測 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 視為還沒準備好接受請求/不健康。
