Розширення waypoint за допомогою Lua-скриптів
Istio надає можливість розширювати проксі waypoint за допомогою вбудованих скриптів Lua через API TrafficExtension. У режимі ambient ресурси TrafficExtension мають бути прикріплені до проксі waypoint за допомогою targetRefs.
Перед початком
Налаштуйте Istio, дотримуючись посібника з початку роботи в режимі ambient.
Розгорніть приклад застосунку Bookinfo.
Розгорніть приклад застосунку curl як тестове джерело:
$ kubectl apply -f @samples/curl/curl.yaml@
На шлюзі
Отримайте імʼя шлюзу:
$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE
bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 42mСтворіть TrafficExtension, який націлюється на bookinfo-gateway, з фільтром парності Lua. Фільтр читає заголовок запиту x-number і додає заголовок відповіді x-parity, який вказує, чи є значення odd чи even. Значення зберігається в динамічних метаданих під час обробки запиту, щоб воно було доступним під час запису заголовка відповіді:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: parity-at-gateway
spec:
targetRefs:
- kind: Gateway
group: gateway.networking.k8s.io
name: bookinfo-gateway
phase: STATS
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Перевірка трафіку через шлюз
$ kubectl exec deploy/curl -- curl -s -o /dev/null -D - -H "x-number: 4" "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage" | grep x-parity
x-parity: evenНа waypoint, для всіх сервісів у просторі імен
Розгортання проксі waypoint
Дотримуйтеся інструкцій з розгортання waypoint, щоб розгорнути проксі waypoint у просторі імен bookinfo:
$ istioctl waypoint apply --enroll-namespace --waitПеревірте, що трафік досягає сервісу:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
200Отримайте імʼя шлюзу waypoint:
$ kubectl get gateway
NAME CLASS ADDRESS PROGRAMMED AGE
bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 23h
waypoint istio-waypoint 10.96.202.82 True 21hСтворіть TrafficExtension, який орієнтований на waypoint:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: parity-at-waypoint
spec:
targetRefs:
- kind: Gateway
group: gateway.networking.k8s.io
name: waypoint
phase: STATS
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Перевірка трафіку через проксі waypoint
$ kubectl exec deploy/curl -- curl -s -o /dev/null -D - -H "x-number: 7" http://productpage:9080/productpage | grep x-parity
x-parity: oddНа waypoint, для конкретного сервісу
Видаліть фільтр для всього простору імен і замініть його на той, що націлюється лише на сервіс reviews:
$ kubectl delete trafficextension parity-at-waypointСтворіть TrafficExtension, який націлюється безпосередньо на сервіс reviews, щоб фільтр застосовувався лише до трафіку, призначеного для цього сервісу:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: parity-for-reviews
spec:
targetRefs:
- kind: Service
group: ""
name: reviews
match:
- mode: SERVER
phase: STATS
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Перевірка трафіку, призначеного для сервісу
$ kubectl exec deploy/curl -- curl -s -o /dev/null -D - -H "x-number: 3" http://reviews:9080/reviews/1 | grep x-parity
x-parity: oddОчищення
Видаліть ресурси
TrafficExtension:$ kubectl delete trafficextension parity-at-gateway parity-for-reviewsДотримуйтеся посібника з видалення в режимі ambient, щоб видалити Istio та прикладні тестові застосунки.