Розширення waypoint за допомогою Lua-скриптів

Istio надає можливість розширювати проксі waypoint за допомогою вбудованих скриптів Lua через API TrafficExtension. У режимі ambient ресурси TrafficExtension мають бути прикріплені до проксі waypoint за допомогою targetRefs.

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

  1. Налаштуйте Istio, дотримуючись посібника з початку роботи в режимі ambient.

  2. Розгорніть приклад застосунку Bookinfo.

  3. Додайте типовий простір імен до ambient мережі.

  4. Розгорніть приклад застосунку curl як тестове джерело:

    Zip
    $ 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

Очищення

  1. Видаліть ресурси TrafficExtension:

    $ kubectl delete trafficextension parity-at-gateway parity-for-reviews
  2. Дотримуйтеся посібника з видалення в режимі ambient, щоб видалити Istio та прикладні тестові застосунки.

Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

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