Envoy y Apache APISIX: Otra forma de implementar Envoy Filter

API7.ai

December 16, 2020

Technology

Formas de implementar el filtro Envoy

Filtro Envoy

Envoy es un proxy de capa 7 y un bus de comunicación diseñado para grandes arquitecturas orientadas a servicios modernas. Un mecanismo de cadena de filtros enchufable permite escribir filtros para realizar diferentes tareas e insertarlos en el servidor principal.

Filtro Envoy

Método de expansión

Los filtros existentes pueden no cumplir con los requisitos personalizados del usuario. En este caso, es necesario extender Envoy. Personaliza nuevos filtros según la cadena de filtros existente para lograr los requisitos de personalización.

Los desarrolladores pueden extender Envoy de tres maneras:

Dificultad de inicioEstabilidadEficiencia de desarrolloDespliegue y compilación
C++AltaEstableBajaTiempo prolongado para compilar
LuaBajaEstableAltaNo es necesario compilar, se despliega directamente
WASMMedia-altaInciertaDepende del lenguajeEl tiempo de compilación depende del lenguaje
  1. Usar C++ para extender

En este método, se escribe código C++ directamente sobre la base de Envoy para mejorar la funcionalidad. Después de implementar un filtro personalizado, se recompila el nuevo archivo binario para completar la actualización. Este método tiene dos problemas:

  • Limitado por el lenguaje C++, dificultad de inicio, escasez de desarrolladores.
  • Aumenta la complejidad del despliegue, operación, mantenimiento y actualizaciones. Envoy se volverá cada vez más pesado, y cada cambio requiere recompilar el archivo binario, lo que no es favorable para la iteración y la gestión.
  1. Usar Lua para extender

Lua está diseñado para ser incrustado en aplicaciones, proporcionando características de extensión y personalización flexibles, y es ampliamente utilizado.

El filtro Lua permite ejecutar scripts Lua en el proceso de solicitud y respuesta. Las principales características actualmente soportadas incluyen: inspección de encabezados, cuerpo y trailers durante el flujo en la solicitud o respuesta; modificación de encabezados y trailers; bloqueo y almacenamiento en búfer del cuerpo completo de la solicitud/respuesta para inspección; realización de una llamada HTTP asíncrona a un host upstream; realización de una respuesta directa y omisión de la iteración adicional de filtros, etc.

Actualmente, muchas personas distribuyen directamente el código Lua en la configuración, lo que no es favorable para la organización y gestión del código, y es difícil compartirlo con otros para formar un ecosistema.

  1. Usar WASM para extender

Los desarrolladores pueden escribir filtros en su propio lenguaje de programación, compilarlos en formato WASM usando herramientas e incrustarlos en Envoy para ejecutarlos.

Actualmente soporta pocos lenguajes, y usar estos lenguajes para extender aún no es tan simple. Por otro lado, muchas personas aún tienen reservas sobre WASM y pueden no usarlo directamente.

Solución de Apache APISIX

Basado en el análisis anterior, podemos ver que Lua es muy adecuado para extender Envoy, es fácil de aprender y la eficiencia de desarrollo es extremadamente alta. Debido a que está incrustado en Envoy, no hay sobrecarga adicional de red y el rendimiento es bueno.

La comunidad de Apache APISIX propone su propia solución basada en Lua, que es proporcionar una biblioteca base poderosa y flexible para implementar todos los plugins de Apache APISIX y los plugins que se desarrollarán en el futuro para que se ejecuten en Envoy. Los desarrolladores también pueden desarrollar sus propios plugins personalizados basados en esta biblioteca base.

Apache APISIX es una puerta de enlace API dinámica, en tiempo real y de alto rendimiento, basada en la biblioteca Nginx y Lua. Apache APISIX proporciona ricas características de gestión de tráfico como balanceo de carga, upstream dinámico, lanzamiento canario, corte de circuito, autenticación, observabilidad y más.

Ejemplo

Por favor, revisa el repositorio para el código específico y cómo ejecutarlo: https://github.com/api7/envoy-apisix.

La configuración relevante de Envoy es la siguiente:

Definir un Filtro:

http_filters:
  - name: entry.lua
    typed_config:
      "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
      source_codes:
        entry.lua:
          filename: /apisix/entry.lua

Habilitar el Filtro para una ruta y configurarlo con metadatos:

routes:
  - match:
      prefix: "/foo"
    route:
      cluster: web_service
    typed_per_filter_config:
      envoy.filters.http.lua:
        "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.LuaPerRoute
        name: entry.lua
    metadata:
      filter_metadata:
        envoy.filters.http.lua:
          plugins:
            - name: uri-blocker
              conf:
                rejected_code: 403
                block_rules:
                  - root.exe
                  - root.m+

Cómo funciona

No necesitamos hacer cambios importantes en Envoy, solo algunas optimizaciones que son adecuadas para necesidades públicas.

Protegemos las diferencias de plataforma para la capa de plugins. Todas las interfaces que necesitan ser utilizadas están abstraídas en el marco subyacente, que llamamos apisix.core, para que todos los plugins puedan ejecutarse en Envoy y Apache APISIX al mismo tiempo.

Diagrama de arquitectura

Usamos el ejemplo anterior para mostrar cómo se ejecuta el plugin:

Flujo de trabajo del plugin

Primer paso, leer la configuración

Configuramos a través de metadatos para determinar qué plugins necesitan ejecutarse en cada ruta y qué configuración tiene cada plugin. En el ejemplo, configuramos el plugin uri-blocker para la ruta cuyo prefijo es ​​/foo, así como la regla de bloqueo del plugin y el estado de respuesta cuando se requiere un bloqueo.

Segundo paso, analizar la solicitud

Encapsulamos los datos de la solicitud del cliente en ctx para que puedan usarse directamente en todo el proceso.

Tercer paso, ejecutar el plugin

Determinamos si necesitamos bloquear esta solicitud comparando las reglas configuradas y el uri obtenido. Si se necesita un bloqueo, llamamos a respond para responder directamente, de lo contrario lo dejamos pasar.

Perspectivas futuras

Cada vez más plugins de APISIX están disponibles para ejecutarse en Envoy, y finalmente todos los plugins de APISIX (incluso los que se desarrollarán en el futuro) estarán disponibles para ejecutarse en Envoy.

Al mismo tiempo, esperamos poder colaborar con la comunidad de Envoy en la dirección del filtro Lua, optimizar y mejorar el filtro Lua, mejorar las capacidades de expansión de Envoy y reducir la dificultad de expansión de Envoy.

Tags: