У меня есть приложение 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 работают должным образом. Я сталкиваюсь с этой проблемой только с приложениями GRPC. Не могли бы вы объяснить мне, как настроить шлюз и виртуальный сервис для вышеуказанного приложения?
Чтобы предоставить свое приложение 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 и что вы настроили свое приложение для работы в соответствующем пространстве имен. Просто измените имена служб и пространства имен по мере необходимости, чтобы они соответствовали фактическим деталям развертывания.
Вам не нужно явно создавать входной класс при использовании istio. После установки istio вам необходимо пометить пространство имен, создать объекты шлюза и виртуального сервиса istio.