用于 gRPC 的 Istio 入口网关连接已关闭

问题描述

我有一个在 k8s 集群(远程服务器)上运行的 gRPC 服务器。我尝试从 gRPC 客户端(本地 pc)连接到此服务。为此,我使用 Istio 入口网关。但我收到“连接关闭”消息,错误代码为 14。

这是我的 gRPC 客户端

conn,err := grpc.Dial("service.example.com:80",grpc.WithInsecure())
if err != nil {
    panic(err)
}

c := service.NewServiceClient(conn)

if _,err := c.TestRPC(...); err != nil {
    log.Println(err.Error()) // rpc error: code = Unavailable desc = connection closed
}

我的网关

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
Metadata:
  name: gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: grpc
        protocol: GRPC
      hosts:
        - "*"

我的虚拟服务

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
Metadata:
  name: service-vs
spec:
  gateways:
    - gateway
  hosts:
    - "service.example.com"
  http:
    - match:
        - port: 80
      route:
        - destination:
            host: service
            port:
              number: 9000

我的服务

apiVersion: v1
kind: Service
Metadata:
  name: service
  labels:
    app: service
spec:
  ports:
    - port: 9000
      name: grpc
  selector:
    app: service

我的部署

apiVersion: apps/v1
kind: Deployment
Metadata:
  name: service
  labels:
    app: service
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 25%
  selector:
    matchLabels:
      app: service
  template:
    Metadata:
      labels:
        app: service
    spec:
      containers:
        - name: service
          image: registry.example.com/user/service:latest
          imagePullPolicy: Always
          ports:
            - name: grpc
              containerPort: 9000
      imagePullSecrets:
        - name: private-registry-secret

我该如何解决这个问题?

附上

  • 我的 example.com 在 CloudFlare 下。
  • 我已经为 service.example.com 设置了 DNA A 记录
  • 没有防火墙规则。
  • gRPC 连接已开启(我认为这并不重要,因为它仅适用于 443 端口)

解决方法

我没发现哪里不对,我猜VirtualService的主机应该是Kubernetes内部的DNS。喜欢service.default.svc.cluster.local

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...