本文已發布超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.24:gRPC 容器探測功能進入 beta 階段

_更新:自發布本文以來,該功能已在 v1.27 中升級為正式版 (GA),並且不再需要啟用任何功能閘道。

在 Kubernetes 1.24 中,gRPC 探針功能已進入 Beta 階段,並且預設為可用。現在您可以為您的 gRPC 應用程式配置啟動、存活和就緒探針,而無需公開任何 HTTP 端點,也不需要可執行檔。Kubernetes 可以透過 gRPC 原生連線到您的工作負載並查詢其狀態。

歷史背景

讓管理您工作負載的系統檢查應用程式是否健康、是否已正常啟動,以及應用程式是否認為自己可以接受流量,這很有用。在新增 gRPC 支援之前,Kubernetes 已經允許您根據從容器映像內部執行可執行檔、發出 HTTP 請求或檢查 TCP 連線是否成功來檢查健康狀況。

對於大多數應用程式來說,這些檢查就足夠了。如果您的應用程式為健康(或就緒)檢查提供 gRPC 端點,則可以輕鬆地重新調整 exec 探針的用途,以將其用於 gRPC 健康檢查。在部落格文章〈在 Kubernetes 上進行 gRPC 伺服器健康檢查〉中,Ahmet Alp Balkan 描述了您可以如何做到這一點——這種機制至今仍然有效。

有一個常用工具可以啟用此功能,該工具於 2018 年 8 月 21 日建立,並於 2018 年 9 月 19 日發布第一個版本。

這種用於 gRPC 應用程式健康檢查的方法非常受歡迎。在 GitHub 上進行基本搜尋(在撰寫本文時)發現有 3,626 個 Dockerfile 包含 grpc_health_probe,以及 6,621 個 yaml 檔案。這很好地表明了該工具的普及程度以及對原生支援此功能的需求。

Kubernetes v1.23 引入了原生支援使用 gRPC 查詢工作負載狀態的 Alpha 品質實作。由於它是一個 Alpha 功能,因此在 v1.23 版本中預設為停用。

使用此功能

我們以與其他探針類似的方式建置了 gRPC 健康檢查,並且相信如果您熟悉 Kubernetes 中的其他探針類型,它將很容易使用。原生支援的健康探針比涉及 grpc_health_probe 可執行檔的變通方法有許多優勢。

透過原生 gRPC 支援,您無需下載並在映像中攜帶額外的 10MB 可執行檔。Exec 探針通常比 gRPC 呼叫慢,因為它們需要實例化一個新進程來執行可執行檔。這也使得在 Pod 以最大資源運作且實例化新進程遇到問題的邊緣情況下,檢查變得不太明智。

不過,有一些限制。由於為探針配置用戶端憑證很困難,因此不支援需要用戶端驗證的服務。內建探針也不會檢查伺服器憑證,並忽略相關問題。

內建檢查也無法配置為忽略某些類型的錯誤(grpc_health_probe 為不同的錯誤傳回不同的退出代碼),並且無法「鏈式」以在單個探針中對多個服務執行健康檢查。

但是所有這些限制對於 gRPC 來說都是相當標準的,並且有簡單的變通方法可以解決這些問題。

親自試試看

叢集級別設定

您今天就可以試用此功能。若要試用原生 gRPC 探針,您可以自行啟動一個已啟用 GRPCContainerProbe 功能閘道的 Kubernetes 叢集,有許多工具可用

由於功能閘道 GRPCContainerProbe 在 1.24 中預設為啟用,因此許多供應商將開箱即用地提供此功能。因此,您只需在您選擇的平台上建立一個 1.24 叢集即可。某些供應商允許在 1.23 叢集上啟用 Alpha 功能。

例如,在撰寫本文時,您可以在 GKE 上啟動測試叢集以進行快速測試。其他供應商也可能具有類似的功能,特別是如果您在 Kubernetes 1.24 版本發布很久之後才閱讀此部落格文章。

在 GKE 上使用以下命令(請注意,版本為 1.23 且指定了 enable-kubernetes-alpha)。

gcloud container clusters create test-grpc \
    --enable-kubernetes-alpha \
    --no-enable-autorepair \
    --no-enable-autoupgrade \
    --release-channel=rapid \
    --cluster-version=1.23

您還需要配置 kubectl 才能存取叢集

gcloud container clusters get-credentials test-grpc

試用此功能

讓我們建立 Pod 來測試 gRPC 探針如何運作。在此測試中,我們將使用 agnhost 映像。這是一個 k8s 維護的映像,可用於各種工作負載測試。例如,它有一個有用的 grpc-health-checking 模組,該模組公開了兩個端口 - 一個端口用於提供健康檢查服務,另一個端口用於回應 make-serving 和 make-not-serving 命令的 http 端口。

這是一個範例 Pod 定義。它啟動 grpc-health-checking 模組,公開端口 50008080,並配置 gRPC 就緒探針

---
apiVersion: v1
kind: Pod
metadata:
  name: test-grpc
spec:
  containers:
  - name: agnhost
    # image changed since publication (previously used registry "k8s.gcr.io")
    image: registry.k8s.io/e2e-test-images/agnhost:2.35
    command: ["/agnhost", "grpc-health-checking"]
    ports:
    - containerPort: 5000
    - containerPort: 8080
    readinessProbe:
      grpc:
        port: 5000

在名為 test.yaml 的 manifest 檔案中,您可以建立 Pod 並檢查其狀態。Pod 將處於就緒狀態,如輸出片段所示。

kubectl apply -f test.yaml
kubectl describe test-grpc

輸出將包含類似以下內容

Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True

現在讓我們將健康檢查端點狀態變更為 NOT_SERVING。為了呼叫 Pod 的 http 端口,讓我們建立端口轉發

kubectl port-forward test-grpc 8080:8080

您可以使用 curl 呼叫命令...

curl http://localhost:8080/make-not-serving

... 並且在幾秒鐘內,端口狀態將切換為未就緒。

kubectl describe pod test-grpc

輸出現在將具有

Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True

...

  Warning  Unhealthy  2s (x6 over 42s)  kubelet            Readiness probe failed: service unhealthy (responded with "NOT_SERVING")

一旦切換回,大約一秒鐘後,Pod 將恢復為就緒狀態

curl http://localhost:8080/make-serving
kubectl describe test-grpc

輸出表明 Pod 已恢復為 Ready 狀態

Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True

Kubernetes 上新的內建 gRPC 健康探測使得透過 gRPC 實作健康檢查比依賴使用單獨的 exec 探針的舊方法容易得多。在該功能升級為正式版 (GA) 之前,請仔細閱讀官方文件以了解更多資訊並提供回饋。

總結

Kubernetes 是一個受歡迎的工作負載協調平台,我們根據回饋和需求新增功能。諸如 gRPC 探針支援之類的功能是一項小的改進,它將使許多應用程式開發人員的生活更輕鬆,並使應用程式更具彈性。今天就試試看並提供回饋,趕在該功能進入正式版 (GA) 之前。