【问题标题】:Istio ingress-gateway for gRPC (connection closed)用于 gRPC 的 Istio 入口网关(连接已关闭)
【发布时间】:2021-06-24 23:57:39
【问题描述】:

我有一个在 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 端口)

【问题讨论】:

  • 拥有端口名称grpc 对您的服务非常重要。你在报道这个吗?
  • @suren 对不起,我不明白你的评论。正如您在我的代码中看到的那样,我使用“grpc”名称作为端口,因为 Istio 需要它。
  • 不在Deployment 中。在Service.
  • @suren 好的,我明白了。我忘记在我的 SO 帖子中添加 service 配置。你现在可以检查一下。有一个名为“grpc”的端口。
  • 是的!需要设置该名称。

标签: grpc kubernetes-ingress istio grpc-go istio-gateway


【解决方案1】:

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

【讨论】:

  • 如果是这样,在连接到 k8s 集群时我应该提供什么 URL?
  • @Klimbo 格式为SeviceName.NameSpace.svc.cluster.local
  • 我如何能够从 k8s 集群外部(从我的笔记本电脑)连接到 sevice.default.svc.cluster.local?该网址是内部的,而不是外部的
  • @Klimbo 看了我的评论,DNS是给VS做代理的,不是给你访问的,你只需要访问你的主机"service.example.com:80"
猜你喜欢
  • 2021-01-10
  • 1970-01-01
  • 2019-07-07
  • 2019-08-28
  • 2020-11-09
  • 2020-06-17
  • 2020-12-27
  • 1970-01-01
  • 2021-08-10
相关资源
最近更新 更多