首页 > 解决方案 > 如何使用容器中的 gRPC 健康探针来检查本地机器上运行的服务的健康状况?

问题描述

这个问题类似于从 Docker 容器内部,如何连接到机器的本地主机?,但是由于--network="host"docker run命令中使用对我不起作用,所以我再次针对我的特定用例提出问题。

我有一个在端口 9095 上本地运行的 Java gRPC 服务器,它实现了gRPC 健康检查协议

> lsof -i :9095
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
java    17538 kurtpeek   89u  IPv6 0x14676dca7273b22d      0t0  TCP *:9095 (LISTEN)

我想通过使用grpc-health-probe. 由于该存储库仅具有 Linux 操作系统的版本,但我运行的是 Mac,我想从 Docker 容器执行此操作,该容器设置为将请求转发到localhost:9095主机。

使用这个 Dockerfile,

FROM ubuntu

RUN apt-get update && apt-get -y install lsof wget
RUN GRPC_HEALTH_PROBE_VERSION=v0.3.6 && \
    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

我使用构建图像docker build --tag healthprobe .,然后使用命令以交互模式运行它

docker run -it --network="host" healthprobe bash

但是,running/bin/grpc_health_probe -addr=:9095没有成功连接到本地 gRPC 服务器,并且lsof没有显示任何东西正在那个端口上监听:

root@docker-desktop:/# /bin/grpc_health_probe -addr=:9095
timeout: failed to connect service ":9095" within 1s
root@docker-desktop:/# lsof -i :9095
root@docker-desktop:/#

是否应该使用--network="host"不能确保lsof给我与本地机器相同的结果?如何让这个容器探测本地健康服务器?

标签: dockergrpc

解决方案


为什么要创建一个新容器来检查健康状况,为什么要在这种情况下以任何方式检查健康状况?

通常,grpc_health_probe 用于在 K8s 等编排环境中检查容器的健康状况。而且您必须将二进制文件grpc_health_probe包含到您的容器中,并使用 localhost 环回在准备就绪或活跃度问题中调用它,如下所示:

          livenessProbe:
            failureThreshold: 3
            exec:
              command: ["/bin/grpc_health_probe-linux-amd64", "-addr=localhost:50051"]
            initialDelaySeconds: 60
            periodSeconds: 60
            timeoutSeconds: 30
          readinessProbe:
            failureThreshold: 3
            exec:
              command: ["/bin/grpc_health_probe-linux-amd64", "-addr=localhost:50051"]
            initialDelaySeconds: 20
            periodSeconds: 20
            timeoutSeconds: 30         

或者使用 docker-compose 如下:

healthcheck:
            test: ["CMD", "bin/grpc_health_probe-linux-amd64", "-addr=localhost:50051"]
            interval: 30s
            timeout: 30s
            retries: 3

推荐阅读