Фильтры Istio полностью игнорируются в Istio 1.9 в кластере EKS

Я пытаюсь установить простой HTTP-фильтр через Envoy Filter. Я использую совершенно новый кластер EKS, созданный с помощью Terraform, и Istio, установленное с Helm, с его последней версией и значениями по умолчанию.

Я пытаюсь достичь простого скрипта Python, который получает HTTP-запрос и распечатывает заголовок.

Ниже приведены ресурсы, которые я использую.

Скрипт на Python:

    from flask import Flask, redirect, url_for, request, Response
    import logging
    app = Flask(__name__)
    
    @app.route('/status', methods=['GET', 'POST'])
    def parse_request():
        data = request.data  # data is empty
        # need posted data here
        headers = request.headers
        print(headers)
        app.logger.info(headers)
        status_code = Response(status=200)
        return status_code
    
    if __name__ == '__main__':
        app.run(app.run(debug=True, port=5000, host='0.0.0.0'))

K8s проявляет:

  1. Развертывание
apiVersion: apps/v1
kind: Deployment
metadata:
  name: http
  labels:
    app: http
spec:
  replicas: 1
  selector:
    matchLabels:
      app: http
  template:
    metadata:
      labels:
        app: http
        run: http_pod
    spec:
      containers:
      - image: flask_http_test:latest
        imagePullPolicy: Always
        name: http
        ports:
        - containerPort: 5000
      restartPolicy: Always
      imagePullSecrets:
      - name: regcred
  1. Шлюз и VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: mygateway
  labels:
    app: http
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
--- 
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: http-service-vs
  namespace: http
  labels:
    app: http
spec:
  hosts:
    - "*"   # host name of api
  gateways:
  - mygateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: http-service-svc  # k8s service name
        port:
            number: 5000     # pod port
EOF
  1. Фильтр посланника
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: http-service-svc-header-filter
  namespace: http
spec:
  workloadLabels:
    app: http-service-svc
    namespace: http
  filters:
  - listenerMatch:
      portNumber: 5000
      listenerType: SIDECAR_INBOUND 
      listenerProtocol: HTTP
    filterName: envoy.lua
    filterType: HTTP
    filterConfig:
      inlineCode: |
          function envoy_on_request(request_handle)
                request_handle:headers():add("newheader", "it works!")
            end

Я могу связаться со своим сервисом через Istio Ingress Gateway, но проблема в том, что фильтр полностью игнорирует. Я также попытался определить добавление фильтра в пространство имен istio-system без workloadSelector, но он по-прежнему игнорируется.

Кто-нибудь знает, где может быть проблема?


person Rosario Laface    schedule 30.04.2021    source источник
comment
Можете ли вы сделать следующее: github.com/istio/istio/issues/31192 а дайте знать?   -  person Matt    schedule 06.05.2021


Ответы (1)


Проблема в том, что вы применяете старую версию API EnvoyFilter, которая не поддерживается istio 1.9.

Для справки см. документы EnvoyFilter.

Это должно работать:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: http-service-svc-header-filter
  namespace: http
spec:
  workloadSelector:
    labels:
      app: http
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: SIDECAR_INBOUND
      listener:
        portNumber: 5000
        filterChain:
          filter:
            name: "envoy.filters.network.http_connection_manager"
            subFilter:
              name: "envoy.filters.http.router"
    patch:
      operation: INSERT_BEFORE
      value: 
       name: envoy.lua
       typed_config:
          "@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
          inlineCode: |
            function envoy_on_request(request_handle)
              request_handle:headers():add("newheader", "it works!")
            end
person Chris    schedule 30.04.2021
comment
спасибо за ваш ответ, я тоже пробовал это, но это все равно не работает :( Я отправляю запросы от почтальона с настраиваемыми заголовками, я вижу настраиваемые заголовки, зарегистрированные в микросервисе, но я не вижу новый заголовок из фильтра. Я больше не знаю, где искать. - person Rosario Laface; 03.05.2021
comment
В своем Deployment вы устанавливаете метку app: http. В фильтре вы устанавливаете workloadSelector для соответствия метке app: http-service-svc, но он должен совпадать с метками модулей. Я обновил свой ответ, попробуйте еще раз. - person Chris; 03.05.2021
comment
Я использовал предоставленную вами обновленную конфигурацию, но ничего не происходит :( Есть ли какой-нибудь журнал, который я мог бы использовать для отладки того, что происходит в прокси-сервере? - person Rosario Laface; 03.05.2021
comment
Фильтр должен работать, он почти идентичен тому, который я использую. Еще раз проверьте свою конфигурацию. Например, ваш Deployment находится не в пространстве имен http, а EnvoyFilter и VirtualService. В качестве альтернативы вы можете применить его к входному шлюзу, изменив пространство имен на istio-system, контекст на GATEWAY и удалив номер порта (см. docs -› search GATEWAY) - person Chris; 03.05.2021
comment
Что касается отладки: вы можете запустить istioctl dashboard envoy, сбросить конфигурацию envoy и посмотреть, правильно ли установлен фильтр. - person Chris; 03.05.2021
comment
Мне удалось включить еще несколько логов. В моем журнале появляется envoy_on_request() function not found. ошибка. Как исправить синтаксис скрипта? - person Rosario Laface; 04.05.2021