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 콘솔에서 대상 그룹 상태를 확인하세요.