Istio: один шлюз и несколько VirtualServices (каждый в своем пространстве имен)
Как я могу настроить один шлюз в Istio 1.9 и несколько VirtualServices (каждый в своем пространстве имен). Я не могу установить один шлюз для каждой виртуальной службы, потому что браузеры используют повторное использование HTTP / 2-соединения (https://httpwg.org/specs/rfc7540.html#reuse) для выдачи 404 ошибки.
Если я следовать инструкциям https://istio.io/latest/docs/ops/common-problems/network-issues/#404-errors-occur-when-multiple-gateways-configured-with-same-tls-certificate это не будет работать, потому что шлюз и виртуальный сервис не могут находиться в разных пространствах имен.
Это файлы манифеста:
APP1:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: app1-gateway
namespace: app1
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "app1.example.com"
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-app1
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: sslcertificate
hosts:
- "app1.example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: app1
namespace: app1
spec:
hosts:
- "app1.example.com"
gateways:
- app1-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: app1
port:
number: 80
APP2:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: app2-gateway
namespace: app2
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "app2.example.com"
tls:
httpsRedirect: true # sends 301 redirect for http requests
- port:
number: 443
name: https-app2
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: sslcertificate
hosts:
- "app2.example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: app2
namespace: app2
spec:
hosts:
- "app2.example.com"
gateways:
- app2-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: app2
port:
number: 80
1 ответ
Чтобы ответить на ваш вопрос,
because gateway and virtualservice can't be in different namespaces
, на самом деле они могут находиться в разных пространствах имен.
Если он не находится в том же пространстве имен, что и виртуальная служба, вам просто нужно указать это пространство имен в своей виртуальной службе.
Проверить
spec.gateways
раздел
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: bookinfo-Mongo
namespace: bookinfo-namespace
spec:
gateways:
- some-config-namespace/my-gateway # can omit the namespace if gateway is in same
namespace as virtual service.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
namespace: some-config-namespace
Об этом есть соответствующая документация istio .