Ejecutar scripts Lua
Istio proporciona la capacidad de extender la funcionalidad del proxy usando scripts Lua inline
a través de la API TrafficExtension.
Los filtros Lua son una alternativa ligera a WebAssembly
para transformaciones simples de requests y responses — el script se embebe directamente en el recurso y
se ejecuta dentro del proxy Envoy, sin requerir distribución de módulos.
Antes de comenzar
Despliega la aplicación de ejemplo Bookinfo.
Configurar un script Lua
Un script Lua debe definir una o ambas de las siguientes funciones:
envoy_on_request(request_handle): se llama para cada request entranteenvoy_on_response(response_handle): se llama para cada response saliente
Los handles proporcionan acceso a headers, body, metadata y logging. Consulta la documentación del filtro Lua de Envoy para la API completa.
En este ejemplo, agregarás un filtro Lua al ingress gateway que lee un header de request x-number
y responde con un header x-parity indicando si el valor es odd (impar) o even (par). El
valor se lee durante el procesamiento del request y se almacena en metadatos dinámicos para que esté disponible al
escribir el header de response:
$ kubectl apply -f - <<EOF
apiVersion: extensions.istio.io/v1alpha1
kind: TrafficExtension
metadata:
name: parity
namespace: istio-system
spec:
selector:
matchLabels:
istio: ingressgateway
phase: AUTHN
lua:
inlineCode: |
function envoy_on_request(request_handle)
local number = tonumber(request_handle:headers():get("x-number"))
if number == nil then return end
local parity = number % 2 == 0 and "even" or "odd"
request_handle:streamInfo():dynamicMetadata():set(
"envoy.filters.http.lua", "parity", parity)
end
function envoy_on_response(response_handle)
local meta = response_handle:streamInfo():dynamicMetadata():get(
"envoy.filters.http.lua")
if meta == nil then return end
response_handle:headers():add("x-parity", meta["parity"])
end
EOFVerificar el script Lua
Determina la IP y el puerto del ingress.
Envía un request con un header x-number y verifica que x-parity esté configurado en la response:
$ curl -s -o /dev/null -D - -H "x-number: 42" "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | grep x-parity
x-parity: even$ curl -s -o /dev/null -D - -H "x-number: 7" "http://$INGRESS_HOST:$INGRESS_PORT/productpage" | grep x-parity
x-parity: oddOrden y alcance
Cuando múltiples recursos TrafficExtension apuntan al mismo workload, el orden de ejecución se controla
mediante phase y priority.
phaseestablece la posición amplia en la cadena de filtros:AUTHN,AUTHZoSTATS. Las extensiones sin phase se insertan cerca del final de la cadena, antes del router.prioritydesempata dentro del mismo phase. Los valores más altos se ejecutan primero.
El campo match restringe un TrafficExtension a tráfico específico por modo y puerto:
spec:
match:
- mode: SERVER
ports:
- number: 8080Los modos válidos son CLIENT (saliente), SERVER (entrante) y CLIENT_AND_SERVER (ambos, el valor por defecto).
Limpieza
$ kubectl delete trafficextension -n istio-system parity