Контроллер входа Kubernetes с Istio

У меня есть приложение GRPC (приложение .NET), развернутое в кластере Azure K8 с использованием контрольной диаграммы кода bitnami asp.net. Я передаю следующие значения в диаграмму.

aspnet-core:
  fullnameOverride: app-name
  image:
    registry: registrypath
    repository: repopath
    tag: latest
    pullPolicy: Always
 
  args: 
    - Service.dll

  bindURLs: http://+:5010;https://+:7010       
  service:
    type: ClusterIP
    ports:
      http: 7010

  containerPorts:
    http: 7010

  ingress:
    enabled: true
    pathType: Prefix
    hostname: host.domain.com
    path: /
    annotations:
      nginx.ingress.kubernetes.io/backend-protocol: "GRPCS"
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
    tls: true
    ingressClassName: "nginx"

Это приложение доступно с помощью входа Kubernetes nginx. Получив доступ извне, я смог связаться с конечной точкой.

Однако после установки Istio я не могу связаться с конечной точкой. Я попробовал следовать документации Istio, создал новый входной класс «istio» и использовал его в входной конфигурации (ingressClassName: istio), но все равно не смог связаться с конечной точкой и получил ошибку «404 Not Found nginx».

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: istio
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
spec:
  controller: istio.io/ingress-controller

Просматривая журналы входного контроллера, я вижу ошибку ниже.

I0412 02:00:10.148428       7 store.go:578] "ignoring ingressclass as the spec.controller is not the same of this ingress" ingressclass = "istio"
W0412 02:01:59.300315       7 controller.go:331] ignoring ingress <serviceName> in <NAMESPACE> based on annotation : no object matching key "istio" in local store
I0412 02:01:59.300359       7 main.go:107] "successfully validated configuration, accepting" ingress = "<NAMESPACE>/<SERVICENAME>"
I0412 02:01:59.307387       7 store.go:489] "removing ingress because of unknown ingressclass" ingress = "<NAMESPACE>/<SERVICENAME>"

Любое предложение или идея, какую конфигурацию мне не хватает? Я относительно новичок в Istio и до сих пор стараюсь избегать входного шлюза Istio, поскольку большинство приложений (кроме приложения GRPC) работают должным образом.

Вам не нужно явно создавать входной класс при использовании istio. После установки istio вам необходимо пометить пространство имен, создать объекты шлюза и виртуального сервиса istio.

Nataraj Medayhal 14.04.2024 14:59

Большинство сервисов, которые были доступны ранее, после установки istio работают должным образом. Я сталкиваюсь с этой проблемой только с приложениями GRPC. Не могли бы вы объяснить мне, как настроить шлюз и виртуальный сервис для вышеуказанного приложения?

zyas 15.04.2024 01:04
istio.io/latest/docs/reference/config/networking/gateway и istio.io/latest/docs/reference/config/networking/… содержит подробную информацию о создании как шлюза, так и объекта виртуальной службы istio.
Nataraj Medayhal 15.04.2024 10:35
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
1
3
211
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы предоставить свое приложение GRPC в кластере Azure Kubernetes с помощью Istio вместо NGINX Ingress, вам необходимо настроить собственные ресурсы Istio Gateway и VirtualService. Эти ресурсы направляют трафик с края сети в ваш сервис внутри сети. Убедитесь, что Istio установлен в вашем кластере и что для вашего пространства имен включено автоматическое внедрение дополнительных данных (если оно не используется по умолчанию).

kubectl label namespace your-namespace istio-injection=enabled

В моем случае это

следовательно, необходимо определить Gateway в пространстве имен aks-istio-ingress, которое будет управлять входящим трафиком.

Пример шлюза Grpc

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grpc-gateway
  namespace: aks-istio-ingress  # Use the namespace where the Istio ingress is running
spec:
  selector:
    istio: ingressgateway-external-asm-1-20  # Use the correct selector for your external gateway
  servers:
  - port:
      number: 7010
      name: grpc
      protocol: GRPC
    hosts:
    - "host.domain.com"

измените хост своим собственным значением. Убедитесь, что фактическое значение, которое вы заменяете заполнителем host.domain.com, имеет запись DNS A, указывающую на внешний IP-адрес 4.236.238.18 (ваш собственный внешний IP-адрес) вашего входного шлюза Istio.

Следующий — VirtualService, который будет направлять трафик от шлюза к конкретному сервису в кластере.

Пример виртуального сервиса Grpc

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grpc-virtualservice
  namespace: aks-istio-ingress  # Ensure this is the same namespace as your service
spec:
  hosts:
  - "host.domain.com"
  gateways:
  - grpc-gateway
  http:
  - match:
    - uri:
        prefix: "/"
    route:
    - destination:
        host: app-name.aks-istio-ingress.svc.cluster.local  # Adjust this to your service's DNS name
        port:
          number: 7010

применять их

kubectl apply -f grpc-gateway.yaml
kubectl apply -f grpc-virtualservice.yaml

Проверка развертывания и службы

kubectl get gateway -n aks-istio-ingress
kubectl get virtualservice -n aks-istio-ingress
kubectl get svc -n aks-istio-ingress

Теперь предположим, что ваше .NET-приложение готово обрабатывать трафик GRPC через порт 7010 и что вы настроили свое приложение для работы в соответствующем пространстве имен. Просто измените имена служб и пространства имен по мере необходимости, чтобы они соответствовали фактическим деталям развертывания.

Другие вопросы по теме