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=="
EOF
Se 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
/productpage
sin credenciales:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null "http://bookinfo-gateway-istio.default.svc.cluster.local/productpage" 401
Probar
/productpage
con 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 --wait
Verificar que el tráfico llega al servicio:
$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage
200
Configurar 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=="
EOF
Ver el plugin configurado
$ kubectl get wasmplugin
NAME AGE
basic-auth-at-gateway 28m
basic-auth-at-waypoint 14m
Verificar el tráfico a través del proxy de waypoint
Probar
/productpage
interno sin credenciales:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null http://productpage:9080/productpage 401
Probar
/productpage
interno 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=="
EOF
Verificar el tráfico que apunta al Servicio
Probar el
/productpage
interno con las credenciales configuradas en el proxywaypoint
genérico:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic YWRtaW4zOmFkbWluMw==" http://productpage:9080/productpage 200
Probar el
/reviews
interno con las credenciales configuradas en el proxyreviews-svc-waypoint
específico:$ kubectl exec deploy/curl -- curl -s -w "%{http_code}" -o /dev/null -H "Authorization: Basic MXQtaW4zOmFkbWluMw==" http://reviews:9080/reviews/1 200
Probar
/reviews
interno 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-service
Sigue la guía de desinstalación del modo ambient para eliminar Istio y las aplicaciones de prueba de ejemplo.