¿Por qué el APISIX Ingress Controller es mejor que el NGINX Ingress Controller?

Xin Rong

December 6, 2022

Products

Ingress expone servicios en Kubernetes, donde el enrutamiento del tráfico se controla mediante reglas configuradas en el recurso Ingress. Para satisfacer un Ingress, también debes tener un controlador Ingress.

En este artículo, compararemos dos controladores Ingress populares para brindar a los lectores información sobre cómo seleccionar controladores Ingress.

  • Ingress-NGINX es un controlador Ingress implementado por la comunidad de Kubernetes y es ampliamente utilizado en la comunidad.
  • APISIX Ingress controller utiliza Apache APISIX, un proyecto de código abierto bajo la ASF (Apache Software Foundation), como su plano de datos.

Ingress NGINX vs. APISIX Ingress

Comparación de características

La siguiente tabla compara las características básicas de Ingress NGINX y APISIX Ingress, incluyendo protocolos, sondeos/resiliencias de upstream, estrategias de balanceador de carga, autenticación, integración con Kubernetes, etc. La tabla está extraída de learnk8s.io.

Producto/ProyectoIngress NGINXApache APISIX Ingress
1. Información general
Basado ennginxnginx
2. Protocolos
HTTP/HTTPS✔️✔️
HTTP2✔️✔️
gRPC✔️✔️
TCPParcial✔️
TCP+TLS✖︎✔️
UDPParcial✔️
Websockets✔️✔️
Proxy Protocol✔️✔️
QUIC/HTTP3Vista previaVista previa
3. Clientes
Limitación de tasa (L7)✔️✔️
WAF✔️Parcial
Tiempos de espera✔️✔️
Lista blanca/Lista negra✔️✔️
Autenticación✔️✔️
Autorización✖︎✔️
4. Enrutamiento de tráfico
Host✔️✔️
Ruta✔️✔️
Encabezados✔️✔️
Cadena de consulta✔️✔️
Método✔️✔️
ClientIP✔️✔️
5. Sondas/resiliencia de upstream
Chequeos de salud✖︎✔️
Reintentos✔️✔️
Cortocircuito✖︎✔️
6. Estrategias de balanceador de carga
Round robin✔️✔️
Sesiones persistentes✔️✔️
Mínimas conexiones✖︎✔️
Hash de anillo✔️✔️
Balanceo de carga personalizado✖︎✔️
7. Autenticación
Autenticación básica✔️✔️
Autenticación externa✔️✔️
Certificado de cliente - mTLS✔️✔️
OAuth✔️✔️
OpenID✖︎✔️
JWT✖︎✔️
LDAP✖︎✔️
HMAC✖︎✔️
8. Observabilidad
Registros✔️✔️
Métricas✔️✔️
Trazabilidad✔️✔️
9. Integración con Kubernetes
EstadoKubernetesKubernetes
CRD✖︎✔️
AlcanceClusterwide
namespace
namespace
Soporte para la API Gateway✖︎Vista previa
Integración con mallas de servicio✔️✔️
10. Formación de tráfico
Canary✔️✔️
Afinidad de sesión✔️✔️
Espejo de tráfico✔️✔️
11. Otros
Recarga en caliente✔️✔️
Integración con LetsEncrypt✔️✔️
Soporte para certificados comodín✔️✔️
Configuración de recarga en calienteVista previa✔️
Descubrimiento de servicios✔️

Diferencias

Podemos ver en la siguiente figura que hay más funciones y características integradas en APISIX Ingress que en Ingress NGINX, incluyendo soporte de protocolos, chequeos de salud y cortocircuitos, autenticación, integración con Kubernetes, etc.

diferencia de características entre Ingress NGINX y APISIX Ingress

Descubrimiento de servicios

En la arquitectura de microservicios, la aplicación se divide en muchos microservicios. Cada vez que un microservicio falla o un servicio se escala hacia arriba o hacia abajo, el llamador debe ser notificado lo antes posible para evitar fallos en las llamadas. Por lo tanto, el mecanismo de registro y descubrimiento de servicios es vital en la arquitectura de microservicios, generalmente mantenido por el registro de servicios.

Descubrimiento de serviciosIngress NGINXApache APISIX Ingress
Kubernetes✔️✔️
DNS✔️
nacos✔️
eureka✔️
consul_kv✔️

Soporte de protocolos

Aunque ambos Ingress admiten el protocolo HTTP/HTTPS, APISIX admite más protocolos. Soporta TLS para cifrar el tráfico TCP. También admite MQTT, Dubbo, y kafka para proxy.

Sondas/resiliencia de upstream

Chequeos de salud

Cuando un nodo falla o migra, es inevitable que el nodo no esté disponible. Si una gran cantidad de solicitudes acceden a estos nodos no disponibles, causará pérdida de tráfico e interrupción del negocio. Por lo tanto, es necesario realizar chequeos de salud en los nodos utilizando sondas y dirigir las solicitudes a nodos saludables, reduciendo así la pérdida de tráfico.

La funcionalidad de chequeo de salud aún no es compatible en Ingress NGINX, pero APISIX Ingress proporciona esta funcionalidad:

  • Chequeo activo: Utiliza sondas para asegurar que los Pods en el backend estén saludables. Cuando N sondas consecutivas enviadas a un nodo fallan, el nodo se marcará como no saludable. El balanceador de carga ignorará los nodos no saludables para que no puedan recibir solicitudes. Habilitar los chequeos de salud activos puede deshabilitar efectivamente los Pods no saludables para evitar la pérdida de tráfico.
  • Chequeo pasivo: El chequeo de salud pasivo no necesita iniciar sondas adicionales. Cada solicitud enviada al nodo actúa como una sonda. Si N solicitudes consecutivas a un nodo saludable fallan, el nodo se marcará como no saludable. Dado que no puede detectar el estado del nodo de antemano, puede haber una cierta cantidad de solicitudes fallidas. Esta situación es relativamente común durante las actualizaciones continuas, y podemos usar degradaciones de servicio para evitar la cantidad de solicitudes fallidas.

Ejemplo de APISIX Ingress configurando chequeos de salud para el servicio httpbin:

apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
  name: httpbin
spec:
  healthCheck:
    passive:
      unhealthy:
        httpCodes:
          - 500
        httpFailures: 3
    active:
      type: http
      httpPath: /healthz
      healthy:
        successes: 3
        interval: 2s
        httpCodes:
          - 200

Cortocircuito

El gateway es un punto de entrada para las solicitudes; inicia llamadas al servicio backend. Cuando hay picos de tráfico y la carga es pesada, el servicio backend puede fallar debido a tiempo de espera o excepción. Cuando ocurre el fallo, las solicitudes no pueden apilarse en el gateway. Necesita devolver rápidamente, lo que requiere un cortocircuito en el gateway.

Similar a la función de chequeo de salud, la función de cortocircuito de servicio no es compatible en Ingress NGINX. En APISIX Ingress, el plugin api-breaker ayuda a implementar esto.

Ejemplo de configuración del cortocircuito en APISIX Ingress:

apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
 name: httpbin-route
spec:
 http:
 - name: rule1
   match:
     hosts:
     - httpbin.org
     paths:
       - /status/*
   backends:
   - serviceName: httpbin
     servicePort: 80
   plugins:
   - name: api-breaker
     enable: true
     config:
       break_response_code: 502
       unhealthy:
         http_statuses:
         - 505
         failures: 2
       healthy:
         http_statuses:
         - 200
         successes: 2

Soporte de más plugins y métodos de autenticación

Ingress NGINX utiliza principalmente Annotations y ConfigMap para la configuración, y los plugins admitidos son relativamente limitados. Si deseas usar JWT, HAMC u otros métodos de autenticación, debes integrarlos tú mismo.

APISIX Ingress admite 80+ plugins en APISIX de forma nativa, que admite múltiples métodos de autenticación como JWT, HAMC, wolf-rbac, etc. Estos plugins proporcionan una amplia variedad de funcionalidades que cubren la mayoría de los escenarios de uso.

Ejemplo de autenticación HMAC en la ruta de APISIX:


apiVersion: apisix.apache.org/v2
kind: ApisixConsumer
metadata:
  name: hmac-value
spec:
  authParameter:
    hmacAuth:
      value:
        access_key: papa
        secret_key: fatpa
        algorithm: "hmac-sha256"
        clock_skew: 0
---

apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
 name: httpbin-route
spec:
 http:
 - name: rule1
   match:
     hosts:
     - httpbin.org
     paths:
       - /ip
   backends:
   - serviceName: httpbin
     servicePort: 80
   authentication:
     enable: true
     type: hmacAuth

Extensibilidad de Ingress NGINX y APISIX Ingress

Cuando las características básicas del controlador Ingress no pueden satisfacer las necesidades de los usuarios empresariales, solo se puede personalizar mediante extensión. A continuación, explicaremos cómo Ingress NGINX y APISIX Ingress extienden sus características.

Cómo Ingress NGINX extiende sus características

Ingress NGINX solo puede extenderse incrustando programas Lua.

Ejemplo de desarrollo de plugins para Ingress NGINX:

  1. Escribe el programa Lua example-plugin
  2. Instala el plugin en /etc/nginx/lua/plugins/<nombre de tu plugin> $\rightarrow$ /etc/nginx/lua/plugins/example-plugin en el pod de ingress-nginx
  3. Habilita el example-plugin en ConfigMap y referencia este objeto ConfigMap al instalar Ingress NGINX
apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  plugins: "example-plugin"

Cómo APISIX Ingress extiende sus características

APISIX Ingress proporciona una variedad de métodos para extender características, y los usuarios empresariales pueden elegir libremente el método según sus propias necesidades. APISIX admite:

  • Desarrollo de plugins mediante Lua: simple y con casi ninguna pérdida de rendimiento
  • Desarrollo mediante plugin-runner: se admiten lenguajes de programación como JAVA/Python/Go para el desarrollo, por lo que los usuarios pueden personalizar sus plugins sin aprender nuevos lenguajes
  • Plugins mediante WASM: cualquier lenguaje que admita la construcción de WASM puede usarse para el desarrollo de plugins

Además, puedes escribir directamente código Lua a través del plugin serverless para satisfacer rápidamente las necesidades del negocio.

¿Por qué APISIX Ingress admite CustomResourceDefinition (CRD)?

Actualmente, APISIX Ingress admite tres configuraciones declarativas: Ingress, CRD y Gateway API. Aquí compararemos principalmente Ingress y CRD. Y explicaremos Gateway API después.

Ingress es más adecuado para usuarios empresariales que migran desde Ingress NGINX debido a su bajo costo de migración. Sus deficiencias también son evidentes, como capacidades semánticas débiles, falta de especificaciones estándar, etc. Y Ingress solo puede extenderse mediante anotaciones, pero las anotaciones no pueden admitir escenarios complejos. En comparación, CRD tiene las siguientes ventajas:

  • Más fácil de usar ya que está más en línea con las semánticas de diseño del plano de datos
  • Reutilización de configuraciones para reducir la redundancia
  • Mejora de la funcionalidad y extensibilidad
  • El plano de datos de APISIX tiene una comunidad activa, con actualizaciones y lanzamientos rápidos, y CRD puede admitir más capacidades del plano de datos fácilmente

Punto débil de Ingress NGINX: No admite recarga en caliente

Problemas causados por la configuración estática

Ingress NGINX se implementa principalmente basado en archivos de configuración de NGINX. Aunque se utilizan NGINX y Lua para lograr extensiones de características, solo resuelve parcialmente el problema de los archivos de configuración estáticos. Muestra insuficiencias en sus capacidades de enrutamiento y recarga. Por ejemplo, la configuración de NGINX debe recargarse cuando se agrega o modifica una regla. Con más y más reglas de enrutamiento y certificados, la operación de carga tomará más tiempo, desde unos segundos hasta más de diez segundos. Cada recarga de NGINX restablece el estado del balanceador de carga, impactando negativamente en el tráfico en línea, causando interrupciones breves, aumentando la latencia de respuesta y reduciendo la calidad del balanceo de carga.

Situaciones que desencadenan una recarga de NGINX

  • Crear un nuevo recurso Ingress
  • Agregar una sección TLS a un Ingress existente
  • Cambiar las anotaciones de Ingress también puede afectar la configuración de upstream (por ejemplo, las anotaciones de balanceo de carga no necesitan recargarse)
  • Agregar o eliminar una ruta en Ingress
  • Eliminar recursos Ingress, Service o Secret
  • Actualizar Secret

Las situaciones enumeradas anteriormente cubren la mayoría de los escenarios de uso del controlador Ingress. En un entorno de clúster con aplicaciones que se implementan con frecuencia, las operaciones (creación, actualización, eliminación, etc.) de recursos como Ingress y Secret se desencadenarán continuamente. Esto resultará en un aumento drástico en el número de recargas de NGINX, impactando significativamente el entorno de producción.

La arquitectura de Ingress NGINX determina que primero debe generar la configuración de NGINX y recargar para completar la actualización de la configuración. El problema de la recarga no se puede resolver sin ajustar la arquitectura. Para resolver este problema, APISIX Ingress ya no depende de la configuración de NGINX en su implementación de enrutamiento y cambió a una arquitectura de memoria pura. El enrutamiento dinámico se realiza mediante recarga en caliente, y NGINX ya no necesita reiniciarse.

Gateway API

Ventajas de Kubernetes Gateway API

Kubernetes Gateway API es más funcional que Ingress y está diseñado para evolucionar la red de servicios de Kubernetes a través de una interfaz expresiva, extensible y orientada a roles implementada por muchos proveedores y con amplio soporte de la industria. Gateway API tiene las siguientes características:

  • Orientado a roles: Gateway está compuesto por recursos API. Diferentes recursos API representan diferentes roles para usar y configurar recursos de red de Kubernetes

  • Fuerte expresividad: Gateway API admite funcionalidades principales, incluyendo coincidencia basada en encabezados, ponderación de tráfico y otras capacidades que solo eran posibles en Ingress mediante anotaciones personalizadas no estándar

  • Extensible: Gateway API permite que diferentes recursos se vinculen en varias capas de API. Esto permite una personalización granular dentro de la estructura de la API

Estado de soporte de Gateway API

Kubernetes Gateway API es un estándar para extender la malla de servicios de Kubernetes. Su recurso Gateway puede usarse como una API de Kubernetes para gestionar el ciclo de vida del gateway, lo cual es muy poderoso. Muchos controladores Ingress lo admiten activamente, incluyendo Istio, Kong, Traefik, etc. Lamentablemente, Ingress NGXIN no planea admitir Gateway API todavía (Estado de implementación de Gateway API), mientras que APISIX Ingress ya admite la mayoría de las características de Gateway API: incluyendo HTTPRoute, TCPRoute, TLSRoute, UDPRoute, etc.

Resumen

Después de una comparación exhaustiva de APISIX Ingress e Ingress NGINX, podemos concluir que ambos softwares de código abierto son excelentes y las funciones esenciales de los dos son similares. En la arquitectura de microservicios, sin embargo, APISIX Ingress muestra más ventajas en el soporte de la gobernanza y descubrimiento de servicios al proporcionar chequeos de salud y cortocircuitos.

Ingress NGINX se caracteriza por su simplicidad y facilidad de uso, con algunas deficiencias evidentes, como dificultades en la extensión de características. APISIX Ingress, que llegó más tarde, resolvió el punto débil de la recarga en caliente de NGINX y proporcionó mejores extensiones y funcionalidades. Por ejemplo, admitir Gateway API y CRD enriquece las capacidades del controlador Ingress en términos de desarrollo de proyectos.

En resumen, si deseas seleccionar un controlador Ingress con características más ricas y mejores extensiones, APISIX Ingress es altamente recomendado. Si eres nuevo en el controlador Ingress y no tienes muchos requisitos funcionales, Ingress NGINX también es una buena opción por su simplicidad.

Tags: