Розширюйте waypoint з втулками WebAssembly

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

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

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

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

  3. Додайте простір імен default до ambient mesh.

  4. Розгорніть демонстраційний застосунок curl, щоб використовувати його як джерело для надсилання тестових запитів.

    Zip
    $ kubectl apply -f @samples/curl/curl.yaml@

На шлюзі

Завдяки Kubernetes Gateway API, Istio надає централізовану точку входу для керування трафіком у сервісних мережах. Ми налаштуємо WasmPlugin на рівні шлюзу, забезпечуючи, щоб весь трафік, який проходить через шлюз, підлягав розширеним правилам автентифікації.

Налаштування втулка WebAssembly для шлюзу

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

Щоб налаштувати фільтр WebAssembly з віддаленим модулем Wasm, створіть ресурс WasmPlugin, націлений на bookinfo-gateway:

$ kubectl get gateway
NAME               CLASS            ADDRESS                                            PROGRAMMED   AGE
bookinfo-gateway   istio            bookinfo-gateway-istio.default.svc.cluster.local   True         42m
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: basic-auth-at-gateway
spec:
  targetRefs:
    - kind: Gateway
      group: gateway.networking.k8s.io
      name: bookinfo-gateway # ім'я шлюзу, отримане з попереднього кроку
  url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
  phase: AUTHN
  pluginConfig:
    basic_auth_rules:
      - prefix: "/productpage"
        request_methods:
          - "GET"
          - "POST"
        credentials:
          - "ok:test"
          - "YWRtaW4zOmFkbWluMw=="
EOF

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

Перевірка трафіку через Gateway

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

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
    401
  2. Перевірте /productpage з обліковими даними, налаштованими у ресурсі WasmPlugin:

    $ kubectl exec deploy/curl -- curl -s -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" -w "%{http_code}" "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage"
    200

На waypoint для всіх сервісів у просторі імен

Waypoint-проксі відіграють важливу роль у режимі ambient Istio, забезпечуючи безпечну та ефективну комунікацію в межах mesh-мережі. Нижче ми розглянемо, як застосувати конфігурацію Wasm до 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

Налаштування втулка WebAssembly для waypoint

Щоб налаштувати фільтр WebAssembly з віддаленим модулем Wasm, створіть ресурс WasmPlugin, який націлюється на gateway 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
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: basic-auth-at-waypoint
spec:
  targetRefs:
    - kind: Gateway
      group: gateway.networking.k8s.io
      name: waypoint # ім'я gateway, отримане з попереднього кроку
  url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
  phase: AUTHN
  pluginConfig:
    basic_auth_rules:
      - prefix: "/productpage"
        request_methods:
          - "GET"
          - "POST"
        credentials:
          - "ok:test"
          - "YWRtaW4zOmFkbWluMw=="
EOF

Перегляд сконфігурованого втулка

$ kubectl get wasmplugin
NAME                     AGE
basic-auth-at-gateway    28m
basic-auth-at-waypoint   14m

Перевірка трафіку через waypoint-проксі

  1. Перевірте внутрішню точку доступу /productpage без облікових даних:

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
    401
  2. Перевірте внутрішню точку доступу /productpage з обліковими даними:

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage
    200

На waypoint для конкретного сервісу

Щоб налаштувати фільтр WebAssembly з віддаленим модулем Wasm для конкретного сервісу, створіть ресурс WasmPlugin, який націлюється безпосередньо на цей сервіс.

Створіть WasmPlugin, націлений на сервіс reviews, щоб розширення застосовувалося лише до цього сервісу. У цій конфігурації автентифікаційний токен і префікс налаштовані спеціально для сервісу reviews, забезпечуючи, що лише запити, спрямовані до нього, підлягають цьому механізму автентифікації.

$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: basic-auth-for-service
spec:
  targetRefs:
    - kind: Service
      group: ""
      name: reviews
  url: oci://ghcr.io/istio-ecosystem/wasm-extensions/basic_auth:1.12.0
  phase: AUTHN
  pluginConfig:
    basic_auth_rules:
      - prefix: "/reviews"
        request_methods:
          - "GET"
          - "POST"
        credentials:
          - "ok:test"
          - "MXQtaW4zOmFkbWluMw=="
EOF

Перевірка трафіку до сервісу

  1. Перевірте внутрішню точку доступу /productpage з обліковими даними, налаштованими на загальному проксі waypoint:

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage
    200
  2. Перевірте внутрішню точку доступу /reviews з обліковими даними, налаштованими на конкретному проксі reviews-svc-waypoint:

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic MXQtaW4zOmFkbWluMw==" http://reviews:9080/reviews/1
    200
  3. Перевірте внутрішню точку доступу /reviews без облікових даних:

    $ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1
    401

Виконуючи команду без облікових даних, ви переконаєтеся, що доступ до внутрішньої точки доступу /productpage повертає відповідь 401 (неавторизовано), що демонструє очікувану поведінку — неможливість доступу до ресурсу без відповідних автентифікаційних даних.

Очищення

  1. Видаліть конфігурацію WasmPlugin:

    $ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-service
  2. Дотримуйтесь керівництва з видалення в режимі ambient, щоб видалити Istio та демонстраційні застосунки.

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

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