Розширюйте waypoint з втулками WebAssembly
Istio надає можливість розширити свої функціональні можливості за допомогою WebAssembly (Wasm). Однією з ключових переваг розширюваності Wasm є те, що розширення можуть завантажуватися динамічно під час роботи. У цьому документі описується, як розширити режим ambient в Istio за допомогою можливостей Wasm. У режимі ambient конфігурація Wasm повинна бути застосована до waypoint-проксі, розгорнутого в кожному просторі імен.
Перед початком роботи
Налаштуйте Istio, дотримуючись інструкцій у посібнику з початку роботи в режимі ambient.
Розгорніть демонстраційний застосунок Bookinfo.
Розгорніть демонстраційний застосунок curl, щоб використовувати його як джерело для надсилання тестових запитів.
$ 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
Перевірте
/productpageбез облікових даних:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage" 401Перевірте
/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-проксі
Перевірте внутрішню точку доступу
/productpageбез облікових даних:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage 401Перевірте внутрішню точку доступу
/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Перевірка трафіку до сервісу
Перевірте внутрішню точку доступу
/productpageз обліковими даними, налаштованими на загальному проксіwaypoint:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage 200Перевірте внутрішню точку доступу
/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Перевірте внутрішню точку доступу
/reviewsбез облікових даних:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1 401
Виконуючи команду без облікових даних, ви переконаєтеся, що доступ до внутрішньої точки доступу /productpage повертає відповідь 401 (неавторизовано), що демонструє очікувану поведінку — неможливість доступу до ресурсу без відповідних автентифікаційних даних.
Очищення
Видаліть конфігурацію WasmPlugin:
$ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-serviceДотримуйтесь керівництва з видалення в режимі ambient, щоб видалити Istio та демонстраційні застосунки.