Правила заголовка виртуальной службы Istio не применяются - PullRequest
0 голосов
/ 23 марта 2020

Так что у меня очень уникальная ситуация. Проблема Правила маршрутизации виртуальных сервисов не применяются. У нас есть настройка buzzfeed sso в нашем кластере. Мы хотим изменить заголовки ответа, т.е. добавить заголовок. к каждому запросу, который соответствует URI Sign_in. Buzzfeed sso имеет свое собственное пространство имен. Теперь, чтобы выполнить это, я создал виртуальный сервис. Шаги для воспроизведения : Мы использовали эту виртуальную службу spe c для создания правил маршрута.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sso-auth-injector
spec:
  hosts:
  - sso-auth
  http:
  - match:
    - uri:
        prefix: /sign_in
      ignoreUriCase: true
    route:
    - destination:
        host: sso-auth
      headers:
        response:
          add: 
            foo: bar
        request:
          add:
            hello: world

Анализ

Istioctk x description имеет выход Pod: sso-auth-58744b56cd-lwqrh.sso Порты: 4180 (sso -auth), 15090 (istio-proxy) Предложение: добавить ярлык «app» в модуль для телеметрии Istio. Предложение: добавьте метку «версия» в модуль для телеметрии Istio. Служба: sso-auth.sso Порт: http 80 / HTTP предназначен для порта pod 4180. Порт является РАЗРЕШЕННЫМ (обеспечивает HTTP / mTLS), и клиенты говорят по HTTP. VirtualService: sso-auth-injector.sso / sign_in uncased 2) Istioctl. Не для всех правил, но для исходящих | 80 |

"routes": [
                    {
                        "match": {
                            "prefix": "/sign_in",
                            "caseSensitive": false
                        },
                        "route": {
                            "cluster": "outbound|80||sso-auth.sso.svc.cluster.local",
                            "timeout": "0s",
                            "retryPolicy": {
                                "retryOn": "connect-failure,refused-stream,unavailable,cancelled,resource-exhausted,retriable-status-codes",
                                "numRetries": 2,
                                "retryHostPredicate": [
                                    {
                                        "name": "envoy.retry_host_predicates.previous_hosts"
                                    }
                                ],
                                "hostSelectionRetryMaxAttempts": "5",
                                "retriableStatusCodes": [
                                    503
                                ]
                            },
                            "maxGrpcTimeout": "0s"
                        },
                        "metadata": {
                            "filterMetadata": {
                                "istio": {
                                    "config": "/apis/networking/v1alpha3/namespaces/sso/virtual-service/sso-auth-injector"
                                }
                            }
                        },
                        "decorator": {
                            "operation": "sso-auth.sso.svc.cluster.local:80/sign_in*"
                        },
                        "typedPerFilterConfig": {
                            "mixer": {
                                "@type": "type.googleapis.com/istio.mixer.v1.config.client.ServiceConfig",
                                "disableCheckCalls": true,
                                "mixerAttributes": {
                                    "attributes": {
                                        "destination.service.host": {
                                            "stringValue": "sso-auth.sso.svc.cluster.local"
                                        },
                                        "destination.service.name": {
                                            "stringValue": "sso-auth"
                                        },
                                        "destination.service.namespace": {
                                            "stringValue": "sso"
                                        },
                                        "destination.service.uid": {
                                            "stringValue": "istio://sso/services/sso-auth"
                                        }
                                    }
                                },
                                "forwardAttributes": {
                                    "attributes": {
                                        "destination.service.host": {
                                            "stringValue": "sso-auth.sso.svc.cluster.local"
                                        },
                                        "destination.service.name": {
                                            "stringValue": "sso-auth"
                                        },
                                        "destination.service.namespace": {
                                            "stringValue": "sso"
                                        },
                                        "destination.service.uid": {
                                            "stringValue": "istio://sso/services/sso-auth"
                                        }
                                    }
                                }
                            }
                        },
                        "requestHeadersToAdd": [
                            {
                                "header": {
                                    "key": "hello",
                                    "value": "world"
                                },
                                "append": true
                            }
                        ],
                        "responseHeadersToAdd": [
                            {
                                "header": {
                                    "key": "foo",
                                    "value": "bar"
                                },
                                "append": true
                            }
                        ]
                    }
                ]
            },

Проблемы / Вопросы

Эти правила не вступают в силу. Каждый запрос передается службе, но заголовки не изменяются. Не должны ли правила маршрута применяться к входящим запросам, а не к исходящим (как показано в сгенерированном конфиге).

1 Ответ

0 голосов
/ 24 марта 2020

Мы хотим изменить заголовки ответа, т.е. добавить заголовок. к каждому запросу, который соответствует uri sign_in

Я сделал пример, проверил его, и все отлично работает.

Проверьте ниже, тесты и весь пример.

Виртуальный сервис

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginxvirt
spec:
  gateways:
  - mesh
  hosts:
  - nginx.default.svc.cluster.local
  http:
  - name: match
    headers:
      response:
        add:
          foo: "bar"
    match:
    - uri:
        prefix: /sign_in
    rewrite:
      uri: /
    route:
    - destination:
        host: nginx.default.svc.cluster.local
        port:
          number: 80
        subset: v1

Все, что нужно для теста

apiVersion: v1
kind: Pod
metadata:
  name: ubu1
spec:
  containers:
  - name: ubu1
    image: ubuntu
    command: ["/bin/sh"]
    args: ["-c", "apt-get update && apt-get install curl -y && sleep 3000"]

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx1
spec:
  selector:
    matchLabels:
      run: nginx1
  replicas: 1
  template:
    metadata:
      labels:
        run: nginx1
        app: frontend
    spec:
      containers:
      - name: nginx1
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]

---

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    app: frontend   

---

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nginxvirt
spec:
  gateways:
  - mesh
  hosts:
  - nginx.default.svc.cluster.local
  http:
  - name: match
      headers:
      response:
        add:
          foo: "bar"
    match:
    - uri:
        prefix: /sign_in
    rewrite:
      uri: /
    route:
    - destination:
        host: nginx.default.svc.cluster.local
        port:
          number: 80
        subset: v1

---  

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: nginxdest
spec:
  host: nginx.default.svc.cluster.local
  subsets:
  - name: v1
    labels:
      run: nginx1

Тест из Ubuntu pod

Я использовал curl -I для отображения заголовков ответов

curl -I nginx/sign_in
HTTP/1.1 200 OK
server: envoy
date: Tue, 24 Mar 2020 07:44:10 GMT
content-type: text/html
content-length: 13
last-modified: Thu, 12 Mar 2020 06:52:43 GMT
etag: "5e69dc3b-d"
accept-ranges: bytes
x-envoy-upstream-service-time: 3
foo: bar

Как видите, заголовок foo: bar добавлен правильно.


Дополнительные ссылки для заголовков


В вашем анализе istioctl я вижу, что у вас может быть ошибка 503

"retriableStatusCodes": [
                                    503
                                ]

Дополнительные ссылки для 503 eror

...