Extender waypoints con plugins de WebAssembly
Istio proporciona la capacidad de extender su funcionalidad usando WebAssembly (Wasm). Una de las ventajas clave de la extensibilidad de Wasm es que las extensiones se pueden cargar dinámicamente en tiempo de ejecución. Este documento describe cómo extender el modo ambient dentro de Istio con características de Wasm. En el modo ambient, la configuración de Wasm debe aplicarse al proxy de waypoint desplegado en cada namespace.
Antes de empezar
Configura Istio siguiendo las instrucciones de la guía de introducción al modo ambient.
Despliega la aplicación de ejemplo Bookinfo.
Despliega la aplicación de ejemplo curl para usarla como fuente de prueba para enviar solicitudes.
$ kubectl apply -f @samples/curl/curl.yaml@
En una gateway
Con la API de Gateway de Kubernetes, Istio proporciona un punto de entrada centralizado para gestionar el tráfico hacia la service mesh. Configuraremos un WasmPlugin a nivel de gateway, asegurando que todo el tráfico que pase por la gateway esté sujeto a las reglas de autenticación extendidas.
Configurar un plugin de WebAssembly para una gateway
En este ejemplo, agregarás un módulo de autenticación Básica HTTP a tu malla. Configurarás Istio para que extraiga el módulo de autenticación Básica de un registro de imágenes remoto y lo cargue. Se configurará para que se ejecute en las llamadas a /productpage. Estos pasos son similares a los de Distribución de módulos de WebAssembly, con la diferencia del uso del campo targetRefs en lugar de los selectores de etiquetas.
Para configurar un filtro de WebAssembly con un módulo Wasm remoto, crea un recurso WasmPlugin que apunte a la 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 # nombre de la gateway recuperado del paso anterior
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=="
EOFSe inyectará un filtro HTTP en la gateway como un filtro de autenticación. El agente de Istio interpretará la configuración de WasmPlugin, descargará los módulos Wasm remotos del registro de imágenes OCI a un archivo local e inyectará el filtro HTTP en la gateway haciendo referencia a ese archivo.
Verificar el tráfico a través de la gateway
Probar
/productpagesin credenciales:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage" 401Probar
/productpagecon las credenciales configuradas en el recurso 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
En un waypoint, para todos los servicios en un namespace
Los proxies de waypoint juegan un papel crucial en el modo ambient de Istio, facilitando una comunicación segura y eficiente dentro de la service mesh. A continuación, exploraremos cómo aplicar la configuración de Wasm al waypoint, mejorando la funcionalidad del proxy de forma dinámica.
Desplegar un proxy de waypoint
Sigue las instrucciones de despliegue de waypoint para desplegar un proxy de waypoint en el namespace de bookinfo.
$ istioctl waypoint apply --enroll-namespace --waitVerificar que el tráfico llega al servicio:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
200Configurar un plugin de WebAssembly para un waypoint
Para configurar un filtro de WebAssembly con un módulo Wasm remoto, crea un recurso WasmPlugin que apunte a la 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 # nombre de la gateway recuperado del paso anterior
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=="
EOFVer el plugin configurado
$ kubectl get wasmplugin
NAME AGE
basic-auth-at-gateway 28m
basic-auth-at-waypoint 14mVerificar el tráfico a través del proxy de waypoint
Probar
/productpageinterno sin credenciales:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage 401Probar
/productpageinterno con credenciales:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage 200
En un waypoint, para un servicio específico
Para configurar un filtro de WebAssembly con un módulo Wasm remoto para un servicio específico, crea un recurso WasmPlugin que apunte directamente al servicio específico.
Crea un WasmPlugin que apunte al servicio reviews para que la extensión se aplique solo al servicio reviews. En esta configuración, el token de autenticación y el prefijo se adaptan específicamente para el servicio de revisiones, asegurando que solo las solicitudes dirigidas a él estén sujetas a este mecanismo de autenticación.
$ 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=="
EOFVerificar el tráfico que apunta al Servicio
Probar el
/productpageinterno con las credenciales configuradas en el proxywaypointgenérico:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage 200Probar el
/reviewsinterno con las credenciales configuradas en el proxyreviews-svc-waypointespecífico:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic MXQtaW4zOmFkbWluMw==" http://reviews:9080/reviews/1 200Probar
/reviewsinterno sin credenciales:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://reviews:9080/reviews/1 401
Al ejecutar el comando proporcionado sin credenciales, se verifica que el acceso al /productpage interno da como resultado una respuesta 401 no autorizada, lo que demuestra el comportamiento esperado de no poder acceder al recurso sin las credenciales de autenticación adecuadas.
Limpieza
Eliminar la configuración de WasmPlugin:
$ kubectl delete wasmplugin basic-auth-at-gateway basic-auth-at-waypoint basic-auth-for-serviceSigue la guía de desinstalación del modo ambient para eliminar Istio y las aplicaciones de prueba de ejemplo.