k8s与健康检查--grpc服务健康检查最佳实践

前言

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

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

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

图片描述

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

grpc-health-probe 解决方案

为了标准化上面提到的“exec探针”方法,咱们须要:服务器

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

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

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

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

图片描述

使用此工具,您能够在全部gRPC应用程序中使用相同的运行情况检查配置。这种方法须要你:spa

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

示例

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

RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
    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 && \
    chmod +x /bin/grpc_health_probe

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

spec:
  containers:
  - name: server
    image: "[YOUR-DOCKER-IMAGE]"
    ports:
    - containerPort: 5000
    readinessProbe:
      exec:
        command: ["/bin/grpc_health_probe", "-addr=:5000"]
      initialDelaySeconds: 5
    livenessProbe:
      exec:
        command: ["/bin/grpc_health_probe", "-addr=:5000"]
      initialDelaySeconds: 10

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

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

完整代码,请查看git仓库

相关文章
相关标签/搜索