Un Service Mesh de APISIX con Istio y Amesh
June 16, 2023
Apache APISIX se utiliza principalmente para manejar el tráfico norte-sur y a menudo se sitúa en el límite entre las aplicaciones cliente y los servicios backend.
Con el APISIX Ingress Controller, APISIX también puede controlar el tráfico de entrada y salida en clústeres de Kubernetes con configuración nativa.
Pero a medida que las organizaciones adoptan microservicios, surge un nuevo desafío: manejar el tráfico este-oeste entre estos microservicios.
Las mallas de servicios como Istio resuelven esto al eliminar la responsabilidad de red del desarrollador de microservicios y proporcionar una capa adicional de red L4/L7.
Con la nueva biblioteca Amesh e Istio, Apache APISIX también puede usarse como una malla de servicios, específicamente como un plano de datos para Istio, llevando todas sus capacidades de gestión de tráfico a la comunicación entre servicios.
En este artículo, examinaremos qué es Amesh, cómo se desarrolló y cómo se utiliza para integrar APISIX en una malla de servicios.
Istio y el Protocolo xDS
Istio es una de las mallas de servicios más utilizadas.
Internamente, Istio utiliza Envoy como el proxy inverso en sus contenedores sidecar.
Istio gestiona el tráfico configurando dinámicamente los sidecars utilizando las APIs xDS de Envoy.
Las APIs xDS son una forma de configurar Envoy con cambios incrementales en lugar de configuraciones simples con archivos estáticos.
Aunque estas APIs inicialmente estaban destinadas a configurar Envoy, han evolucionado para convertirse en una API universal de plano de datos. Cualquier proxy de plano de datos puede implementar estas APIs, y cualquier plano de control puede usar esta API para trabajar con estos proxies de plano de datos.
En Istio, esto significa que puedes reemplazar el plano de datos predeterminado de Envoy con cualquier plano de datos que implemente las APIs xDS. Por lo tanto, puedes reemplazar Envoy con APISIX para obtener sus capacidades de gestión de tráfico en una malla de servicios.
Pero APISIX no admite las APIs xDS de forma nativa. Y ahí es donde entra Amesh.
Amesh
Amesh es una biblioteca que traduce los datos del plano de control de Istio a la configuración de APISIX.
APISIX reemplaza a Envoy como el plano de datos para Istio.
Istio se comunica con el plano de datos a través de las APIs xDS. Amesh admite estas APIs y luego las convierte en configuración de APISIX.
Esto es similar a cómo funcionan APISIX y el controlador de entrada de APISIX. El controlador de entrada convierte las configuraciones definidas utilizando la API de Ingress o Gateway al formato de APISIX.
Dado que las APIs xDS son compatibles con más mallas de servicios como Linkerd y Open Service Mesh, APISIX también puede trabajar con ellas utilizando la biblioteca Amesh. Amesh todavía está en las primeras etapas de desarrollo y actualmente funciona con Istio v1.13.1.
Con Amesh + APISIX, puedes usar Istio como lo harías normalmente. Una vez que configuras las reglas de tráfico con el servicio virtual de Istio, APISIX puede implementar estas reglas.
Las capacidades extendidas de APISIX vienen a través de sus más de 80 plugins. Para usar los plugins de APISIX con Istio, implementamos un componente del plano de control de Amesh llamado controlador Amesh.
El controlador Amesh toma una configuración de plugin definida con el CRD AmeshPluginConfig
y la convierte en una configuración de plugin de APISIX.
Todo esto nos permitirá aprovechar todas las capacidades de APISIX dentro de los contenedores sidecar.
APISIX + Malla de Istio
Pongamos en práctica todo lo que hemos aprendido.
Construiremos las imágenes de Amesh, configuraremos Istio para usar sidecars de APISIX, desplegaremos Istio y probaremos todo ejecutando una aplicación de ejemplo.
Construyendo las Imágenes
Construiremos tres imágenes:
- amesh-iptables: se utiliza para crear un contenedor init que establece algunas reglas de iptables. Estas reglas son para dirigir todo el tráfico a través de APISIX.
- amesh-sidecar: se utiliza para crear el contenedor sidecar.
- amesh-controller: se utiliza para crear el componente del plano de control del controlador Amesh. Este controlador se utiliza para configurar los plugins de APISIX.
Primero, clona el repositorio de Amesh:
git clone https://github.com/api7/Amesh.git
cd Amesh
Puedes construir y enviar estas imágenes a tu propio registro.
Agrega la dirección de tu registro en una variable de entorno antes de ejecutar la construcción, como se muestra a continuación:
export REGISTRY="docker.io/navendu"
make prepare-images
Si no deseas construir tus propias imágenes, puedes usar estas imágenes:
docker pull navendup/amesh-iptables:dev
docker pull navendup/amesh-sidecar:dev
docker pull navendup/amesh-controller:latest
Desplegar el Controlador Amesh e Instalar los CRDs
Usaremos Helm para desplegar todo en el clúster de Kubernetes. Yo uso minikube en estos ejemplos.
Comenzaremos creando un nuevo espacio de nombres istio-system
:
kubectl create namespace istio-system
Para desplegar el controlador Amesh, ejecuta:
helm install amesh-controller -n istio-system \
./controller/charts/amesh-controller
También necesitas instalar los CRDs para trabajar con el controlador Amesh:
kubectl apply -k controller/config/crd/
Configurar y Desplegar Istio + APISIX
Antes de desplegar la malla de servicios, estableceremos algunas variables de entorno:
export ISTIO_RELEASE=1.13.1
export REGISTRY="docker.io/navendup"
Luego usaremos Helm para desplegar la malla de servicios:
helm install amesh \
--namespace istio-system \
--set pilot.image=istio/pilot:"$ISTIO_RELEASE" \
--set global.proxy.privileged=true \
--set global.proxy_init.image="$REGISTRY"/amesh-iptables:dev \
--set global.proxy.image="$REGISTRY"/amesh-sidecar:dev \
--set global.imagePullPolicy=IfNotPresent \
--set global.hub="docker.io/istio" \
--set global.tag="$ISTIO_RELEASE" \
./charts/amesh
Ahora tenemos la malla de servicios y el controlador Amesh desplegados. A continuación, desplegaremos una aplicación de ejemplo para probar nuestra malla de servicios.
Desplegando Bookinfo
Usaremos la aplicación de ejemplo Bookinfo de Istio.
Primero, agregaremos una etiqueta al espacio de nombres predeterminado para inyectar automáticamente sidecars en cualquier pod en el espacio de nombres:
kubectl label ns default istio-injection=enabled
Luego podemos desplegar Bookinfo ejecutando:
kubectl apply -f e2e/bookinfo/bookinfo.yaml
Esto iniciará la aplicación Bookinfo, y cada uno de los pods tendrá sidecars de APISIX:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-cbn87 2/2 Running 0 55s
productpage-v1-6b746f74dc-tntc8 2/2 Running 0 55s
ratings-v1-b6994bb9-r5j45 2/2 Running 0 55s
reviews-v1-545db77b95-n657s 2/2 Running 0 55s
reviews-v2-7bf8c9648f-zn97s 2/2 Running 0 55s
reviews-v3-84779c7bbc-wn8k2 2/2 Running 0 55s
Probando la Malla
Para acceder a la aplicación Bookinfo, necesitaríamos una puerta de enlace de entrada.
Puedes usar APISIX para esta puerta de enlace de entrada, pero eso es para otro momento. Por ahora, podemos usar port-forward
para acceder al servicio product-page
:
kubectl port-forward productpage-v1-6b746f74dc-tntc8 9080:9080
Ahora, si abrimos localhost:9080, podremos ver nuestra aplicación de ejemplo.
Cada vez que actualizas la página, las reseñas se obtienen de una versión diferente del servicio de reseñas (desplegamos tres versiones).
Ahora apliquemos una regla utilizando servicios virtuales que enruta todo el tráfico a las versiones v1 de los servicios.
La regla es autoexplicativa y se vería así:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
Puedes aplicarla a tu clúster ejecutando:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/virtual-service-all-v1.yaml
Ahora, si volvemos a nuestra aplicación y actualizamos la página, dejará de alternar entre las múltiples versiones del servicio de reseñas y solo enrutará a la versión v1.
Observa cómo cambió el aspecto de la sección de reseñas aquí. Permanecerá igual incluso si actualizas la página.
En resumen, configuramos una regla en Istio, e Istio la implementa utilizando sus contenedores sidecar con Apache APISIX. ¡Genial!
Amesh Más Allá
Amesh es un proyecto experimental y todavía está en su infancia.
Las futuras versiones del proyecto tienen como objetivo admitir más características a través de servicios virtuales.
Puedes contribuir a mejorar el proyecto o seguir las nuevas versiones en GitHub.