Как 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. Вы также можете использовать его как «внутренний» шлюз. Шлюз служит точкой входа в вашу сервисную сеть. Либо для внешнего, либо даже для внутреннего трафика.

  1. Если вы используете, например, Nginx в качестве решения Ingress, вы должны перенастроить правило Ingress для отправки трафика на один из шлюзов вместо целевой службы. Скорее всего, ваш meshшлюз. Это не что иное, как служба k8s внутри или в пространстве имен
  2. В качестве альтернативы вы можете настроить Istio Gateway как «новый» Ingress. Поскольку я не уверен, прослушивает ли какой-либо шлюз Istio по умолчанию на nodePort, вам нужно проверить его (снова в istio-gateway или же istio-systemпространство имен. В качестве альтернативы вы можете создать новый шлюз только для своего приложения и применить VirtualService к новому шлюзу.
Другие вопросы по тегам