本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面上的信息自发布以来是否已变得不正确。
在 Kubernetes 上运行 gRPC 服务器的健康检查
更新(2021 年 12 月):Kubernetes 现在从 v1.23 版本开始内置了 gRPC 健康探测。要了解更多信息,请参阅 配置存活、就绪和启动探测。本文最初是关于使用外部工具实现相同任务的。
gRPC 正逐渐成为云原生微服务之间通信的标准语言。如果您今天正在将 gRPC 应用程序部署到 Kubernetes,您可能想知道配置健康检查的最佳方法。在本文中,我们将讨论 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 "health" 模块并开始使用它(例如 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,并提供反馈。