Виконання скриптів Lua

Istio надає можливість розширювати функціональність проксі за допомогою вбудованих скриптів Lua через API TrafficExtension. Фільтри Lua є легкою альтернативою WebAssembly для простих перетворень запитів і відповідей — скрипт вбудовується безпосередньо в ресурс і виконується в проксі Envoy, без необхідності розповсюдження модулів.

Перед початком

Розгорніть демонстраційний застосунок Bookinfo.

Налаштування скрипта Lua

Скрипт Lua повинен визначати одну або обидві з наступних функцій:

  • envoy_on_request(request_handle): викликається для кожного вхідного запиту
  • envoy_on_response(response_handle): викликається для кожної вихідної відповіді

Дескриптори надають доступ до заголовків, тіла, метаданих і журналювання. Повний API див. у документації фільтра Lua для Envoy.

У цьому прикладі ви додасте фільтр Lua до ingress gateway, який читає заголовок запиту x-number і відповідає заголовком x-parity, що вказує, чи є значення odd чи even. Значення зчитується під час обробки запиту та зберігається в динамічних метаданих, щоб воно було доступним під час запису заголовка відповіді:

$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
  name: parity
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  phase: AUTHN
  lua:
    inlineCode: |
      function envoy_on_request(request_handle)
        local number = tonumber(request_handle:headers():get("x-number"))
        if number == nil then return end
        local parity = number % 2 == 0 and "even" or "odd"
        request_handle:streamInfo():dynamicMetadata():set(
          "envoy.filters.http.lua", "parity", parity)
      end
      function envoy_on_response(response_handle)
        local meta = response_handle:streamInfo():dynamicMetadata():get(
          "envoy.filters.http.lua")
        if meta == nil then return end
        response_handle:headers():add("x-parity", meta["parity"])
      end
EOF

Перевірка скрипта Lua

Визначте IP-адресу та порт ingress.

Надішліть запит із заголовком x-number і перевірте, що у відповіді встановлено x-parity:

$ curl -s -o /dev/null -D - -H "x-number: 42" "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | grep x-parity
x-parity: even
$ curl -s -o /dev/null -D - -H "x-number: 7" "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | grep x-parity
x-parity: odd

Впорядкування та область застосування

Коли кілька ресурсів TrafficExtension націлені на одне й те саме робоче навантаження, порядок виконання контролюється за допомогою phase та priority.

  • phase визначає загальну позицію в ланцюжку фільтрів: AUTHN, AUTHZ або STATS. Розширення без фази вставляються ближче до кінця ланцюжка, перед маршрутизатором.
  • priority визначає порядок у межах однієї фази. Вищі значення виконуються першими.

Поле match обмежує TrafficExtension певним трафіком за режимом і портом:

spec:
  match:
  - mode: SERVER
    ports:
    - number: 8080

Дійсні режими: CLIENT (вихідний), SERVER (вхідний) та CLIENT_AND_SERVER (обидва, за замовчуванням).

Очищення

$ kubectl delete trafficextension -n istio-system parity
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!