如何使一个Pod与另一个Pod的本地主机通信

时间:2019-08-10 06:49:42

标签: go kubernetes grpc

我已经在Go中实现了gRPC客户端服务器。现在,我已经在Kubernetes中将它们设置为客户端和服务器Pod,客户端连接到服务器。我已经在PC上使用流浪汉(centos / 7)设置了该群集。我的问题是客户端希望访问端口8090(此端口上服务的服务器)并向服务器发送消息,但是由于它们位于不同的Pod中,因此客户端无法访问localhost 8090,因此Pod失败。我该如何解决这个问题?

func main() {
    conn, err := grpc.Dial(":8090", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect :%v", err)
    }
    cli := proto.NewPingClient(conn)

如图所示,它尝试拨打8090,但无法将其映射到服务器Pod的本地主机。

3 个答案:

答案 0 :(得分:1)

localhost仅可用于寻址在单个Pod中运行的一组容器。

Pod到Pod的通信应通过Service

以下示例服务会将流量转发到所有标有app: grpc-app的Pod。

apiVersion: v1
kind: Service
metadata:
  name: grpc-service
spec:
  selector:
    app: grpc-app
  ports:
    - protocol: TCP
      port: 8090
      targetPort: 8090

然后,您将具有DNS主机名来访问服务。

grpc-service.<namespace>.svc.<cluster-domain> 通常是
grpc-service.default.svc.cluster.local

func main() {
    conn, err := grpc.Dial("name-of-your-grpc-service:8090", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect :%v", err)
    }
    cli := proto.NewPingClient(conn)

答案 1 :(得分:0)

不能,您需要使用kubernetes服务对象,然后使用dns将代理的IP获取到另一个Pod。 Pod在同一Pod的容器之间在自己内部共享localhost,仅此而已。

答案 2 :(得分:0)

此问题的最标准解决方案是忘记连接到localhost,然后创建连接到同一名称空间中所选服务器pod的ClusterIP服务:

apiVersion: v1
kind: Service
metadata:
  name: server-service
  labels:
    app: your-label
spec:
  type: ClusterIP
  ports:
  - port: 8090
    targetPort: 8090
    protocol: TCP
  selector:
    app: your-label

请记住在广告连播说明中使用相同的metadata.labels.app值,否则两者将不会相互连接。
如果您已正确配置群集,并且CoreDNS已启动并正在运行,并且您在同一命名空间中运行客户端和服务器Pod,则应该能够使用server-service:8090访问服务器。