Виконання WebAssembly модулів

Istio надає можливість розширювати функціональність проксі за допомогою WebAssembly (Wasm). Однією з основних переваг розширюваності Wasm є те, що розширення можуть завантажуватися динамічно під час виконання. Ці розширення спочатку повинні бути розподілені до проксі Envoy. Istio робить це можливим, дозволяючи агенту проксі динамічно завантажувати модулі Wasm.

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

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

Налаштування модуля Wasm

У цьому прикладі ви додасте розширення HTTP Basic auth до вашого mesh. Ви налаштуєте Istio для завантаження модуля Basic auth з віддаленого реєстру образів і завантаження його. Він буде налаштований для роботи при викликах до /productpage.

Щоб налаштувати фільтр WebAssembly з віддаленим модулем Wasm, створіть ресурс TrafficExtension:

$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
  name: basic-auth
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  phase: AUTHN
  wasm:
    url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
    pluginConfig:
      basic_auth_rules:
        - prefix: "/productpage"
          request_methods:
            - "GET"
            - "POST"
          credentials:
            - "ok:test"
            - "YWRtaW4zOmFkbWluMw=="
EOF

HTTP фільтр буде впроваджено в проксі ingress gateway як фільтр автентифікації. Агент Istio інтерпретує конфігурацію TrafficExtension, завантажує віддалені модулі Wasm з реєстру образів OCI до локального файлу і впроваджує HTTP фільтр в Envoy, посилаючись на цей файл.

Перевірка модуля Wasm

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

  1. Перевірте /productpage без облікових даних:

    $ curl -s -o /dev/null -w "%{http_code}" "http://$INGRESS_HOST:$INGRESS_PORT/productpage"
    401
  2. Перевірте /productpage з обліковими даними:

    $ curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" "http://$INGRESS_HOST:$INGRESS_PORT/productpage"
    200

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

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

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

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

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

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

Очищення

$ kubectl delete trafficextension -n istio-system basic-auth

Моніторинг розподілу модулів Wasm

Наступні статистики збираються агентом Istio:

  • istio_agent_wasm_cache_lookup_count: кількість перевірок кешу для віддаленого завантаження Wasm.
  • istio_agent_wasm_cache_entries: кількість перетворень конфігурації Wasm і результатів, включаючи успіх, відсутність віддаленого завантаження, помилки маркування, помилки віддаленого завантаження та пропущені підказки віддаленого завантаження.
  • istio_agent_wasm_config_conversion_duration_bucket: загальний час у мілісекундах, який агент Istio витрачає на перетворення конфігурації для модулів Wasm.
  • istio_agent_wasm_remote_fetch_count: кількість віддалених завантажень Wasm і результатів, включаючи успіх, помилки завантаження та невідповідність контрольної суми.

Якщо конфігурація фільтра Wasm відхиляється через помилку завантаження або інші причини, istiod також видасть pilot_total_xds_rejects з міткою типу type.googleapis.com/envoy.config.core.v3.TypedExtensionConfig.

Розробка розширення Wasm

Щоб дізнатися більше про розробку модулів Wasm, будь ласка, ознайомтеся з посібниками, наданими в репозиторії istio-ecosystem/wasm-extensions, який підтримується спільнотою Istio та використовується для розробки розширення Telemetry Wasm від Istio:

Для отримання додаткових відомостей про API див. довідку TrafficExtension.

Обмеження

Є відомі обмеження з цим механізмом розподілу модулів, які будуть усунені в майбутніх версіях:

  • Підтримуються лише HTTP фільтри.
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

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