本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

在 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,并提供反馈

进一步阅读