本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已失效。
对 Kubernetes 上的 gRPC 服务器进行健康检查
更新 (2021 年 12 月): 自 v1.23 版本起,Kubernetes 现在内置了 gRPC 健康探针。要了解更多信息,请参阅配置存活、就绪和启动探针。本文最初是关于一个外部工具来完成相同任务。
gRPC 正日益成为云原生微服务之间通信的通用语言(lingua franca)。如果你今天正在将 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,并提供反馈。