Amazon EKS 클러스터에 g RPC기반 애플리케이션을 배포하고 Application Load Balancer로 액세스 - AWS 권장 가이드

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

Amazon EKS 클러스터에 g RPC기반 애플리케이션을 배포하고 Application Load Balancer로 액세스

작성자: Kirankumar Chandrashekar(AWS) 및 Huy Nguyen(AWS)

코드 리포지토리: grpc-traffic-on-alb-to-eks

환경: PoC 또는 파일럿

기술: 컨테이너 및 마이크로서비스, 콘텐츠 전송, 웹 및 모바일 앱

워크로드: 기타 모든 워크로드

AWS 서비스: Amazon EKS, Elastic Load Balancing(ELB)

요약

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

gRPC는 모든 환경에서 실행할 수 있는 오픈 소스 원격 프로시저 호출(RPC) 프레임워크입니다. 마이크로서비스 통합 및 클라이언트 서버 통신에 사용할 수 있습니다. g에 대한 자세한 내용은 블로그 AWS 게시물 Application Load Balancer /2 및 g 지원을 RPC참조하세요. Application Load Balancer end-to-end HTTPRPC

이 패턴은 Amazon 의 Kubernetes 포드에서 실행되는 g RPC기반 애플리케이션을 호스팅하는 방법을 보여줍니다EKS. gRPC 클라이언트는 SSL/TLS 암호화된 연결을 사용하여 HTTP/2 프로토콜을 통해 Application Load Balancer에 연결합니다. Application Load Balancer는 Amazon EKS 포드에서 실행되는 gRPC 애플리케이션으로 트래픽을 전달합니다. Kubernetes Horizontal Pod Autoscaler 를 사용하여 트래픽에 따라 gRPC 포드 수를 자동으로 조정할 수 있습니다. Application Load Balancer 의 대상 그룹은 Amazon EKS 노드에 대한 상태 확인을 수행하고, 대상이 정상인지 평가하고, 정상 노드에만 트래픽을 전달합니다.

사전 조건 및 제한 사항

사전 조건 

아키텍처

다음 다이어그램은 이 패턴으로 구현된 아키텍처를 보여줍니다.

Amazon의 g RPC기반 애플리케이션을 위한 아키텍처 EKS

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

gRPC 서버로 SSL/TLS 트래픽을 보내기 위한 워크플로

도구

AWS 서비스

  • AWS 명령줄 인터페이스(AWS CLI)는 명령줄 쉘의 명령을 통해 AWS 서비스와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다.

  • Elastic Load Balancing(ELB)은 들어오는 애플리케이션 또는 네트워크 트래픽을 여러 대상에 분산합니다. 예를 들어 하나 이상의 가용 영역에 있는 Amazon Elastic Compute Cloud(AmazonEC2) 인스턴스, 컨테이너 및 IP 주소 간에 트래픽을 분산할 수 있습니다.

  • Amazon Elastic Container Registry(Amazon ECR)는 안전하고 확장 가능하며 안정적인 관리형 컨테이너 이미지 레지스트리 서비스입니다. 

  • Amazon Elastic Kubernetes Service(Amazon EKS)를 사용하면 자체 Kubernetes 제어 영역 또는 노드를 설치하거나 유지 관리할 필요 AWS 없이 에서 Kubernetes를 실행할 수 있습니다. 

도구

  • eksctl은 Amazon 에서 클러스터를 생성하기 위한 간단한 CLI 도구입니다EKS.

  • kubectl은 Kubernetes 클러스터에 대해 명령을 실행하기 위한 명령줄 유틸리티입니다.

  • AWS Load Balancer 컨트롤러는 Kubernetes 클러스터의 AWS Elastic Load Balancer를 관리하는 데 도움이 됩니다.

  • gRPCurl는 gRPC 서비스와 상호 작용하는 데 도움이 되는 명령줄 도구입니다.

코드 리포지토리

이 패턴의 코드는 GitHub grpc-traffic-on-alb-to-eks 리포지토리에서 사용할 수 있습니다.

에픽

작업설명필요한 기술

Amazon ECR리포지토리를 생성합니다.

AWS 관리 콘솔에 로그인하고 Amazon ECR 콘솔 을 연 다음 Amazon ECR리포지토리를 생성합니다. 자세한 내용은 Amazon ECR 설명서의 리포지토리 생성을 참조하세요. Amazon ECR리포지토리의 를 기록해야 합니다URL.

다음 명령을 실행AWSCLI하여 를 사용하여 Amazon ECR리포지토리를 생성할 수도 있습니다.

aws ecr create-repository --repository-name helloworld-grpc
클라우드 관리자

Docker 이미지를 구축합니다.

  1. GitHub grpc-traffic-on-alb-to-eks 리포지토리를 복제합니다.

    git clone https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git
  2. 리포지토리의 루트 디렉터리에서 Dockerfile이 존재하는지 확인한 다음 다음 다음 명령을 실행하여 Docker 이미지를 빌드합니다. 

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

    중요 : 이전에 생성한 Amazon ECR리포지토리URL의 <amazon_ecr_repository_url>로 를 교체해야 합니다.

DevOps 엔지니어

Docker 이미지를 Amazon 로 푸시합니다ECR.

  1. 다음 명령을 실행하여 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. 다음 명령을 실행하여 Docker 이미지를 Amazon ECR리포지토리로 푸시합니다.

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

    중요 : 를 AWS 계정 ID<your_aws_account_id>로 바꿔야 합니다.

DevOps 엔지니어
작업설명필요한 기술

Kubernetes 매니페스트 파일의 값을 수정합니다.

  1. 요구 사항에 따라 리포지토리의 grpc-sample.yaml Kubernetes 폴더에서 Kubernetes 매니페스트 파일을 수정합니다. 인그레스 리소스의 주석과 호스트 이름을 수정해야 합니다. 샘플 인그레스 리소스는 추가 정보 섹션을 참조하세요. 인그레스 주석에 대한 자세한 내용은 Kubernetes 설명서의 인그레스 주석을 참조하세요.

  2. Kubernetes 배포 리소스에서 배포 리소스를 Docker 이미지를 푸시한 Amazon ECR리포지토리의 image 균일한 리소스 식별자(URI)로 변경합니다. 샘플 배포 리소스는 추가 정보 섹션을 참조하세요.

DevOps 엔지니어

Kubernetes 매니페스트 파일을 배포합니다.

다음 kubectl 명령을 실행하여 grpc-sample.yaml 파일을 Amazon EKS 클러스터에 배포합니다. 

kubectl apply -f ./kubernetes/grpc-sample.yaml
DevOps 엔지니어
작업설명필요한 기술

Application Load Balancer 에 FQDN 대한 를 기록합니다. Application Load Balancer

  1. 다음 kubectl 명령을 실행하여 Application Load Balancer를 관리하는 Kubernetes 인그레스 리소스를 설명합니다.

    kubectl get ingress -n grpcserver

    샘플 출력은 추가 정보 섹션에 나와 있습니다. 출력에서 HOSTS 필드에는 SSL 인증서가 생성된 DNS 호스트 이름이 표시됩니다.

  2. 출력 필드에서 Application Load BalancerAddress의 정규화된 도메인 이름(FQDN)을 기록합니다. 

  3. Application Load Balancer를 가리키는 DNS 레코드를 생성합니다FQDN. DNS 공급자가 Amazon Route 53인 경우 Application Load Balancer의 를 가리키는 별칭 레코드를 생성할 수 있습니다FQDN. 이 옵션에 대한 자세한 내용은 Route 53 설명서의 별칭 및 비별칭 레코드 선택을 참조하세요.

DevOps 엔지니어
작업설명필요한 기술

gRPC 서버를 테스트합니다.

gRPCurl 를 사용하여 다음 명령을 실행하여 엔드포인트를 테스트합니다.

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

참고: grpc.example.com를 DNS 이름으로 바꿉니다.

DevOps 엔지니어

gRPC 클라이언트를 사용하여 gRPC 서버를 테스트합니다.

helloworld_client_ssl.py 샘플 gRPC 클라이언트에서 의 호스트 이름을 gRPC 서버에 사용되는 grpc.example.com 호스트 이름으로 바꿉니다. 

다음 코드 샘플은 클라이언트 요청에 대한 gRPC 서버의 응답을 보여줍니다.

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

이는 클라이언트가 서버와 통신할 수 있고 연결에 성공했음을 보여줍니다.

DevOps 엔지니어
작업설명필요한 기술

DNS 레코드를 제거합니다.

이전에 생성한 Application Load Balancer 를 가리키는 DNS 레코드FQDN를 제거합니다.

클라우드 관리자

로드 밸런서를 제거합니다.

Amazon EC2 콘솔 에서 로드 밸런서 를 선택한 다음 Kubernetes 컨트롤러가 수신 리소스용으로 생성한 로드 밸런서를 제거합니다.

클라우드 관리자

Amazon EKS 클러스터를 삭제합니다.

를 사용하여 Amazon EKS 클러스터를 삭제eksctl합니다.

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

관련 리소스

추가 정보

샘플 인그레스 리소스:

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