

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon EKS에 샘플 Java 마이크로서비스를 배포하고 Application Load Balancer를 사용하여 마이크로서비스 노출하기
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer"></a>

*Vijay Thompson과 Akkamahadevi hiremath, Amazon Web Services*

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

이 패턴은 `eksctl` 명령줄 유틸리티와 Amazon Elastic Container Registry(Amazon ECR)를 사용하여 샘플 Java 마이크로서비스를 Amazon Elastic Kubernetes Service(Amazon EKS)에 컨테이너화된 애플리케이션으로 배포하는 방법을 설명합니다. Application Load Balancer을 사용하여 애플리케이션 트래픽을 로드 밸런싱할 수 있습니다.

## 사전 조건 및 제한 사항
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정
+ macOS, Linux 또는 Windows에 설치 및 구성된 AWS Command Line Interface(AWS CLI) 버전 1.7 이상
+ 실행 중인 [Docker 대몬(daemon)](https://docs.docker.com/config/daemon/)
+ MacOS, Linux 또는 Windows에 설치 및 구성된 `eksctl` 명령줄 유틸리티(자세한 내용은 Amazon EKS 설명서의 [Amazon EKS - eksctl 시작하기](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) 참조)
+ MacOS, Linux 또는 Windows에 설치 및 구성된 `kubectl` 명령줄 유틸리티(자세한 내용은 Amazon EKS 설명서의 [kubectl 설치 또는 업데이트](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html) 참조)

**제한 사항 **
+ 이 패턴은 Application Load Balancer의 SSL 인증서 설치에는 적용되지 않습니다.

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

**대상 기술 스택**
+ Amazon ECR
+ Amazon EKS
+ Elastic Load Balancing

**대상 아키텍처**

다음 다이어그램은 Amazon EKS에서 Java 마이크로서비스를 컨테이너화하기 위한 아키텍처를 보여줍니다.

![\[Amazon EKS에서 컨테이너화된 애플리케이션으로 배포된 Java 마이크로서비스.\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/e1dd8ab0-9e1e-4d2b-b7af-89d3e583e57c/images/aaca4fd9-5aaa-4df5-aebd-02a2ed881c3b.png)


## 도구
<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)는 안전하고 확장 가능하고 신뢰할 수 있는 관리형 컨테이너 이미지 레지스트리 서비스입니다.
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)는 자체 Kubernetes 컨트롤 플레인이나 노드를 설치하거나 유지 관리할 필요 없이 AWS에서 Kubernetes를 실행할 수 있도록 도와줍니다.
+ [AWS Command Line Interface(AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.
+ [Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)은 하나 이상의 가용 영역에서 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, 컨테이너, IP 주소 등 여러 대상에 걸쳐 수신되는 트래픽을 자동으로 분산합니다.
+ [eksctl](https://eksctl.io/)은 Amazon EKS에서 클러스터를 생성하는 데 도움이 됩니다.
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)를 사용하면 쿠버네티스 클러스터에 대해 명령을 실행할 수 있습니다.
+ [Docker](https://www.docker.com/)는 컨테이너라는 패키지로 애플리케이션을 빌드, 테스트 및 제공할 수 있도록 도와줍니다.

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

### eksctl을 사용하여 Amazon EKS 클러스터 생성
<a name="create-an-amazon-eks-cluster-by-using-eksctl"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon EKS 클러스터를 생성합니다. | 두 개의 t2.small Amazon EC2 인스턴스를 노드로 사용하는 Amazon EKS 클러스터를 생성하려면 다음 명령을 실행합니다.<pre>eksctl create cluster --name <your-cluster-name> --version <version-number> --nodes=1 --node-type=t2.small</pre>이 프로세스는 15분에서 20분 정도 걸릴 수 있습니다. 클러스터가 생성되고 나면 적절한 Kubernetes 구성이 [kubeconfig 파일](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html)에 추가됩니다. 이후 단계에서 `kubectl`** **와(과) 함께 `kubeconfig` 파일을 사용하여 애플리케이션을 배포할 수 있습니다. | 개발자, 시스템 관리자 | 
| Amazon EKS 클러스터를 확인합니다. | 클러스터가 생성되었고 클러스터에 연결할 수 있는지 확인하려면 `kubectl get nodes` 명령을 실행합니다. | 개발자, 시스템 관리자 | 

### Amazon ECR 리포지토리를 생성하고 도커 이미지를 푸시합니다.
<a name="create-an-amazon-ecr-repository-and-push-the-docker-image"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon ECR 리포지토리를 생성합니다. | Amazon ECR 설명서의 [프라이빗 리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)의 지침을 따르세요. | 개발자, 시스템 관리자 | 
| POM XML 파일을 생성합니다. | 이 패턴의 [추가 정보](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) 섹션에 있는 *예제 POM 파일* 코드를 기반으로 파일 `pom.xml`을(를) 생성합니다. | 개발자, 시스템 관리자 | 
| 소스 파일을 생성합니다. | 다음 예제를 기반으로 `src/main/java/eksExample` 경로에서 `HelloWorld.java`라는 소스 파일을 생성합니다.<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>다음과 같은 디렉터리 구조를 사용하도록 합니다.<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> |  | 
| Dockerfile을 생성합니다. | 이 패턴의 [추가 정보](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) 섹션에 있는 *예제 Dockerfile* 코드를 기반으로 `Dockerfile`을(를) 생성합니다. | 개발자, 시스템 관리자 | 
| 도커 이미지를 빌드하고 푸시합니다. | `Dockerfile`이(가) 이미지를 빌드하고 태그를 지정하고 Amazon ECR로 푸시하도록 하려는 디렉터리에서 다음 명령을 실행합니다.<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>이전 명령에서 AWS 리전, 계정 번호, 리포지토리 세부 정보를 수정합니다. 나중에 사용할 수 있도록 이미지 URL을 기록하세요.M1 칩이 장착된 macOS 시스템에서는 AMD64 플랫폼에서 실행되는 Amazon EKS와 호환되는 이미지를 구축하는 데 문제가 있습니다. 이 문제를 해결하려면 [docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/)를 사용하여 Amazon EKS에서 작동하는 도커 이미지 빌드하세요. |  | 

### Java 마이크로서비스 배포
<a name="deploy-the-java-microservices"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 배포 파일을 생성합니다. | 이 패턴의 [추가 정보](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) 섹션에 있는 *예제 배포 파일* 코드를 기반으로 `deployment.yaml`라는 YAML 파일을 생성합니다.이전에 복사한 이미지 URL을 Amazon ECR 리포지토리의 이미지 파일의 경로로 사용합니다. | 개발자, 시스템 관리자 | 
| Amazon EKS 클러스터에 Java 마이크로서비스를 배포합니다. | Amazon EKS 클러스터에 배포를 생성하려면 `kubectl apply -f deployment.yaml` 명령을 실행합니다. | 개발자, 시스템 관리자 | 
| 포드의 상태를 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 개발자, 시스템 관리자 | 
| 서비스를 생성합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 개발자, 시스템 관리자 | 
| AWS Load Balancer Controller 추가 기능을 설치합니다. | Amazon EKS 설명서의 [AWS Load Balancer Controller 추가 기능 설치](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html) 지침을 따르세요.Kubernetes 서비스를 위한 Application Load Balancer 또는 Network Load Balancer를 생성하려면 추가 기능을 설치해야 합니다. | 개발자, 시스템 관리자 | 
| 인그레스 리소스를 생성합니다. | 이 패턴의 [추가 정보](#deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional) 섹션에 있는 *예제 인그레스 리소스 파일* 코드를 기반으로 `ingress.yaml`라는 YAML 파일을 생성합니다. | 개발자, 시스템 관리자 | 
| Application Load Balancer을 생성합니다. | 인그레스 리소스를 배포하고 Application Load Balancer를 생성하려면 `kubectl apply -f ingress.yaml` 명령을 실행합니다. | 개발자, 시스템 관리자 | 

### 애플리케이션 테스트
<a name="test-the-application"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| 애플리케이션을 테스트하고 확인합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer.html) | 개발자, 시스템 관리자 | 

## 관련 리소스
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-resources"></a>
+ [프라이빗 리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html) (Amazon ECR 설명서)
+ [도커 이미지 푸시](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)(Amazon ECR 설명서)
+ [인그레스 컨트롤러](https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/) (Amazon EKS Workshop)
+ [Docker buildx](https://docs.docker.com/engine/reference/commandline/buildx/) (Docker Docs)

## 추가 정보
<a name="deploy-a-sample-java-microservice-on-amazon-eks-and-expose-the-microservice-using-an-application-load-balancer-additional"></a>

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

**예제 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"]
```

**예제 배포 파일**

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

**예제 서비스 파일**

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

**예제 인그레스 리소스 파일**

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