Виконання скриптів 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