Cómo Amazon EKS y APISIX Ingress Controller trabajan juntos para gestionar tráfico complejo

API7.ai

February 7, 2021

Ecosystem

Antecedentes

Como gestor de tráfico, a veces, incluso cuando estás preparado para lo inesperado, es difícil detener lo inesperado. ¡Construir una puerta de enlace API de cuatro vías es crucial! Aquí es donde Amazon EKS + Ingress APISIX! puede ayudarte hoy.

Introducción

Kubernetes es un sistema de código abierto para automatizar la implementación, escalado y gestión de aplicaciones en contenedores. Amazon Elastic Kubernetes Service (Amazon EKS) como un servicio gestionado de Kubernetes te permite ejecutar cargas de Kubernetes en Amazon Cloud Technologies sin necesidad de instalar ni mantener un plano de control o nodos.

Apache APISIX es una puerta de enlace API dinámica, en tiempo real y de alto rendimiento. Proporciona funciones avanzadas de gestión de tráfico como balanceo de carga, upstream dinámico, despliegue en escala gris, segmentación de tráfico, autenticación y observabilidad. Puedes usar Apache APISIX para manejar el tráfico norte-sur entre clientes tradicionales y servidores, así como el tráfico este-oeste entre servicios.

Ingress APISIX puede usarse como el controlador de entrada para Kubernetes, introduciendo las mejores características de Apache APISIX en Kubernetes. Esto puede ser impulsado por componentes de controlador bien diseñados para ayudarte a satisfacer necesidades complejas de gestión de tráfico.

Arquitectura técnica de apisix-ingress-controller

Cómo configurar y ejecutar Ingress APISIX en Amazon Elastic Kubernetes Service

Requisitos previos

Antes de comenzar, configura un clúster de Amazon EKS disponible en Amazon CloudTech.

Debes tener la herramienta kubectl en tu entorno y configurar el contexto para tu clúster de Amazon EKS ejecutando el siguiente comando:

aws eks update-kubeconfig --name  --region

Una vez que el clúster de Kubernetes esté listo, crea un espacio de nombres llamado ingress-apisix, donde se crearán todos los recursos que se utilizarán.

kubectl create namespace ingress-apisix

Usaremos Helm para desplegar todos los componentes de Ingress APISIX (Apache APISIX y apisix-ingress-controller), así que sigue la guía de instalación para instalar Helm. Los charts de Helm para Apache APISIX y apisix-ingress-controller se encuentran en apache/apisix-helm-chart y apache/apisix-ingress-controller, clona estas rutas para obtener los charts correspondientes.

Instalación de Apache APISIX

Apache APISIX actúa como un plano de proxy para el apisix-ingress-controller y debe desplegarse primero.

cd /path/to/apisix-helm-chart
helm repo add bitnami https://charts.bitnami.com/bitnami
helm dependency update . /chart/apisix
helm install apisix . /chart/apisix \
  --set gateway.type=LoadBalancer \
  --set allow.ipList="{0.0.0.0/0}" \
  --namespace ingress-apisix
kubectl get service --namespace ingress-apisix

El comando anterior creará dos recursos de Kubernetes Service: apisix-gateway, que maneja el tráfico real, y apisix-admin, que actúa como el plano de control y maneja todos los cambios de configuración. Aquí creamos apisix-gateway como un servicio de tipo LoadBalancer, que puede exponerse a Internet con la ayuda de Amazon Network Load Balancer. Podemos encontrar el nombre de host del balanceador de carga con el siguiente comando:

kubectl get service apisix-gateway \
--namespace ingress-apisix \
-o jsonpath='{.status.loadBalancer.ingress[].hostname}'

También ten en cuenta: el campo allow.ipList debe ajustarse a los rangos CIDR de EKS en tu propio clúster de Amazon EKS, para que apisix-ingress-controller pueda ser autorizado por Apache APISIX (para enviar recursos).

Consulta value.yaml para obtener más información sobre todos los elementos de configuración si hay otros requisitos.

Instalación de apisix-ingress-controller

Después de desplegar Apache APISIX con éxito, es hora de instalar el componente Controller.

cd /path/to/apisix-ingress-controller
# instala recursos base, por ejemplo, ServiceAccount.
helm install ingress-apisix-base -n ingress-apisix . /charts/base
# instala apisix-ingress-controller
helm install ingress-apisix . /charts/ingress-apisix \
  --set ingressController.image.tag=dev \
  --set ingressController.config.apisix.baseURL=http://apisix-admin:9180/apisix/admin \
  --set ingressController.config.apisix.adminKey={YOUR ADMIN KEY} \
  --namespace ingress-apisix

El chart ingress-apisix-base instalará algunas dependencias básicas para apisix-ingress-controller, como ServiceAccount y su CRD dedicado.

El chart ingress-apisix nos guiará en la instalación del Controller en sí, podemos cambiar la etiqueta de la imagen a la versión deseada y podemos cambiar el valor de ingressController.config.apisix.adminKey en el comando anterior. Estas configuraciones pueden ajustarse según los escenarios reales (y asegúrate de que la clave Admin utilizada aquí sea la misma que la clave utilizada en el despliegue de Apache APISIX). Si tienes otros requisitos, puedes consultar value.yaml para obtener más información sobre todos los elementos de configuración.

Luego, intenta abrir la consola de Amazon EKS, selecciona tu clúster y haz clic en la pestaña Workloads. Verás que todos los Pods, etcd y apisix-ingress-controller para Apache APISIX están listos.

Comienza las pruebas

En este punto, hemos desplegado todos los componentes de Ingress APISIX, así que asegúrate de verificar que todo funcione correctamente. Luego, desplegaremos un servicio httpbin y pediremos a Apache APISIX que enrute todas las solicitudes al host "local.httpbin.org" a este servicio.

Para hacer esto, primero necesitamos crear la carga de trabajo httpbin y exponerla.

kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80

Para que Apache APISIX enrute las solicitudes correctamente, necesitamos crear un recurso ApisixRoute para impulsar el proceso.

# ar-httpbin.yaml
apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
  name: httpserver-route
spec:
  rules:
  - host: local.httpbin.org
    http:
      paths:
      - backend:
          serviceName: httpbin
          servicePort: 80
        path: /*

El recurso ApisixRoute anterior permitirá que Apache APISIX enrute las solicitudes con un encabezado de host "local.httpbin.org" al backend httpbin (que acabamos de crear).

Luego, aplica esta configuración, pero ten en cuenta que el servicio y el recurso ApisixRoute deben estar en el mismo espacio de nombres, y apisix-ingress-controller no puede cruzar espacios de nombres.

kubectl apply -f ar-httpbin.yaml

Prueba los resultados con una simple llamada curl desde cualquier lugar que pueda alcanzar el servicio de Apache APISIX.

$ curl http://{apisix-gateway-ip}:{apisix-gateway-port}/headers -s -H 'Host: local.httpbin.org'

{
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.64.1",
    "X-Amzn-Trace-Id": "Root=1-5ffc3273-2928e0844e19c9810d1bbd8a"
  }
}

Si el tipo de Service es ClusterIP, necesitas iniciar sesión en un Pod en el clúster de Amazon EKS y usar el ClusterIP o el FQDN del Service para acceder a Apache APISIX. Si ya está expuesto (ya sea NodePort o LoadBalancer), entonces se puede acceder directamente al punto final externo accesible.

Nota: Este artículo está reimpreso del sitio web público de WeChat de AWS.

Tags: