docker - 如何使用容器中的 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
给我与本地机器相同的结果?如何让这个容器探测本地健康服务器?
解决方案
为什么要创建一个新容器来检查健康状况,为什么要在这种情况下以任何方式检查健康状况?
通常,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