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

Kubernetes 上 gRPC 伺服器的健康檢查

更新(2021 年 12 月): Kubernetes 現在從 v1.23 版本開始內建 gRPC 健康探測。若要瞭解更多資訊,請參閱設定存活度、就緒度和啟動探測。本文最初是關於使用外部工具來達成相同任務。

gRPC 正逐漸成為雲原生微服務之間通訊的共通語言。如果您今天正在將 gRPC 應用程式部署到 Kubernetes,您可能想知道設定健康檢查的最佳方法。在本文中,我們將討論 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 伺服器的 Socket 沒有意義,因為它無法讀取回應主體。
  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,並提供回饋

延伸閱讀