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 entrante
  • envoy_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
EOF

Verificar 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: odd

Orden y alcance

Cuando múltiples recursos TrafficExtension apuntan al mismo workload, el orden de ejecución se controla mediante phase y priority.

  • phase establece la posición amplia en la cadena de filtros: AUTHN, AUTHZ o STATS. Las extensiones sin phase se insertan cerca del final de la cadena, antes del router.
  • priority desempata 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: 8080

Los 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
¿Fue útil esta información?
¿Tienes alguna sugerencia para mejorar?

¡Gracias por tus comentarios!