Как установить хеш на Istio на основе идентификатора URL?

В контексте улучшения API в Kubernetes я рассматриваю возможность использования распределенной хеш-таблицы. Мой API всегда получает запросы к URL-адресу с такой схемой:

      www.myapi.com/id

Читая документацию Istio, я понимаю, что получить то, что я хочу, довольно просто и легко. Действительно, Istio поддерживает схему балансировки нагрузки, которая называется . В такой схеме место назначения службы выбирается в соответствии с хешем, вычисленным из нескольких возможных полей: имя заголовка HTTP, файл cookie, исходный IP-адрес и имя параметра запроса HTTP.

В моем случае мне нужно будет вычислить хэш в соответствии с запросом.

У меня вопрос двойной и условный:

  1. Можно ли прочитать как имя параметра HTTP?
  2. Если да, как мне указать правило в манифесте? (документ, который я прочитал, недостаточно ясен в этом отношении).

Если отрицательно, какая идея? какая-то уловка? Например, я рассматриваю возможность добавления идентификатора в качестве HTTP-заголовка с помощью `Nginx, но это добавит дополнительный шаг.

2 ответа

Как я уже упоминал в комментариях, если я правильно понимаю, вы ищете путь ConsistenHashLB, об этом есть документация .

По поводу также есть этомупроблема с github .


Что касается вопроса заголовка http, вы можете добавить его с помощью:

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

В документации istio есть часть заголовков, в которой показано, как добавлять / удалять заголовки на примере.

Заголовками сообщений можно управлять, когда Envoy пересылает запросы или ответы от службы назначения. Правила манипулирования заголовками могут быть указаны для конкретного пункта назначения маршрута или для всех пунктов назначения. Следующая VirtualService добавляет тестовый заголовок со значением true к запросам, которые направляются в любое место назначения службы обзоров. Он также удаляет заголовок ответа foo, но только из ответов, поступающих из подмножества v1 (версии) службы отзывов.

      apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews-route
spec:
  hosts:
  - reviews.prod.svc.cluster.local
  http:
  - headers:
      request:
        set:
          test: "true"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
      weight: 25
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v1
      headers:
        response:
          remove:
          - foo
      weight: 75
  1. Фильтр посланника

EnvoyFilter предоставляет механизм для настройки конфигурации Envoy, созданной Istio Pilot. Используйте EnvoyFilter для изменения значений определенных полей, добавления определенных фильтров или даже добавления совершенно новых слушателей, кластеров и т. Д.

Ниже фильтр envoy добавляет заголовок запроса, называемый идентификатором клиента, со значением alice ко всем запросам, проходящим через входной шлюз istio. Я также прокомментировал код для заголовков ответов.

      apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: lua-filter
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway
  configPatches:
  - applyTo: HTTP_FILTER
    match:
      context: GATEWAY
      listener:
        filterChain:
          filter:
            name: "envoy.http_connection_manager"
            subFilter:
              name: "envoy.router"
    patch:
      operation: INSERT_BEFORE
      value:
       name: envoy.lua
       typed_config:
         "@type": "type.googleapis.com/envoy.config.filter.http.lua.v2.Lua"
         inlineCode: |
            function envoy_on_request(request_handle)
                request_handle:headers():add("customer-id", "alice")
            end
           # function envoy_on_response(response_handle)
           #     response_handle:headers():add("customer-id", "alice")
           # end

Это должно быть возможно с веб-сборкой: https://istio.io/latest/docs/concepts/wasm/

(Но у вас будет некоторая работа, чтобы развернуть его)

Другие вопросы по тегам