Cómo Amazon EKS y APISIX Ingress Controller trabajan juntos para gestionar tráfico complejo
API7.ai
February 7, 2021
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.
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.