Как istio mesh-virtual-service может управлять трафиком от ingress-virtual-service?
Я определяю канареечные маршруты в mesh-virtual-service и задаюсь вопросом, могу ли я сделать его применимым и для входящего трафика (с ingress-virtual-service). Примерно так, как показано ниже, но это не работает (весь входящий трафик идет на не канареечную версию)
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-deployment-app
namespace: test-ns
spec:
gateways:
- mesh
hosts:
- test-deployment-app.test-ns.svc.cluster.local
http:
- name: canary
match:
- headers:
x-canary:
exact: "true"
- port: 8080
headers:
response:
set:
x-canary: "true"
route:
- destination:
host: test-deployment-app-canary.test-ns.svc.cluster.local
port:
number: 8080
weight: 100
- name: stable
route:
- destination:
host: test-deployment-app.test-ns.svc.cluster.local
port:
number: 8080
weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: test-deployment-app-internal
namespace: test-ns
spec:
gateways:
- istio-system/default-gateway
hosts:
- myapp.dev.bla
http:
- name: default
route:
- destination:
host: test-deployment-app.test-ns.svc.cluster.local
port:
number: 8080
weight: 100
Так что я жду
x-canary:true
заголовок ответа, когда я звоню
myapp.dev.bla
но я этого не вижу.
1 ответ
Что ж, ответ лишь частично находится внутри указанной вами ссылки. Я думаю, что при работе с Istio важно понимать, что такое Istio Service Mesh. Сервисная сетка - это каждый модуль с сайдкаром Istio envoy-proxy + все шлюзы (шлюз является автономным envoy-proxy). Все они знают друг о друге благодаря IstioD, поэтому могут сотрудничать.
Любой модуль без дополнительного компонента Istio (включая модули входа или, например, модули системы kube) в вашем кластере k8s ничего не знает об Istio или Service Mesh. Если такой модуль хочет отправлять трафик в Service Mesh (для применения некоторых правил управления трафиком, как у вас), он должен отправляться через Istio Gateway. это объект, который создает стандартное развертывание + сервис. Поды в развертывании состоят из автономных
envoy-proxy
контейнер.
Gateway
Объект очень похож на k8s ingress. Но он не обязательно должен прослушивать nodePort. Вы также можете использовать его как «внутренний» шлюз. Шлюз служит точкой входа в вашу сервисную сеть. Либо для внешнего, либо даже для внутреннего трафика.
- Если вы используете, например, Nginx в качестве решения Ingress, вы должны перенастроить правило Ingress для отправки трафика на один из шлюзов вместо целевой службы. Скорее всего, ваш
mesh
шлюз. Это не что иное, как служба k8s внутри или в пространстве имен - В качестве альтернативы вы можете настроить Istio Gateway как «новый» Ingress. Поскольку я не уверен, прослушивает ли какой-либо шлюз Istio по умолчанию на nodePort, вам нужно проверить его (снова в
istio-gateway
или жеistio-system
пространство имен. В качестве альтернативы вы можете создать новый шлюз только для своего приложения и применитьVirtualService
к новому шлюзу.