本文发布已超过一年。较旧的文章可能包含过时内容。请检查页面信息自发布以来是否已失效。

对 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 时面临以下三种方法

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 的“health”模块并开始使用它(例如 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,并提供反馈

更多阅读