

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
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer"></a>

*Kirankumar Chandrashekar y Huy Nguyen, Amazon Web Services*

## Resumen
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-summary"></a>

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](https://grpc.io/) 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](https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/) 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](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html). 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
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-prereqs"></a>

**Requisitos previos**
+ Una cuenta de AWS activa.
+ [Docker](https://www.docker.com/), instalado y configurado en Linux, macOS o Windows.
+ [Interfaz de la línea de comandos de AWS (AWS CLI) versión 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html), instalada y configurada en Linux, macOS o Windows.
+ [eksctl](https://github.com/eksctl-io/eksctl#installation) instalado y configurado en Linux, macOS o Windows.
+ `kubectl`, instalado y configurado para acceder a los recursos de su clúster de Amazon EKS. Para más información, consulte [Instalar o actualizar kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) en la documentación de Amazon EKS. 
+ [g RPCurl](https://github.com/fullstorydev/grpcurl), instalado y configurado.
+ Un clúster existente o nuevo de Amazon EKS. Para obtener más información, consulte [Getting started with Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html).
+ Su terminal de equipo está configurado para acceder al clúster de Amazon EKS. Para obtener más información, consulte [Configuración del equipo para que se comunique con el clúster](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl) en la documentación de Amazon EKS.
+ [Controlador del equilibrador de carga de AWS](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html), aprovisionado en el clúster de Amazon EKS.
+ Un nombre de host DNS existente con un SSL/TLS certificado o SSL válido. Puede obtener un certificado para su dominio mediante AWS Certificate Manager (ACM) o cargando un certificado existente en ACM. Para obtener más información sobre estas dos opciones, consulte [Solicitud de un certificado público](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html) e [Importación de certificados a AWS Certificate Manager](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html) en la documentación de ACM.

## Arquitectura
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-architecture"></a>

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

![Arquitectura para aplicación basada en gRPC en Amazon EKS](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/281936fa-bc43-4b4e-a343-ba1eab97df38.png)


 

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](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/09e0c3f6-0c39-40b7-908f-8c4c693a5f02.png)


## Tools (Herramientas)
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-tools"></a>

**Servicios de AWS**
+ La [Interfaz de la línea de comandos de AWS (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 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](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) 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)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable. 
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) lo ayuda a ejecutar Kubernetes en AWS sin necesidad de instalar ni mantener su propio plano de control o nodos de Kubernetes.  

**Herramientas**
+ [eksctl](https://eksctl.io/) es una herramienta de CLI sencilla para crear clústeres de Amazon EKS.
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-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](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html) le ayuda a administrar los Elastic Load Balancer de AWS para un clúster de Kubernetes.
+ [g RPCurl](https://github.com/fullstorydev/grpcurl) 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](https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git).

## Epics
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-epics"></a>

### Cree y envíe la imagen de Docker del servidor gRPC a Amazon ECR
<a name="build-and-push-the-grpc-serverrsquor-s-docker-image-to-amazon-ecr"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un repositorio de Amazon ECR. | Inicie sesión en la Consola de administración de AWS, abra la [consola de Amazon ECR](https://console.aws.amazon.com/ecr/) y, luego, cree un repositorio de Amazon ECR. Para obtener más información, consulte [Creación de un repositorio](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) en la documentación de Amazon ECR. Asegúrese de registrar la URL del repositorio de Amazon ECR.<br />También puede crear un repositorio de Amazon ECR con la CLI de AWS ejecutando el siguiente comando:<pre>aws ecr create-repository --repository-name helloworld-grpc</pre> | Administrador de la nube | 
| Cree la imagen de Docker.  | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps ingeniero | 
| Envíe la imagen de Docker a Amazon ECR. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps ingeniero | 

### Implemente los manifiestos de Kubernetes en el clúster de Amazon EKS
<a name="deploy-the-kubernetes-manifests-to-the-amazon-eks-cluster"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Modifique los valores del archivo de manifiesto de Kubernetes. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | 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`: <pre>kubectl apply -f ./kubernetes/grpc-sample.yaml</pre> | DevOps ingeniero | 

### Cree el registro de DNS para el FQDN del Equilibrador de carga de aplicación
<a name="create-the-dns-record-for-the-application-load-balancerapos-s-fqdn"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Registre el FQDN para el Equilibrador de carga de aplicación. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps ingeniero | 

### Pruebe la solución
<a name="test-the-solution"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Pruebe el servidor gRPC.  | Use g RPCurl para probar el punto final ejecutando el siguiente comando:<pre>grpcurl grpc.example.com:443 list <br />grpc.reflection.v1alpha.ServerReflection<br />helloworld.helloworld</pre>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.  <br />El siguiente ejemplo de código muestra la respuesta del servidor gRPC a la solicitud del cliente:<pre>python ./app/helloworld_client_ssl.py<br />message: "Hello to gRPC server from Client"<br /><br />message: "Thanks for talking to gRPC server!! Welcome to hello world. Received message is \"Hello to gRPC server from Client\""<br />received: true</pre><br />Esto demuestra que el cliente puede hablar con el servidor y que la conexión se ha realizado correctamente. | DevOps ingeniero | 

### Limpieza
<a name="clean-up"></a>


| Tarea | Descripción | Habilidades 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](https://console.aws.amazon.com/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`:<pre>eksctl delete cluster -f ./eks.yaml</pre> | AWS DevOps | 

## Recursos relacionados
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-resources"></a>
+ [Equilibrio de carga de red en Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/load-balancing.html)
+ [Grupos de destino para los Equilibradores de carga de aplicación](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version)

## Información adicional
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-additional"></a>

**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
```