本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
在 Kubernetes 上对 gRPC 服务器进行健康检查
更新(2021 年 12 月): Kubernetes 从 v1.23 开始已内置 gRPC 健康探针。要了解更多信息,请参阅配置活跃性、就绪性和启动探针。本文最初是关于使用外部工具实现相同任务的。
gRPC 正在成为云原生微服务之间通信的通用语言。如果您目前正在 Kubernetes 上部署 gRPC 应用程序,您可能想知道如何最好地配置健康检查。在本文中,我们将讨论 grpc-health-probe,一种在 Kubernetes 上对 gRPC 应用程序进行健康检查的原生方式。
如果您不熟悉,Kubernetes 健康检查(活跃性和就绪性探针)是让您的应用程序在您睡觉时保持可用的机制。它们检测无响应的 Pod,将其标记为不健康,并导致这些 Pod 被重启或重新调度。
Kubernetes 不原生支持 gRPC 健康检查。这使得 gRPC 开发者在部署到 Kubernetes 时面临以下三种方法:
- httpGet 探针: 无法与 gRPC 原生使用。您需要重构您的应用程序以同时提供 gRPC 和 HTTP/1.1 协议(在不同的端口号上)。
- tcpSocket 探针: 打开到 gRPC 服务器的套接字没有意义,因为它无法读取响应体。
- exec 探针: 这会定期调用容器生态系统中的程序。对于 gRPC,这意味着您自己实现一个健康 RPC,然后在容器中编写和分发客户端工具。
我们能做得更好吗?当然可以。
推出 “grpc-health-probe”
为了标准化上面提到的 “exec 探针” 方法,我们需要
- 一种可以轻松在任何 gRPC 服务器中实现的标准健康检查 “协议”。
- 一种可以轻松查询健康协议的标准健康检查 “工具”。
值得庆幸的是,gRPC 有一个标准健康检查协议。它可以轻松地从任何语言中使用。生成代码和用于设置健康状态的实用程序几乎都包含在所有 gRPC 语言实现中。
如果您在 gRPC 应用程序中实现此健康检查协议,那么您可以使用标准/通用工具调用此 Check()
方法来确定服务器状态。
您需要的下一个东西是 “标准工具”,它就是 grpc-health-probe。

使用此工具,您可以在所有 gRPC 应用程序中使用相同的健康检查配置。此方法要求您:
- 在您喜欢的语言中找到 gRPC “健康” 模块并开始使用它(例如 Go 库)。
- 在您的容器中分发 grpc_health_probe 二进制文件。
- 配置 Kubernetes “exec” 探针以在容器中调用 “grpc_health_probe” 工具。
在这种情况下,执行 “grpc_health_probe” 将通过 localhost
调用您的 gRPC 服务器,因为它们在同一个 Pod 中。
接下来
grpc-health-probe 项目仍处于早期阶段,需要您的反馈。它支持各种功能,例如与 TLS 服务器通信以及可配置的连接/RPC 超时。
如果您目前正在 Kubernetes 上运行 gRPC 服务器,请尝试使用 gRPC 健康协议并在您的部署中尝试 grpc-health-probe,并提供反馈。