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

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

www.myapi.com/id

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

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

Мой вопрос двойной и условный:

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

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


person lrleon    schedule 05.04.2021    source источник
comment
Если я правильно понимаю, вы ищете хеш на основе пути/URL запроса? Вы пробовали использовать путь ConsistenHashLB? Об этом есть документация. . Также проверьте эту ошибку github. Что касается вопроса о добавлении заголовка http, вы должны иметь возможность добавить его с помощью VS или Envoy Filter.   -  person Jakub    schedule 06.04.2021
comment
Кажется, все, что мне нужно, включено в ваши ссылки. Я прочитаю их внимательно и рассмотрю немного больше. Благодарю вас!   -  person lrleon    schedule 07.04.2021
comment
Более чем рад помочь! Я разместил этот комментарий как ответ с некоторыми примерами.   -  person Jakub    schedule 13.04.2021


Ответы (2)


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

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


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

  1. Виртуальная служба

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

Заголовки сообщений можно манипулировать, когда 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 filter добавьте заголовок запроса с именем customer-id со значением 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
person Jakub    schedule 13.04.2021
comment
Спасибо за вашу помощь. Очень признателен. Я думаю, что я близок, но есть еще некоторые детали, с которыми я не знаю, как справиться. По сути, учитывая полный URL-адрес, как я могу извлечь идентификатор суффикса, чтобы записать его в качестве заголовка запроса вместо значения Алисы? - person lrleon; 13.04.2021
comment
@Irleon, я не уверен, можно ли извлечь URL-адрес в качестве заголовка, вам может потребоваться запросить это на istio github. Я бы просто добавил какой-нибудь пользовательский заголовок в виртуальный сервис и, основываясь на этом, использовал бы согласованное хеширование, как это сделали здесь. Но я предполагаю, что у вас есть несколько URL-адресов, и это может быть неэффективно в вашем случае использования. - person Jakub; 14.04.2021

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

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

person Peter Claes    schedule 15.04.2021