Входящий шлюз Istio для gRPC (соединение закрыто)

У меня есть сервер gRPC, работающий на кластере k8s (удаленный сервер). Я пытаюсь подключиться к этой службе из клиента gRPC (локальный компьютер). Для этого я использую входной шлюз 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:
        - "*"

Моя VirtualService:

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

Как я могу решить эту проблему?

p.s.

  • Мой example.com находится в CloudFlare.
  • Я установил рекорд ДНК для service.example.com
  • Нет никаких правил брандмауэра.
  • Подключение gRPC включено (думаю, это не важно, так как работает только для порта 443)

person Klimbo    schedule 28.03.2021    source источник
comment
СУПЕР важно, чтобы ваша служба имела имя порта grpc. Вы это освещаете?   -  person suren    schedule 29.03.2021
comment
@suren Извините, я не понимаю ваш комментарий. Как вы можете видеть в моем коде, я использую имя grpc для своего порта, потому что оно требуется Istio.   -  person Klimbo    schedule 31.03.2021
comment
не в Deployment. В Service.   -  person suren    schedule 31.03.2021
comment
@suren Хорошо, понятно. Я забыл добавить конфигурацию службы к моему сообщению SO. Вы можете проверить это сейчас. Есть порт с именем grpc.   -  person Klimbo    schedule 31.03.2021
comment
да! это имя необходимо установить.   -  person suren    schedule 31.03.2021


Ответы (1)


Я не нашел очевидного, где неправильно, думаю, хост VirtualService должен быть DNS во внутреннем Kubernetes. как 2_

person HelloWood    schedule 30.03.2021
comment
Если да, то какой URL-адрес я должен предоставить при подключении к кластеру k8s? - person Klimbo; 31.03.2021
comment
@Klimbo Это формат SeviceName.NameSpace.svc.cluster.local - person HelloWood; 01.04.2021
comment
Как я смогу подключиться к sevice.default.svc.cluster.local извне кластера k8s (с моего ноутбука)? Этот URL-адрес является внутренним, а не внешним - person Klimbo; 01.04.2021
comment
@Klimbo Просто прочтите мой комментарий, DNS предназначен для VS для прокси, а не для вас, вам нужно только получить доступ к вашему хосту "service.example.com:80" - person HelloWood; 01.04.2021