

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 un microservicio Java de muestra en Amazon EKS y exponga el microservicio mediante un Equilibrador de carga de aplicación
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer"></a>

*Vijay Thompson y Akkamahadevi Hiremath, Amazon Web Services*

## Resumen
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-summary"></a>

Este patrón describe cómo implementar un microservicio Java de muestra como una aplicación en contenedores en Amazon Elastic Kubernetes Service (Amazon EKS) mediante la utilidad de línea de comandos `eksctl` y Amazon Elastic Container Registry (Amazon ECR). Puede usar un equilibrador de carga de aplicación para equilibrar la carga del tráfico de la aplicación.

## Requisitos previos y limitaciones
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-prereqs"></a>

**Requisitos previos **
+ Una cuenta de AWS activa
+ La interfaz de la línea de comandos de AWS (AWS CLI) versión 1.7, instalada y configurada en Linux, macOS o Windows
+ Un [daemon de Docker](https://docs.docker.com/config/daemon/) en ejecución
+ La utilidad de línea de comandos `eksctl`, instalada y configurada en macOS, Linux o Windows (para obtener más información, consulte [Introducción a Amazon EKS — eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) en la documentación de Amazon EKS).
+ La utilidad de línea de comandos `kubectl`, instalada y configurada en macOS, Linux o Windows (para obtener más información, consulte [Instalar o actualizar eksctl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) en la documentación de Amazon EKS).

**Limitaciones**
+ Este patrón no cubre la instalación de un certificado SSL para el Equilibrador de carga de aplicación.

## Arquitectura
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-architecture"></a>

**Pila de tecnología de destino**
+ Amazon ECR
+ Amazon EKS
+ Elastic Load Balancing

**Arquitectura de destino**

El siguiente diagrama muestra una arquitectura para organizar en contenedores un microservicio Java en Amazon EKS.

![\[Un microservicio Java implementado como una aplicación contenerizada en Amazon EKS.\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/e1dd8ab0-9e1e-4d2b-b7af-89d3e583e57c/images/aaca4fd9-5aaa-4df5-aebd-02a2ed881c3b.png)


## Tools (Herramientas)
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-tools"></a>
+ [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.
+ 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 su intérprete de comandos de línea de comandos.
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) distribuye automáticamente el tráfico entrante entre varios destinos, como instancias, contenedores y direcciones IP de Amazon Elastic Compute Cloud (Amazon EC2), en una o más zonas de disponibilidad.
+ [eksctl](https://eksctl.io/) le ayuda a crear clústeres en Amazon EKS.
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) permite ejecutar comandos en clústeres de Kubernetes.
+ [Docker](https://www.docker.com/) le ayuda a crear, probar y entregar aplicaciones en paquetes llamados contenedores.

## Epics
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-epics"></a>

### Crear un clúster de Amazon EKS mediante eksctl
<a name="create-an-amazon-eks-cluster-by-using-eksctl"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un clúster de Amazon EKS.  | Para crear un clúster de Amazon EKS que utilice dos EC2 instancias de Amazon t2.small como nodos, ejecute el siguiente comando:<pre>eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small</pre>El proceso puede tardar entre 15 y 20 minutos. Una vez creado el clúster, se añade la configuración de Kubernetes adecuada al archivo [kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html). Puede usar el archivo `kubeconfig` con `kubectl`**** para implementar la aplicación en pasos posteriores. | Desarrollador, administrador del sistema | 
| Verifique el clúster de Amazon EKS. | Para comprobar que se ha creado el clúster y que puede conectarse a él, ejecute el comando `kubectl get nodes`. | Desarrollador, administrador del sistema | 

### Cree un repositorio de Amazon ECR y envíe la imagen de Docker.
<a name="create-an-amazon-ecr-repository-and-push-the-docker-image"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un repositorio de Amazon ECR. | Siga las instrucciones de [Creación de un repositorio privado](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) en la documentación de Amazon ECR. | Desarrollador, administrador del sistema | 
| Cree un archivo XML POM. | Cree un archivo `pom.xml` basado en el *ejemplo de código de archivo POM* de la sección de [información adicional](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) de este patrón. | Desarrollador, administrador del sistema | 
| Cree un archivo de origen. | Cree un archivo de origen llamado `HelloWorld.java` en la ruta `src/main/java/eksExample` según el siguiente ejemplo:<pre>package eksExample;<br />import static spark.Spark.get;<br /><br />public class HelloWorld {<br />    public static void main(String[] args) {<br />        get("/", (req, res) -> {<br />            return "Hello World!";<br />        });<br />    }<br />}</pre>Asegúree de usar la siguiente estructura de directorios:<pre>├── Dockerfile<br />├── deployment.yaml<br />├── ingress.yaml<br />├── pom.xml<br />├── service.yaml<br />└── src<br />    └── main<br />        └── java<br />            └── eksExample<br />                └── HelloWorld.java</pre> |  | 
| Cree un Dockerfile. | Cree un archivo `Dockerfile` basado en el *ejemplo de código de Dockerfile* de la sección de [información adicional](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) de este patrón. | Desarrollador, administrador del sistema | 
| Cree y envíe la imagen de Docker. | En el directorio en el que desee que su `Dockerfile` compile, etiquete y envie la imagen a Amazon ECR, ejecute los siguientes comandos:<pre>aws ecr get-login-password --region <region>| docker login --username <username> --password-stdin <account_number>.dkr.ecr.<region>.amazonaws.com<br />docker buildx build --platform linux/amd64 -t hello-world-java:v1 .<br />docker tag hello-world-java:v1 <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1<br />docker push <account_number>.dkr.ecr.<region>.amazonaws.com/<repository_name>:v1</pre>Modifique la región de AWS, el número de cuenta y los detalles del repositorio en los comandos anteriores. Asegúrese de anotar la URL de la imagen para usarla más adelante.Un sistema macOS con un chip M1 tiene problemas para crear una imagen que sea compatible con Amazon EKS que se ejecuta en una AMD64 plataforma. Para resolver este problema, utilice [docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/) para crear una imagen de Docker que funcione en Amazon EKS. |  | 

### Implemente los microservicios de Java
<a name="deploy-the-java-microservices"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree un archivo implementación.  | Cree un archivo YAML llamado `deployment.yaml` basado en el *ejemplo de código de archivo de implementación* de la sección de [información adicional](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) de este patrón.Utilice la URL de la imagen que copió anteriormente como ruta del archivo de imagen para el repositorio de Amazon ECR. | Desarrollador, administrador del sistema | 
| Implemente los microservicios de Java en el clúster de Amazon EKS.  | Para crear una implementación en su clúster de Amazon EKS, ejecute el comando `kubectl apply -f deployment.yaml`. | Desarrollador, administrador del sistema | 
| Verifique el estado de los pods. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | Desarrollador, administrador del sistema | 
| Cree un servicio. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | Desarrollador, administrador del sistema | 
| Instalación del complemento controlador del equilibrador de carga de AWS. | Siga las instrucciones de [Instalación del complemento controlador del equilibrador de carga de AWS](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html) en la documentación de Amazon EKS.Debe tener el complemento instalado para crear un Equilibrador de carga de aplicación o un Equilibrador de carga de red para un servicio de Kubernetes. | Desarrollador, administrador del sistema | 
| Cree un recurso de ingreso. | Cree un archivo YAML llamado `ingress.yaml` basado en el *ejemplo de código de archivo de recurso* de la sección de [información adicional](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) de este patrón. | Desarrollador, administrador del sistema | 
| Cree un Equilibrador de carga de aplicación. | Para implementar el recurso de ingreso y crear un Equilibrador de carga de aplicación, ejecute el comando `kubectl apply -f ingress.yaml`. | Desarrollador, administrador del sistema | 

### Pruebe la aplicación
<a name="test-the-application"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Pruebe y verifique la aplicación. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | Desarrollador, administrador del sistema | 

## Recursos relacionados
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-resources"></a>
+ [Creación de un repositorio privado](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) (documentación de Amazon ECR)
+ [Enviar una imagen de Docker](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html) (documentación de Amazon ECR)
+ [Controladores de ingreso](https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/) (taller de Amazon EKS)
+ [Docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/) (documentación de Docker)

## Información adicional
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional"></a>

**Ejemplo de archivo POM**

```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>


  <groupId>helloWorld</groupId>
  <artifactId>helloWorld</artifactId>
  <version>1.0-SNAPSHOT</version>


  <dependencies>
    <dependency>
      <groupId>com.sparkjava</groupId><artifactId>spark-core</artifactId><version>2.0.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>2.4</version>
        <configuration><finalName>eksExample</finalName><archive><manifest>
              <addClasspath>true</addClasspath><mainClass>eksExample.HelloWorld</mainClass><classpathPrefix>dependency-jars/</classpathPrefix>
            </manifest></archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version>
        <configuration><source>1.8</source><target>1.8</target></configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <goals><goal>attached</goal></goals><phase>package</phase>
            <configuration>
              <finalName>eksExample</finalName>
              <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs>
              <archive><manifest><mainClass>eksExample.HelloWorld</mainClass></manifest></archive>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
```

**Ejemplo de Dockerfile**

```
FROM bellsoft/liberica-openjdk-alpine-musl:17

RUN apk add maven
WORKDIR /code

# Prepare by downloading dependencies
ADD pom.xml /code/pom.xml
RUN ["mvn", "dependency:resolve"]
RUN ["mvn", "verify"]

# Adding source, compile and package into a fat jar
ADD src /code/src
RUN ["mvn", "package"]

EXPOSE 4567
CMD ["java", "-jar", "target/eksExample-jar-with-dependencies.jar"]
```

**Ejemplo de archivo de implementación**

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: microservice-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app.kubernetes.io/name: java-microservice
  template:
    metadata:
      labels:
        app.kubernetes.io/name: java-microservice
    spec:
      containers:
      - name: java-microservice-container
        image: .dkr.ecr.amazonaws.com/:
        ports:
        - containerPort: 4567
```

**Ejemplo de archivo de servicio**

```
apiVersion: v1
kind: Service
metadata:
  name: "service-java-microservice"
spec:
  ports:
    - port: 80
      targetPort: 4567
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: java-microservice
```

**Ejemplo de archivo de recursos de ingreso**

```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "java-microservice-ingress"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/load-balancer-name: apg2
    alb.ingress.kubernetes.io/target-type: ip
  labels:
    app: java-microservice
spec:
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "service-java-microservice"
                port:
                  number: 80
```