EKS Auto Mode에 샘플 로드 밸런서 워크로드 배포하기

EKS Auto Mode에 샘플 로드 밸런서 워크로드 배포하기

이 가이드는 로드 밸런싱과 인터넷 접근성을 갖춘 2048 게임의 컨테이너화 버전을 Amazon EKS에 배포하는 과정을 안내합니다.

출처: 문서

본문

사전 조건

  • EKS Auto Mode 클러스터
  • 클러스터와 상호작용하도록 구성된 kubectl
  • ALB 리소스 생성에 적절한 IAM 권한

1단계: 네임스페이스 생성

먼저 2048 게임 애플리케이션용 전용 네임스페이스를 만듭니다.

01-namespace.yaml 파일을 만듭니다.

apiVersion: v1
kind: Namespace
metadata:
  name: game-2048

네임스페이스 구성을 적용합니다.

kubectl apply -f 01-namespace.yaml

2단계: 애플리케이션 배포

애플리케이션은 2048 게임 컨테이너의 여러 복제본을 실행합니다.

02-deployment.yaml 파일을 만듭니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: game-2048
  name: deployment-2048
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: app-2048
  replicas: 5
  template:
    metadata:
      labels:
        app.kubernetes.io/name: app-2048
    spec:
      containers:
        - image: public.ecr.aws/l6m2t8p7/docker-2048:latest
          imagePullPolicy: Always
          name: app-2048
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: "0.5"

Note: public.ecr.aws/l6m2t8p7/docker-2048:latest 이미지 로드 오류가 발생하면 Node IAM 역할에 ECR에서 이미지를 가져올 충분한 권한이 있는지 확인하세요. 자세한 내용은 Node IAM role을 참고하세요. 또한 예시의 docker-2048 이미지는 x86_64 이미지이며 다른 아키텍처에서는 실행되지 않습니다.

핵심 구성 요소:

  • 애플리케이션의 복제본 5개를 배포합니다.
  • 공용 ECR 이미지를 사용합니다.
  • Pod당 0.5 CPU 코어를 요청합니다.
  • HTTP 트래픽용 포트 80을 노출합니다.

배포를 적용합니다.

kubectl apply -f 02-deployment.yaml

3단계: Service 생성

Service는 배포를 클러스터 네트워크에 노출합니다.

03-service.yaml 파일을 만듭니다.

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app.kubernetes.io/name: app-2048

핵심 구성 요소:

  • ClusterIP 서비스를 만듭니다.
  • 포트 80을 컨테이너의 포트 80에 매핑합니다.
  • 라벨 셀렉터로 Pod를 찾습니다.

Service를 적용합니다.

kubectl apply -f 03-service.yaml

4단계: 로드 밸런싱 구성

애플리케이션을 인터넷에 노출하기 위해 ingress를 설정합니다.

먼저 IngressClass를 만듭니다. 04-ingressclass.yaml 파일을 만듭니다.

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/name: LoadBalancerController
  name: alb
spec:
  controller: eks.amazonaws.com/alb

Note: EKS Auto Mode는 공용·프라이빗 서브넷을 식별하려면 서브넷 태그가 필요합니다. eksctl로 클러스터를 만들었다면 이미 이 태그가 있습니다. Tag subnets for EKS Auto Mode 방법을 배워 보세요.

그런 다음 Ingress 리소스를 만듭니다. 05-ingress.yaml 파일을 만듭니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-2048
                port:
                  number: 80

핵심 구성 요소:

  • internet-facing ALB를 만듭니다.
  • 직접 Pod 라우팅용 IP target type을 사용합니다.
  • 모든 트래픽(/)을 게임 서비스로 라우팅합니다.

ingress 구성을 적용합니다.

kubectl apply -f 04-ingressclass.yaml
kubectl apply -f 05-ingress.yaml

5단계: 배포 검증

모든 Pod가 실행 중인지 확인합니다.

kubectl get pods -n game-2048

Service가 생성되었는지 확인합니다.

kubectl get svc -n game-2048

ALB 엔드포인트를 가져옵니다.

kubectl get ingress -n game-2048

ingress 출력의 ADDRESS 필드에 ALB 엔드포인트가 표시됩니다. ALB가 프로비저닝되고 모든 대상을 등록할 때까지 2~3분 기다리세요.

6단계: 게임 접근

웹 브라우저를 열고 이전 단계의 ALB 엔드포인트 URL로 이동합니다. 2048 게임 인터페이스가 보일 거예요.

7단계: 정리

이 튜토리얼에서 만든 모든 리소스를 제거하려면:

kubectl delete namespace game-2048

이렇게 하면 배포, 서비스, ingress 리소스를 포함한 네임스페이스의 모든 리소스가 삭제됩니다.

내부에서 일어나는 일(What's Happening Behind the Scenes)

  • 배포가 2048 게임을 실행하는 Pod 5개를 만듭니다.
  • Service가 이 Pod들에 안정적인 네트워크 접근을 제공합니다.
  • EKS Auto Mode가:
    • AWS에 Application Load Balancer를 만듭니다.
    • Pod용 대상 그룹을 구성합니다.
    • 트래픽을 서비스로 보내는 라우팅 규칙을 설정합니다.

트러블슈팅

게임이 로드되지 않으면:

  • 모든 Pod가 실행 중인지 확인: kubectl get pods -n game-2048
  • ingress 상태 확인: kubectl describe ingress -n game-2048
  • ALB 상태 검사 확인: AWS 콘솔에서 대상 그룹 상태를 확인하세요.

더 알아보기 (Learn more)