【问题标题】:How to use the gRPC health probe in a container to check the health of a service running on the local machine?如何使用容器中的 gRPC 健康探针来检查本地机器上运行的服务的健康状况?
【发布时间】:2021-03-04 20:50:51
【问题描述】:

这个问题类似于From inside of a Docker container, how do I connect to the localhost of the machine?,但由于在docker run 命令中使用--network="host" 对我不起作用,所以我针对我的具体用例再次提出这个问题。

我有一个 Java gRPC 服务器在本地运行在端口 9095 上,它实现了gRPC health checking protocol

> 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

但是,运行 /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 给我的结果与我在本地机器上的结果相同?如何让这个容器探测本地健康服务器?

【问题讨论】:

    标签: docker grpc


    【解决方案1】:

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

    通常,grpc_health_probe 用于检查 K8s 等编排环境中容器的健康状况。而且您必须将二进制文件 grpc_health_probe 包含到您的容器中,并使用 localhost loopback 来调用它,以便像这样:

              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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 2019-11-20
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-10
      相关资源
      最近更新 更多