连接到在其他Pod上运行的gRPC服务器

时间:2019-10-04 11:31:00

标签: java spring-boot docker grpc grpc-java

我在本地运行gRPC客户端和服务器,并且可以通过localhost通过HTTP2通过它们进行通信。 但是,当使用Kubernetes和Docker将这些应用程序部署在开发环境中时,我无法从客户端应用程序调用gRPC服务器。

我使用以下代码连接到客户端:

ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build();

在DEV中: 这是我来自服务器应用程序的application.yml。

grpc:
  port: 6565
  enabled: true

我在端口6565上运行了gRPC服务器,因此我也在客户端application.yml上更改了以下内容

taxgRPC:
  host: bpstax-ws.g-dev4.svc.rnq.k8s.copart.com
  port: 6565  

当我的客户端调用服务器时,服务器没有收到任何传入请求,并且客户端失败,给出以下异常:

Caused by: io.grpc.netty.shaded.io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: bpstax-ws.g-dev4.svc.rnq.k8s.copart.com/10.148.2.194:6565

当我登录到特定的dev pod时,可以看到侦听gRPC服务器的端口。

[dedas@rndcks401 ~]$ kubectl exec -ti bpstax-g-dev4-v029-74mj2 -n g-dev4 -- bash
bash-4.1$ netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:6565                0.0.0.0:*                   LISTEN      1/java
tcp        0      0 0.0.0.0:38957               0.0.0.0:*                   LISTEN      1/java
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      1/java
tcp        0      0 0.0.0.0:8081                0.0.0.0:*                   LISTEN      1/java

我需要一些有关如何连接到该gRPC服务器的帮助。 请让我知道是否需要任何澄清/代码。

1 个答案:

答案 0 :(得分:0)

我想您必须为gRPC客户端提供正确的主机。在您的k8s环境中,找到服务器Pod的IP地址的最佳方法是通过headless service

示例定义:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: server
  name: server-headless
  namespace: <YOUR_NAMESPACE>
spec:
  clusterIP: None
  ports:
  - name: tcp
    port: 6565
    protocol: TCP
    targetPort: 6565
  selector:
    app: <SERVER_POD_LABEL>
  type: ClusterIP

拥有适用于服务器应用程序的无头服务,您可以将服务的FQDN用作主机。这样,您可以确保将服务的FQDN始终解析为正确的Pod的ip / s。