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

在 Kubernetes 上對 gRPC 伺服器進行健康檢查

更新(2021 年 12 月): Kubernetes 從 v1.23 開始已內建 gRPC 健康探針。要了解更多資訊,請參閱配置活躍性、就緒性和啟動探針。本文最初是關於使用外部工具實現相同任務的。

gRPC 正在成為雲原生微服務之間通訊的通用語言。如果您目前正在 Kubernetes 上部署 gRPC 應用程式,您可能想知道如何最好地配置健康檢查。在本文中,我們將討論 grpc-health-probe,一種在 Kubernetes 上對 gRPC 應用程式進行健康檢查的原生方式。

如果您不熟悉,Kubernetes 健康檢查(活躍性和就緒性探針)是讓您的應用程式在您睡覺時保持可用的機制。它們檢測無響應的 Pod,將其標記為不健康,並導致這些 Pod 被重啟或重新排程。

Kubernetes 不原生支援 gRPC 健康檢查。這使得 gRPC 開發者在部署到 Kubernetes 時面臨以下三種方法:

options for health checking grpc on kubernetes today

  1. httpGet 探針: 無法與 gRPC 原生使用。您需要重構您的應用程式以同時提供 gRPC 和 HTTP/1.1 協議(在不同的埠號上)。
  2. tcpSocket 探針: 開啟到 gRPC 伺服器的套接字沒有意義,因為它無法讀取響應體。
  3. exec 探針: 這會定期呼叫容器生態系統中的程式。對於 gRPC,這意味著您自己實現一個健康 RPC,然後在容器中編寫和分發客戶端工具。

我們能做得更好嗎?當然可以。

推出 “grpc-health-probe”

為了標準化上面提到的 “exec 探針” 方法,我們需要

  • 一種可以輕鬆在任何 gRPC 伺服器中實現的標準健康檢查 “協議”。
  • 一種可以輕鬆查詢健康協議的標準健康檢查 “工具”。

值得慶幸的是,gRPC 有一個標準健康檢查協議。它可以輕鬆地從任何語言中使用。生成程式碼和用於設定健康狀態的實用程式幾乎都包含在所有 gRPC 語言實現中。

如果您在 gRPC 應用程式中實現此健康檢查協議,那麼您可以使用標準/通用工具呼叫此 Check() 方法來確定伺服器狀態。

您需要的下一個東西是 “標準工具”,它就是 grpc-health-probe

使用此工具,您可以在所有 gRPC 應用程式中使用相同的健康檢查配置。此方法要求您:

  1. 在您喜歡的語言中找到 gRPC “健康” 模組並開始使用它(例如 Go 庫)。
  2. 在您的容器中分發 grpc_health_probe 二進位制檔案。
  3. 配置 Kubernetes “exec” 探針以在容器中呼叫 “grpc_health_probe” 工具。

在這種情況下,執行 “grpc_health_probe” 將透過 localhost 呼叫您的 gRPC 伺服器,因為它們在同一個 Pod 中。

接下來

grpc-health-probe 專案仍處於早期階段,需要您的反饋。它支援各種功能,例如與 TLS 伺服器通訊以及可配置的連線/RPC 超時。

如果您目前正在 Kubernetes 上執行 gRPC 伺服器,請嘗試使用 gRPC 健康協議並在您的部署中嘗試 grpc-health-probe,並提供反饋

進一步閱讀