Blog de Amazon Web Services (AWS)

Introducción a AWS App Mesh y Amazon EKS

Por Re Alvarez-Parmar, Container Specialist Solutions Architect de AWS
Bruno Emer, Solutions Architect de AWS

 

En esta publicación, hablaremos sobre el uso de microservicios que se ejecutan en contenedores dentro de un service mesh y le ofreceremos un ejemplo concreto de cómo comenzar con AWS App Mesh junto con Amazon EKS.

Cada vez más, los clientes de AWS han adoptado microservicios para crear aplicaciones escalables y resilientes, lo que reduce el tiempo de puesta en producción. Cuándo se pasa de una aplicación monolítica a una arquitectura de microservicios, se «divide» una sola aplicación en un conjunto más pequeño de servicios que son más fáciles de desarrollar y operar. Puede utilizar Amazon Elastic Kubernetes Service (EKS) y Amazon Elastic Container Service (ECS) para facilitar la ejecución, actualización y supervisión de los microservicios que se ejecutan en contenedores a gran escala.

Los servicios de Mesh como AWS App Mesh le ayudan a conectar servicios, supervisar las comunicaciones entre sus aplicaciones y controlar el tráfico de red. Cuando una aplicación se ejecuta en un mesh, se agregan proxies a sus servicios, formando así el plano de datos del mesh.  De esta manera, los servicios de aplicación ejecutan la lógica de negocio mientras que el proxy se hace responsable de implementar el descubrimiento de servicios, la observabilidad, el cifrado del tráfico de red, los reintentos automáticos y el modelado del tráfico. AWS App Mesh estandariza la comunicación entre sus servicios, proporcionando visibilidad y controles precisos sobre el tráfico de red de todos sus microservicios que se ejecutan en contenedores. App Mesh tiene dos componentes principales: un plano de control totalmente administrado que configura los proxies y un plano de control compuesto por proxies Envoy, que se ejecutan como sidecars; es decir, que corren de forma conjunta a sus servicios de negocio.

 

Uso de App Mesh con EKS

Amazon EKS es un servicio gestionado que facilita la ejecución de Kubernetes en AWS sin tener que operar su propio clúster de Kubernetes. Puede utilizar App Mesh para implementar un service mesh para aplicaciones que se ejecutan en clústeres de EKS. El proceso de uso de App Mesh junto con EKS se facilita mediante el uso de AWS App Mesh Controller para K8s. App Mesh Controller para K8s es un proyecto de código abierto que le ayuda a administrar los recursos de App Mesh utilizando el API de Kubernetes. Es decir, puede configurar las características de App Mesh desde kubectl, como mostraremos a continuación.

Puede utilizar App Mesh para conectar servicios que se ejecutan en EKS con servicios que se ejecutan en ECS, EC2 e incluso en su propio datacenter mediante AWS Outposts. En este artículo, nos centraremos en usar App Mesh junto con EKS. Comencemos entonces revisando algunas de las características de App Mesh que pueden mejorar el proceso de ejecución de microservicios en Kubernetes.

 

Controles de red

AWS App Mesh le permite controlar el tráfico de red entre servicios, lo que puede ayudarle a experimentar nuevas características de su aplicación. Puede utilizar esta función para reenviar sólo una parte del tráfico a una nueva versión del servicio. Tenga en cuenta que Kubernetes no le permite definir una división de solicitudes entre varias implementaciones. Con App Mesh, puede crear reglas para distribuir tráfico entre diferentes versiones de sus servicios.

Los controles de tráfico de App Mesh también pueden hacer que los procesos de implementación de nuevas versiones de sus aplicaciones sean significativamente más seguros a través de implementaciones tipo canary. Con esta estrategia, creará una nueva implementación de Kubernetes con menos pods y reenviará solo una pequeña parte de su tráfico a esta nueva versión. Si la nueva versión se comporta bien, puede aumentar gradualmente la cantidad de tráfico hasta que todas las nuevas solicitudes sean resueltas por la nueva versión.

También puede utilizar App mesh para aumentar la resiliencia de sus aplicaciones implementando políticas de tiempo de espera o configurando reintentos automáticos en los proxies.

 

Observabilidad

La observabilidad es una propiedad de un sistema que determina qué tan bien se puede inferir su estado a través de la información obtenida de fuentes externas. En el contexto de los microservicios, estas fuentes externas son métricas, trazas y registros. Las métricas muestran el comportamiento de un sistema a lo largo del tiempo. Los registros facilitan la solución de problemas al proporcionar información que puede ser la causa de posibles errores. Las trazas distribuidas pueden ayudarnos a depurar, identificar componentes problemáticos en la aplicación proporcionando detalles para un punto específico en el tiempo y comprender el flujo entre los microservicios.

Puede medir el estado de la aplicación configurando App Mesh para generar métricas como el total de solicitudes, crear registros de acceso y trazas. A medida que el tráfico de sus servicios pasa a través de la capa de proxies, Envoy inspeccionará el tráfico y generará estadísticas, creará registros de acceso y agregará encabezados HTTP a las solicitudes salientes, que se pueden utilizar para generar trazas. Las métricas y las trazas se pueden enrutar a servicios de agregación como Prometheus y AWS X-Ray, los cuales se pueden consumir para el análisis del comportamiento del sistema. Dado que App Mesh utiliza Envoy, también es compatible con una amplia gama de socios de AWS y herramientas de código abierto para supervisar microservicios.

 

Cifrado en tránsito

Los microservicios se comunican entre sí a través de la red, lo que significa que la red puede transmitir datos confidenciales. Muchos clientes desean cifrar el tráfico de red entre servicios. App Mesh puede ayudarle con esto, puede cifrar el tráfico entre servicios utilizando un certificado TLS, y no tiene que lidiar con negociaciones y terminación de TLS en su código de aplicación.

Puede utilizar sus propios certificados para cifrar el tráfico de red o puede utilizar AWS Certificate Manager (ACM). Si elige la segunda opción, ACM renovará automáticamente los certificados que estén cerca del final de su validez y App Mesh distribuirá automáticamente los certificados renovados.

 

Conceptos de App Mesh

Para usar App Mesh, tendrás que crear un Mesh. Un mesh funciona como un límite lógico en el que residirán todos los microservicios. Se puede pensar en este concepto como un «vecindario» que cobija sus microservicios:

 

 

El siguiente componente es un Virtual Service. Virtual Services actúa como punteros virtuales para las aplicaciones y son los nombres de los servicios que utilizan las aplicaciones para conectarse a los extremos definidos en el mesh. En una arquitectura de microservicios, cada microservicio estará representado por un Virtual Service y tendrá un virtualServiceName. Tenga en cuenta que un Virtual Service de App Mesh no es lo mismo que un servicio de Kubernetes.

Un Virtual Service representa una aplicación, pero una aplicación puede tener versiones diferentes. Por ejemplo, una aplicación puede tener dos versiones diferentes: una interna y una pública. Cada versión de una aplicación está representada por un Virtual Node. Como se muestra en la imagen anterior, un Virtual Service puede tener uno o más Virtual Nodes. Si un Virtual Service tiene varios Virtual Nodes, defina cómo se enruta el tráfico entre varios Virtual Nodes mediante un Virtual Router.

Los Virtual Routers son responsables del enrutamiento del tráfico en función de reglas específicas; estas reglas se denominan Virtual Routes. Un Virtual Router debe tener al menos una Virtual Route. La lógica de enrutamiento puede basarse en diferentes criterios, como encabezados HTTP, rutas de URL o servicios o métodos y servicios gRPC. También puede utilizar Virtual Routers para implementar la lógica de reintento y el manejo de errores.

 

App Mesh con EKS en Acción

En este tutorial, creará componentes de AWS App Mesh y los implementará mediante una aplicación de ejemplo denominada Yelb. Después de colocar Yelb en un mesh, creará una nueva versión del servidor de aplicaciones Yelb y utilizará una App Mesh Virtual Route para dirigir el tráfico entre las dos versiones de la aplicación.

Yelb permite a los usuarios votar por un conjunto de alternativas como restaurantes y actualiza dinámicamente gráficos circulares basados en votos. Además, Yelb realiza un seguimiento del número de vistas de página y muestra el nombre de host de la instancia yelb-appserver que sirve la solicitud de API después de una votación o una actualización de página. Los componentes de Yelb incluyen:

  • Una interfaz llamada yelb-ui, responsable de entregar el código JS al navegador.
  • Un servidor de aplicaciones llamado yelb-appserver, una aplicación Sinatra que lee y escribe en un servidor de caché (redis-server) y una base de datos Postgres (yelb-db).
  • Redis almacena el número de vistas de página y la base de datos Postgres almacena los votos.

Esta es la arquitectura de Yelb:

 

 

NOTA: La configuración de Yelb utiliza almacenamiento efímero para todos los contenedores. El uso de bases de datos de sólo se realiza con fines de demostración.

Para ejecutar este laboratorio, necesitará poseer un entorno con algunas herramientas. Utilizamos una instancia de AWS Cloud9 para ejecutar este tutorial y, si desea crear una instancia de Cloud9 en su cuenta, siga los pasos del taller de EKS del capítulo Create a Workspace para Update IAM Settings for your Workspace.

 

1. Configurar la infraestructura

Para ejecutar este tutorial, es necesario instalar algunas herramientas específicas:

Comience clonando el repositorio de GitHub:

git clone https://github.com/aws/aws-app-mesh-examples.git
cd aws-app-mesh-examples/walkthroughs/eks-getting-started/

Si está utilizando una instancia de Cloud9, ejecute los siguientes comandos para instalar las herramientas necesarias mencionadas anteriormente:

./cloud9-startup.sh && source ~/.bash_profile > /dev/null

Utilizará una plantilla de CloudFormation para crear una VPC que incluya un security group y dos repositorios ECR. El script baseline.sh implementa el stack de CloudFormation y crea la infraestructura base con una VPC, subnets públicas y privadas y una política de IAM. Por lo tanto, para comenzar las cosas, ejecute el siguiente comando:

./baseline.sh

La secuencia de comandos anterior tarda unos cinco minutos en completarse.

 

2. Crear el clúster EKS

Para crear el clúster EKS, ejecute el siguiente comando que tardará unos 15 minutos en completarse:

./infrastructure/create_eks.sh

Después de crear el clúster EKS, puede probar la conectividad con el clúster mediante el siguiente comando:

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   172.20.0.1   <none>        443/TCP   14m

 

3. Implementación de la aplicación de ejemplo

Para implementar la aplicación de ejemplo Yelb, ejecute el siguiente comando:

kubectl apply -f infrastructure/yelb_initial_deployment.yaml

Para obtener la URL del balanceador de carga para realizar pruebas en su navegador, utilice el siguiente comando:

$ kubectl get service yelb-ui -n yelb
NAME      TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)        AGE
yelb-ui   LoadBalancer   172.20.19.116   a96f5309de3csdc19847045bfbd34bd4-XXXXXXXXXX.us-west-2.elb.amazonaws.com   80:30467/TCP   3m33s

Tenga en cuenta que la URL pública del balanceador de carga está disponible en el campo EXTERNAL-IP. Es posible que tenga que esperar unos minutos para la propagación de DNS. Cuando abra la URL en un navegador de su elección, el resultado debe ser el siguiente:

 

 

4. Agregue la aplicación de ejemplo al Mesh

Para comenzar a crear funciones de App Mesh y agregar Yelb al mesh, lo primero que debe hacer es instalar AWS App Mesh Controller. Este controlador le permite configurar las características de App Mesh usando  kubectl. Todas las características utilizadas por App Mesh también se pueden crear a través de la consola de servicio, pero en este tutorial vamos a utilizar kubectl. Una vez completada, la configuración final es la siguiente:

 

 

Usará Helm para instalar App Mesh Controller. Helm es un proyecto de código abierto que facilita la definición, instalación y actualización de aplicaciones en un clúster de Kubernetes. El primer paso es agregar el repositorio de Amazon EKS a Helm:

helm repo add eks https://aws.github.io/eks-charts

A continuación, debe crear un espacio de nombres para el App Mesh Controller, responsable de las características personalizadas:

kubectl create ns appmesh-system

Ahora instale el App Mesh Controller:

helm upgrade -i appmesh-controller eks/appmesh-controller \
    --namespace appmesh-system

Para confirmar que App Mesh Controller se está ejecutando, enumere los pods en el espacio de nombres appmesh-system :

$ kubectl get pods -n appmesh-system
NAME                                  READY   STATUS    RESTARTS   AGE
appmesh-controller-66b749c78b-67n68   1/1     Running   0          6s

Implementemos la aplicación yelb en el espacio de nombres yelb y usemos el mismo nombre para el mesh.  Ahora, tendrá que agregar dos etiquetas al espacio de nombres yelb: mesh y appMesh.k8s.aws/sidecarInjectorWebHook. Estas etiquetas indican al controlador que inyecte y configure los proxies de Envoy en los pods:

kubectl label namespace yelb mesh=yelb 
kubectl label namespace yelb appmesh.k8s.aws/sidecarInjectorWebhook=enabled

¡Genial! Ahora estamos en posición de crear el mesh usando:

# Crea el manifiesto con la configuración de mesh:
$ cat <<"EOF" > /tmp/eks-scripts/yelb-mesh.yml
apiVersion: appmesh.k8s.aws/v1beta2
kind: Mesh
metadata:
  name: yelb
spec:
  namespaceSelector:
    matchLabels:
      mesh: yelb
EOF

# Crea el mesh con la configuración anterior:
$ kubectl apply -f /tmp/eks-scripts/yelb-mesh.yml

OBSERVACIÓN: El parámetro NamespaceSelector corresponde a los espacios de nombres Kubernetes con la etiqueta de mesh y el valor yelb.

Si lo desea, también puede utilizar la consola de AWS para verificar que el mesh se creó correctamente:

 

 

Después de crear el mesh, debe crear todos los componentes de App Mesh para cada componente de Yelb. Utilizará los archivos YAML del directorio infrastructure/appmesh_template para crear virtual nodes, virtual routers, routes y virtual services. Aplique estos parámetros mediante los siguientes comandos:

kubectl apply -f infrastructure/appmesh_templates/appmesh-yelb-redis.yaml
kubectl apply -f infrastructure/appmesh_templates/appmesh-yelb-db.yaml
kubectl apply -f infrastructure/appmesh_templates/appmesh-yelb-appserver.yaml
kubectl apply -f infrastructure/appmesh_templates/appmesh-yelb-ui.yaml

App Mesh Controller está configurado para inyectar contenedores Envoy, pero aún no lo ha hecho. Esto se debe a que los sidecars solo se inyectan cuando se crea un pod. Por lo tanto, elimine los pods existentes usando kubectl -n yelb delete pods —all. Esto provocará la creación de nuevos pods con los sidecars Envoy. Para validar que el controlador funcionó bien, verifique el número de contenedores que se ejecutan en cada pod:

$ kubectl -n yelb get pods
NAME                              READY   STATUS    RESTARTS   AGE
redis-server-7dc845588-qbxv2      2/2     Running   0          48s
yelb-appserver-7d644fbf76-d642g   2/2     Running   0          48s
yelb-db-76bdb465fc-857fm          2/2     Running   0          48s
yelb-ui-859595cdb8-j2cqj          2/2     Running   0          48s

Nota: En un entorno productivo, no es necesario eliminar los pods existentes. Cambios como agregar una nueva etiqueta a los pods existentes provocarán que se inyecten proxies de Envoy. En este tutorial, utilizamos el proceso de eliminación de los pods con el fin de mantener las instrucciones más simplificadas.

Tenga en cuenta que cada pod de este espacio de nombres ahora tiene dos contenedores. Echemos un vistazo más de cerca usando:

# Obtener datos de un solo pod:
$ YELB_POD=$(kubectl -n yelb get pod \
                     --no-headers=true \
                     --output name \|
                     awk -F "/" '{print $2}' \|
                     head -n 1)

# Describa el pod:
$ kubectl -n yelb describe pod $YELB_POD
...
envoy:
    Container ID:   docker://1dbf736bfb6e89a1f4c9a567dbbfeeca26a0d846eda14f667ba128d4b5b36233
    Image:          840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.3.0-prod
    Image ID:       docker-pullable://840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy@sha256:f7ba6f019430c43f4fbadf3035e0a7c1555362a56a79d2d84280b2967595eeaf
    Port:           9901/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 13 May 2020 18:19:12 +0000
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:     10m
      memory:  32Mi
    Environment:
      APPMESH_VIRTUAL_NODE_NAME:  mesh/yelb/virtualNode/redis-server-virtual-node
      APPMESH_PREVIEW:            0
      ENVOY_LOG_LEVEL:            info
      AWS_REGION:                 us-west-2
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-tj7xx (ro)
...

Ahora puede volver a la interfaz web de Yelb y asegurarse de que puede acceder a ella. Tenga en cuenta que el recuento de votos será cero ya que eliminemos los pods en el paso anterior.

 

5. Reenvío de tráfico a una nueva versión

Ahora que Yelb está en un mesh, crea una nueva versión de yelb-appserver. Usaremos App Mesh para enrutar el tráfico de red a esta nueva versión de la aplicación. Para ello, cree una nueva imagen de contenedor con código actualizado e inserte en un repositorio ECR utilizando el siguiente comando:

./build-appserver-v2.sh

A continuación, cree un nuevo Virtual Node que representará esta nueva versión de la aplicación:

kubectl apply -f infrastructure/appmesh_templates/appmesh-yelb-appserver-v2.yaml

Además, necesitamos realizar una nueva implementación usando el manifiesto generado por build-appserver-v2.sh:

kubectl apply -f infrastructure/yelb_appserver_v2_deployment.yaml

Debería poder ver una nueva versión de yelb-appserver ejecutándose enumerando los pods en el espacio de nombres yelb:

$ kubectl get pods -n yelb

NAME                                 READY   STATUS    RESTARTS   AGE
redis-server-7dc845588-vfdld         2/2     Running   0          107m
yelb-appserver-7d644fbf76-2gmmc      2/2     Running   0          107m
*yelb-appserver-v2-658d6647d6-9t8x5  2/2     Running   0          21s
*yelb-db-76bdb465fc-fltjj            2/2     Running   0          107m
yelb-ui-68455b649b-677fb             2/2     Running   0          107m

Ahora configure el Virtual Route para que el 50% del tráfico se envíe a la versión v2 y el otro 50% a la versión actual.

Tenga en cuenta que cuando se trata de entornos productivos, el cambio de tráfico generalmente ocurre en proporciones menores (10%, 20%, 30%…).

El siguiente diagrama de arquitectura muestra el entorno con dos versiones de yelb-appserver  ejecutándose al mismo tiempo:

 

 

Para cambiar la configuración de Virtual Route, ejecute el siguiente comando:

kubectl apply -f ./infrastructure/appmesh_templates/appmesh-virtual-router-appserver-v1-v2.yaml

Después de modificar el Virtual Route, puedo volver a cargar la página de Yelb varias veces y ver que algunas de las solicitudes están siendo atendidas por la versión antigua de yelb-appserver mientras que otras por la nueva versión. Puede identificar la versión mirando el campo App Server, donde la versión anterior traerá el nombre de host del contenedor yelb-appserver y la nueva versión mostrará ApplicationVersion2.

Finalmente, cambiemos el Virtual Route para que todo el tráfico se enrute a la última versión de yelb-appserver :

kubectl apply -f infrastructure/appmesh_templates/appmesh-virtual-router-appserver-v2.yaml

Puede observar que después de cambiar el Virtual Route, la implementación yelb-appserver-v2 es responsable de atender a todas las solicitudes:

 

 

6. Limpieza

Para borrar todos los recursos creados al ejecutar este tutorial, ejecute el script de limpieza con el siguiente comando:

./infrastructure/cleanup.sh

Tenga en cuenta que si ha seguido estos pasos utilizando una instancia de Cloud9, debe usar los pasos de limpieza de la instancia de Cloud9 descritos en el Workshop de EKS.

 

Próximos pasos y conclusión

Encontrará Weave Flagger útil si está interesado en automatizar despliegues tipo canary. Flagger le permite promover despliegues tipo canary utilizando AWS App Mesh automáticamente. Flagger utiliza métricas de Prometheus para determinar el éxito o el fracaso del despliegue tipo canary  y utiliza controles de enrutamiento de App Mesh para cambiar automáticamente el tráfico entre la implementación actual y el canary.

Además, algunos enlaces útiles si desea profundizar en el tema:

En esta publicación, analizamos los fundamentos de App Mesh y te mostramos cómo poner una aplicación Kubernetes existente en un mesh usando App Mesh Controller para K8s. También te mostramos cómo utilizar diferentes técnicas de implementación mediante Virtual Routes para dividir el tráfico entre dos versiones de una aplicación. En el próximo blog, le mostraremos cómo puede usar App Mesh Virtual Gateways para proporcionar conectividad dentro y fuera de un mesh.

Puede seguir nuevas funcionalidades del servicio a través de App Mesh roadmap y probar nuevas características utilizando el App Mesh preview channel. Por último, echa un vistazo a appmeshworkshop.com para aprender más sobre App Mesh de una manera práctica y únete a nosotros en la comunidad App Mesh Slack para compartir experiencias.

 

Este artículo fue traducido del Blog de AWS en Inglés.

 


Sobre los traductores

Bruno Emer es Arquitecto de Soluciones Especialista en Contenedores, ubicado en São Paulo, Brasil. Cuando no está trabajando con clientes o escribiendo contenido, le gusta viajar y escuchar música, especialmente samba y R&B.

 

 

 

 

Adriana Asano trabaja en el área de arquitectura y soluciones de AWS, su posición se centra en el aprendizaje del cliente dentro de la nube y su mejor desarrollo en este viaje.

 

 

 

 

Herbert Gomez es Arquitecto de Soluciones