

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

# Amazon EKS 클러스터에 gRPC 기반 애플리케이션을 배포하고 Application Load Balancer를 사용하여 액세스하기
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer"></a>

*Kirankumar Chandrashekar 및 Huy Nguyen, Amazon Web Services*

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

이 패턴은 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 gRPC 기반 애플리케이션을 호스팅하고 Application Load Balancer를 통해 안전하게 액세스하는 방법을 설명합니다.

[gRPC는](https://grpc.io/) 모든 환경에서 실행할 수 있는 오픈 소스 원격 프로시져 호출(RPC) 프레임워크입니다. 마이크로서비스 통합 및 클라이언트 서버 통신에 사용할 수 있습니다. gRPC에 대한 자세한 내용은 Amazon Web Services(AWS) 블로그의 [엔드 투 엔드 HTTP/2 및 gRPC에 대한 Application Load Balancer 지원](https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/) AWS Blog 게시물을 참조하세요.

이 패턴은 Amazon EKS에서 Kubernetes 포드로 실행되는 gRPC 기반 애플리케이션을 호스팅하는 방법을 보여줍니다. gRPC 클라이언트는 SSL/TLS(Secure Sockets Layer/Transport Layer Security)로 암호화된 연결을 사용하는 HTTP/2 프로토콜을 통해 Application Load Balancer에 연결합니다. Application Load Balancer는 Amazon EKS 포드에서 실행되는 gRPC 애플리케이션으로 트래픽을 전달합니다. [Kubernetes Horizontal Pod Autoscaler](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html)를 사용하여 gRPC 포드의 수를 트래픽에 따라 자동으로 조정할 수 있습니다. Application Load Balancer의 대상 그룹은 Amazon EKS 노드에서 상태 확인을 수행하고 대상이 정상인지 평가한 후 정상 노드에만 트래픽을 전달합니다.

## 사전 조건 및 제한 사항
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-prereqs"></a>

**사전 조건 **
+ 활성 상태의 AWS 계정.
+ [Docker](https://www.docker.com/), Linux, macOS 또는 Windows에 설치 및 구성되었습니다.
+ [AWS Command Line Interface(AWS CLI) 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html), Linux, macOS 또는 Windows에 설치 및 구성됨.
+ [Docker](https://github.com/eksctl-io/eksctl#installation), Linux, macOS 또는 Windows에 설치 및 구성되었습니다.
+ `kubectl`, Amazon EKS 클러스터의 리소스에 액세스하도록 설치 및 구성됨. 자세한 내용은 Amazon EKS 설명서의 [kubectl 설치](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)를 참조하세요. 
+ [gRPCURL](https://github.com/fullstorydev/grpcurl), 설치 및 구성됨
+ 기존 이상 Amazon EKS 클러스터. 자세한 내용은 [Amazon S3 시작하기](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 섹션을 참조하세요.
+ Amazon EKS 클러스터에 액세스하도록 구성된 컴퓨터 터미널입니다. 자세한 내용은 Amazon EKS 설명서의 [클러스터와 통신하도록 컴퓨터 구성을 참조하세요](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl).
+ [AWS Load Balancer Controller](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html), Amazon EKS 클러스터에서 프로비저닝됨.
+ 유효한 SSL 또는 SSL/TLS 인증서를 사용하는 기존 도메인 이름 시스템(DNS) 호스트 이름입니다. AWS Certificate Manager(ACM)를 사용하거나 기존 인증서를 ACM에 업로드하여 도메인에 대한 인증서를 받을 수 있습니다. 이 두 가지 옵션에 대한 자세한 내용은 ACM 설명서의 [공인 인증서 요청](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html) 및 [AWS Certificate Manager로 인증서 가져오기](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)를 참조하세요.

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

다음 다이어그램은 이 패턴이 구축하는 아키텍처를 보여줍니다.

![\[Amazon EKS의 gRPC 기반 애플리케이션을 위한 아키텍처\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/281936fa-bc43-4b4e-a343-ba1eab97df38.png)


 

다음 다이어그램은 Application Load Balancer로 오프로드되는 gRPC 클라이언트에서 SSL/TLS 트래픽을 수신하는 워크플로우를 보여줍니다. 트래픽은 Virtual Private Cloud(VPC)에서 오기 때문에 gRPC 서버에 일반 텍스트로 전달됩니다.

![\[SSL/TLS 트래픽을 gRPC 서버로 전송하는 워크플로\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/09e0c3f6-0c39-40b7-908f-8c4c693a5f02.png)


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

**서비스**
+ [Command Line Interface(CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)는 명령줄 쉘에서 명령을 사용하여 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.
+ [Elastic Load Balancing(ELB)](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html)은 들어오는 애플리케이션 또는 네트워크 트래픽을 여러 대상에 분산합니다. 예를 들어 하나 이상의 가용 영역에 있는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, 컨테이너, IP 주소 전반에 걸쳐 트래픽을 분산할 수 있습니다.
+ [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 컨트롤 플레인 또는 노드를 설치하거나 유지 관리할 필요 없이 Kubernetes를 실행하는 데 도움이 됩니다. 

**도구**
+ [eksctl](https://eksctl.io/)은 Amazon EKS에 클러스터를 생성하기 위한 간단한 CLI 도구입니다.
+ [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)은 Kubernetes 클러스터에 대해 명령을 실행하기 위한 명령줄 유틸리티입니다.
+ [AWS Load Balancer Controller](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)는 Kubernetes 클러스터의 AWS Elastic Load Balancer를 관리하는 데 유용합니다.
+ [gRPCurl](https://github.com/fullstorydev/grpcurl)은 gRPC 서비스와 상호 작용하는 데 도움이 되는 명령줄 도구입니다.

**코드 리포지토리**

이 패턴의 코드는 GitHub.com의 [grpc-traffic-on-alb-to-eks](https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git) 리포지토리에서 확인할 수 있습니다.

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

### gRPC 서버의 도커 이미지를 빌드하여 Amazon ECR로 푸시합니다.
<a name="build-and-push-the-grpc-serverrsquor-s-docker-image-to-amazon-ecr"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Amazon ECR 리포지토리를 생성합니다. | AWS Management Console에 로그인한 다음 [Amazon ECR 콘솔](https://console.aws.amazon.com/ecr/)을 열고 Amazon ECR 리포지토리를 생성합니다. 자세한 내용은 Amazon ECR 설명서의 [리포지토리 생성](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)을 참조하세요. Amazon ECR 리포지토리의 URL을 기록하세요.다음 명령을 실행하여 AWS CLI를 사용하여 Amazon ECR 리포지토리를 생성할 수도 있습니다.<pre>aws ecr create-repository --repository-name helloworld-grpc</pre> | 클라우드 관리자 | 
| Docker 이미지를 구축합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 엔지니어 | 
| 도커 이미지를 Amazon ECR로 푸시합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 엔지니어 | 

### Kubernetes 매니페스트를 Amazon EKS 클러스터에 배포합니다.
<a name="deploy-the-kubernetes-manifests-to-the-amazon-eks-cluster"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Kubernetes 매니페스트 파일의 값을 수정합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 엔지니어 | 
| Kubernetes 매니페스트 파일을 배포합니다. | 다음 `kubectl` 명령을 실행하여 `grpc-sample.yaml` 파일을 Amazon EKS 클러스터에 배포합니다. <pre>kubectl apply -f ./kubernetes/grpc-sample.yaml</pre> | DevOps 엔지니어 | 

### Application Load Balancer의 FQDN에 대한 DNS 레코드 생성
<a name="create-the-dns-record-for-the-application-load-balancerapos-s-fqdn"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| Application Load Balancer에 대한 FQDN을 기록합니다. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps 엔지니어 | 

### 솔루션 테스트
<a name="test-the-solution"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| gRPC 서버를 테스트합니다. | 다음 명령을 실행하여 gRPCurl을 사용하여 엔드포인트를 테스트합니다.<pre>grpcurl grpc.example.com:443 list <br />grpc.reflection.v1alpha.ServerReflection<br />helloworld.helloworld</pre>`grpc.example.com`을 사용자 이름으로 바꿉니다. | DevOps 엔지니어 | 
| gRPC 클라이언트를 사용하여 gRPC 서버를 테스트합니다. | `helloworld_client_ssl.py`샘플 gRPC 클라이언트에서 의 호스트 이름을 gRPC 서버에 사용되는 호스트 이름으로 바꿉니다. 다음 코드 샘플은 클라이언트 요청에 대한 gRPC 서버의 응답을 보여줍니다.<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>이는 클라이언트가 서버와 통신할 수 있고 연결에 성공했음을 보여줍니다. | DevOps 엔지니어 | 

### 정리
<a name="clean-up"></a>


| 작업 | 설명 | 필요한 기술 | 
| --- | --- | --- | 
| DNS 레코드를 제거합니다. | 이전에 생성한 Application Load Balancer의 FQDN을 가리키는 DNS 레코드를 제거합니다. | 클라우드 관리자 | 
| 로드 밸런서를 제거합니다. | [Amazon EC2 콘솔](https://console.aws.amazon.com/ec2/)에서 **로드 밸런서를** 선택한 다음 Kubernetes 컨트롤러가 수신 리소스에 대해 생성한 로드 밸런서를 제거합니다. | 클라우드 관리자 | 
| Amazon EKS 클러스터를 생성합니다. | 를 사용하여 Amazon EKS 클러스터를 삭제합니다`eksctl`.<pre>eksctl delete cluster -f ./eks.yaml</pre> | DevOps | 

## 관련 리소스
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-resources"></a>
+ [Amazon EKS의 네트워크 로드 밸런싱](https://docs.aws.amazon.com/eks/latest/userguide/load-balancing.html)
+ [Application Load Balancer 대상 그룹](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version)

## 추가 정보
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-additional"></a>

**샘플 인그레스 리소스:**

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

**샘플 배포 리소스:**

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

**샘플 출력:**

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