Розширюйте 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 та демонстраційні застосунки.