gRPC 实战包含一系列文章,包括原创和翻译。最终会形成一个完整的系列,后续会不断完善,增加新的内容:

\=============================================================

前言

GRPC 正在成为云原生微服务之间通信的通用语言。如果您今天要将 gRPC 应用程序部署到 Kubernetes,您可能想知道配置运行状况检查的最佳方法。在本文中,我们将讨论 grpc-health-probe,一种 Kubernetes 本地健康检查 gRPC 应用程序的方法。

果您不熟悉,Kubernetes健康检查(liveness and readiness probes)就是让您的应用程序在您睡觉时保持可用的原因。他们检测到没有响应的 pod,将它们标记为不健康,并导致这些 pod 重新启动或重新调度。

kubernetes 本身不支持 gRPC 健康检查。这使得 gRPC 开发人员在部署到 Kubernetes 时有以下三种方法:

gRPC实战--grpc服务健康检查最佳实践 - SegmentFault 思否 - 图1

  • httpGet probe: 不能与 gRPC 原生使用。您需要重构您的应用程序以同时提供 gRPC 和 HTTP / 1.1 协议(在不同的端口号上)。
  • tcpSocket probe: 打开套接字到 gRPC 服务器是没有意义的,因为它无法读取响应正文。
  • exec probe: 这会定期调用容器生态系统中的程序。对于 gRPC,这意味着您自己实现健康 RPC,然后使用编写客户端工具,并将客户端工具与容器打包到一起。

grpc-health-probe 解决方案

为了标准化上面提到的 “exec 探针” 方法,我们需要:

  • 标准的健康检查 “协议”,可以轻松地在任何 gRPC 服务器中实现。
  • 标准的健康检查 “工具”,可以轻松查询健康协议。

得庆幸的是,gRPC 有一个标准的健康检查协议。它可以从任何语言轻松使用。生成的代码和用于设置运行状况的实用程序几乎都在 gRPC 的所有语言实现中提供。

如果在 gRPC 应用程序中实现此运行状况检查协议,则可以使用标准 / 通用工具调用此 Check()方法来确定服务器状态。

下来你需要的是 “标准工具”,它是grpc-health-probe

gRPC实战--grpc服务健康检查最佳实践 - SegmentFault 思否 - 图2

使用此工具,您可以在所有 gRPC 应用程序中使用相同的运行状况检查配置。这种方法需要你:

  • 选择您喜欢的语言找到 gRPC“health” 模块并开始使用它(例如Go 库)。
  • 将 grpc_health_probe 二进制文件打到容器中。
  • 配置 Kubernetes“exec” 探针以调用容器中的 “grpc_health_probe” 工具。

示例

您可以将静态编译的 grpc_health_probe 打在容器映像中。选择二进制版本并将其下载到 Dockerfile 中:

  1. RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
  2. wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
  3. chmod +x /bin/grpc_health_probe

在你的 Kubernetes Pod manifest 中, 指定容器的 livenessProbe and/or readinessProbe 。

  1. spec:
  2. containers:
  3. - name: server
  4. image: "[YOUR-DOCKER-IMAGE]"
  5. ports:
  6. - containerPort: 5000
  7. readinessProbe:
  8. exec:
  9. command: ["/bin/grpc_health_probe", "-addr=:5000"]
  10. initialDelaySeconds: 5
  11. livenessProbe:
  12. exec:
  13. command: ["/bin/grpc_health_probe", "-addr=:5000"]
  14. initialDelaySeconds: 10

服务器健康检查的代码实现,主要部分如下:

  1. hsrv := health.NewServer()
  2. hsrv.SetServingStatus("", healthpb.HealthCheckResponse_SERVING)
  3. healthpb.RegisterHealthServer(s, hsrv)

完整代码,请查看git 仓库
https://segmentfault.com/a/1190000018362469