Implemente una aplicación basada en gRPC en un clúster de Amazon EKS y acceda a ella con un Equilibrador de carga de aplicación - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Implemente una aplicación basada en gRPC en un clúster de Amazon EKS y acceda a ella con un Equilibrador de carga de aplicación

Kirankumar Chandrashekar y Huy Nguyen, Amazon Web Services

Resumen

Este patrón describe cómo alojar una aplicación basada en gRPC en un clúster de Amazon Elastic Kubernetes Service (Amazon EKS) y cómo acceder a ella de forma segura a través de un Equilibrador de carga de aplicación.

gRPC es un marco de llamada a procedimientos remotos (RPC) de código abierto que se puede ejecutar en cualquier entorno. Puede usarlo para integraciones de microservicios y comunicaciones cliente-servidor. Para obtener más información sobre el gRPC, consulte la entrada del blog de AWS sobre el soporte del Application Load Balancer para end-to-end HTTP/2 y gRPC.

Este patrón le muestra cómo alojar una aplicación basada en gRPC que se ejecuta como pods de Kubernetes en Amazon EKS. El cliente gRPC se conecta a un Application Load Balancer a través del protocolo HTTP/2 con una conexión cifrada. SSL/TLS El Equilibrador de carga de aplicación reenvía el tráfico a la aplicación gRPC que se ejecuta en los pods de Amazon EKS. La cantidad de pods de gRPC se puede escalar automáticamente en función del tráfico mediante el escalador automático de pods horizontales de Kubernetes. El grupo de destino del equilibrador de carga de aplicación realiza comprobaciones de estado en los nodos de Amazon EKS, evalúa si el destino está en buen estado y solo reenvía el tráfico a los nodos en buen estado.

Requisitos previos y limitaciones

Requisitos previos

Arquitectura

En el siguiente diagrama, se muestra la arquitectura implementada por este patrón.

Arquitectura para aplicación basada en gRPC en Amazon EKS

El siguiente diagrama muestra un flujo de trabajo en el que SSL/TLS el tráfico se recibe de un cliente gRPC que se descarga a un Application Load Balancer. El tráfico se reenvía en texto sin formato al servidor gPC porque proviene de una nube privada virtual (VPC).

Flujo de trabajo para enviar SSL/TLS tráfico a un servidor gRPC

Tools (Herramientas)

Servicios de AWS

  • La Interfaz de la línea de comandos de AWS (AWS CLI) es una herramienta de código abierto que le permite interactuar con los servicios de AWS mediante comandos en el intérprete de comandos de la línea de comandos.

  • Elastic Load Balancing permite distribuir el tráfico entrante de las aplicaciones o de la red entre varios destinos. Así, por ejemplo, puede distribuir el tráfico a través de instancias de Amazon Elastic Compute Cloud (Amazon EC2), contenedores y direcciones IP de una o varias zonas de disponibilidad.

  • Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable. 

  • Amazon Elastic Kubernetes Service (Amazon EKS) lo ayuda a ejecutar Kubernetes en AWS sin necesidad de instalar ni mantener su propio plano de control o nodos de Kubernetes.  

Herramientas

  • eksctl es una herramienta de CLI sencilla para crear clústeres de Amazon EKS.

  • kubectl: es una utilidad de línea de comandos para la ejecución de comandos en clústeres de Kubernetes.

  • El controlador del equilibrador de carga de AWS le ayuda a administrar los Elastic Load Balancer de AWS para un clúster de Kubernetes.

  • g RPCurl es una herramienta de línea de comandos que te ayuda a interactuar con los servicios de gRPC.

Repositorio de código

El código de este patrón está disponible en el repositorio GitHub grpc-traffic-on-alb-to-eks.

Epics

TareaDescripciónHabilidades requeridas

Cree un repositorio de Amazon ECR.

Inicie sesión en la Consola de administración de AWS, abra la consola de Amazon ECR y, luego, cree un repositorio de Amazon ECR. Para obtener más información, consulte Creación de un repositorio en la documentación de Amazon ECR. Asegúrese de registrar la URL del repositorio de Amazon ECR.

También puede crear un repositorio de Amazon ECR con la CLI de AWS ejecutando el siguiente comando:

aws ecr create-repository --repository-name helloworld-grpc
Administrador de la nube

Cree la imagen de Docker.

  1. Clona el repositorio GitHub grpc-traffic-on-alb-to-eks.

    git clone https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git
  2. Desde el directorio raíz del repositorio, asegúrese de que el Dockerfile existe y, a continuación, ejecute el siguiente comando para crear la imagen de Docker: 

    docker build -t <amazon_ecr_repository_url>:<Tag> .
    importante

    Asegúrese de sustituir <amazon_ecr_repository_url> por la URL del repositorio de Amazon ECR que creó anteriormente.

DevOps ingeniero

Envíe la imagen de Docker a Amazon ECR.

  1. Ejecute el siguiente comando para iniciar sesión en el repositorio de Amazon ECR:

    aws ecr get-login-password --region us-east-1 --no-cli-auto-prompt | docker login --username AWS --password-stdin <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com
  2. Envíe la imagen de Docker en el repositorio de Amazon ECR ejecutando el siguiente comando:

    docker push <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0
    importante

    Asegúrese de sustituir <your_aws_account_id> por el ID de su cuenta de AWS.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Modifique los valores del archivo de manifiesto de Kubernetes.

  1. Modifique el archivo de manifiesto grpc-sample.yaml de Kubernetes en la carpeta de Kubernetes del repositorio según sus necesidades. Debe modificar las anotaciones y el nombre de host en el recurso de entrada. Para ver un ejemplo de recurso de entrada, consulte la sección Información adicional. Para obtener más información sobre anotaciones de entrada, consulte Anotaciones de ingreso en la documentación de Kubernetes.

  2. En el recurso de implementación de Kubernetes, cambie el image de los recursos de despliegue por el identificador uniforme de recursos (URI) del repositorio de Amazon ECR al que insertó la imagen de Docker. Para ver un ejemplo de recurso de implementación, consulte la sección Información adicional.

DevOps ingeniero

Implemente el archivo de manifiesto de Kubernetes.

Para implementar el archivo grpc-sample.yaml en el clúster de Amazon EKS, ejecute el siguiente comando kubectl

kubectl apply -f ./kubernetes/grpc-sample.yaml
DevOps ingeniero
TareaDescripciónHabilidades requeridas

Registre el FQDN para el Equilibrador de carga de aplicación.

  1. Ejecute el siguiente comando kubectl para describir el recurso de entrada de Kubernetes que administra el Equilibrador de carga de aplicación:

    kubectl get ingress -n grpcserver

    En la sección Información adicional se proporciona un ejemplo de resultado. En el resultado, el campo HOSTS muestra el nombre de host DNS para el que se crearon los certificados SSL.

  2. Registre el nombre de dominio (FQDN) del Equilibrador de carga de aplicación en el campo Address del resultado. 

  3. Cree un registro DNS que apunte al FQDN del Equilibrador de carga de aplicación. Si su proveedor de DNS es Amazon Route 53, puede crear un registro de alias que apunte al FQDN del Equilibrador de carga de aplicación. Para obtener más información sobre esta opción, consulte Elección entre registros de alias y sin alias en la documentación de Route 53.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Pruebe el servidor gRPC.

Use g RPCurl para probar el punto final ejecutando el siguiente comando:

grpcurl grpc.example.com:443 list grpc.reflection.v1alpha.ServerReflection helloworld.helloworld
nota

Sustituya grpc.example.com por su nombre de DNS.

DevOps ingeniero

Pruebe el servidor gRPC con un cliente gRPC.

En el ejemplo de cliente gRPC de helloworld_client_ssl.py, sustituya el nombre de host de grpc.example.com por el nombre de host utilizado para el servidor gRPC.  

El siguiente ejemplo de código muestra la respuesta del servidor gRPC a la solicitud del cliente:

python ./app/helloworld_client_ssl.py message: "Hello to gRPC server from Client" message: "Thanks for talking to gRPC server!! Welcome to hello world. Received message is \"Hello to gRPC server from Client\"" received: true

Esto demuestra que el cliente puede hablar con el servidor y que la conexión se ha realizado correctamente.

DevOps ingeniero
TareaDescripciónHabilidades requeridas

Elimine el registro de DNS.

Elimine el registro DNS que apunta al FQDN del Equilibrador de carga de aplicación que creó anteriormente.

Administrador de la nube

Elimine el equilibrador de carga.

En la consola Amazon EC2, elija Equilibradores de carga y, a continuación, elimine el equilibrador de carga que el controlador de Kubernetes creó para su recurso de entrada.

Administrador de la nube

Elimine el clúster de Amazon EKS.

Elimine el clúster de Amazon EKS mediante eksctl:

eksctl delete cluster -f ./eks.yaml
AWS DevOps

Recursos relacionados

Información adicional

Ejemplo de recurso de ingreso:

--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/healthcheck-protocol: HTTP alb.ingress.kubernetes.io/ssl-redirect: "443" alb.ingress.kubernetes.io/backend-protocol-version: "GRPC" alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:<AWS-Region>:<AccountId>:certificate/<certificate_ID> labels: app: grpcserver environment: dev name: grpcserver namespace: grpcserver spec: ingressClassName: alb rules: - host: grpc.example.com # <----- replace this as per your host name for which the SSL certtficate is available in ACM http: paths: - backend: service: name: grpcserver port: number: 9000 path: / pathType: Prefix

Ejemplo de recurso de implementación:

apiVersion: apps/v1 kind: Deployment metadata: name: grpcserver namespace: grpcserver spec: selector: matchLabels: app: grpcserver replicas: 1 template: metadata: labels: app: grpcserver spec: containers: - name: grpc-demo image: <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0 #<------- Change to the URI that the Docker image is pushed to imagePullPolicy: Always ports: - name: grpc-api containerPort: 9000 env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP restartPolicy: Always

Resultado de ejemplo:

NAME CLASS HOSTS Address PORTS AGE grpcserver <none> <DNS-HostName> <ELB-address> 80 27d