Amazon EKS를 사용한 Kubernetes에 2048 게임 배포 — 엔드투엔드 DevOps 프로젝트
Source: Dev.to
프로젝트 목표
- 애플리케이션을 컨테이너화하기
- 쿠버네티스 클러스터에 배포하기
- 인터넷에 노출하기
- 실제 클라우드 환경에서 쿠버네티스 워크로드가 어떻게 실행되는지 이해하기
GitHub 저장소:
👉
프로젝트 아키텍처 개요
워크플로는 전형적인 Kubernetes 배포 수명 주기를 따릅니다:
- Containerize the application with Docker → Docker 로 애플리케이션을 컨테이너화
- Create an Amazon EKS cluster → Amazon EKS 클러스터 생성
- Configure IAM roles and worker nodes → IAM 역할 및 워커 노드 구성
- Deploy the application using Kubernetes manifests → Kubernetes 매니페스트를 사용해 애플리케이션 배포
- Expose the application with a
LoadBalancerservice →LoadBalancer서비스로 애플리케이션 노출 - Access the application from the Internet → 인터넷에서 애플리케이션 접근
전제 조건
다음 도구들을 설치하고 구성하십시오:
| Tool | Purpose |
|---|---|
| kubectl | Kubernetes 클러스터와 상호 작용하기 위한 CLI(앱 배포, 리소스 검사, 클러스터 관리). |
| eksctl | Amazon EKS 클러스터의 생성 및 관리를 간소화(많은 AWS 리소스를 자동화). |
| AWS CLI | AWS 서비스와 직접 상호 작용할 수 있게 해 주며, EKS 인증 및 kubeconfig 파일 업데이트에 사용됩니다. |
이 도구들을 준비하면 Kubernetes 환경을 구축할 수 있습니다.
단계 1 – Amazon EKS 클러스터 생성
EKS 클러스터는 두 가지 주요 구성 요소로 이루어져 있습니다:
- Control Plane – AWS에서 관리
- Worker Nodes – 파드가 실행되는 EC2 인스턴스
클러스터를 생성할 때 다음을 구성합니다:
- 기본 VPC
- 2–3개의 서브넷
- 보안 그룹
- 퍼블릭 클러스터 엔드포인트 액세스
클러스터 생성은 일반적으로 10–12 분 정도 소요됩니다. 상태가 Active가 되면 다음 단계로 진행하십시오.
단계 2 – IAM 역할 생성
AWS 서비스는 IAM 역할 및 권한에 크게 의존합니다. 두 가지 역할이 필요합니다:
1. EKS 클러스터 역할
Kubernetes 컨트롤 플레인이 다른 AWS 서비스와 상호 작용할 수 있도록 합니다.
연결된 정책: AmazonEKSClusterPolicy
2. 노드 그룹 역할
워커 노드가 AWS 서비스와 통신할 수 있는 권한을 제공합니다.
연결된 정책:
AmazonEKSWorkerNodePolicy
AmazonEC2ContainerRegistryReadOnly
AmazonEKS_CNI_Policy
이러한 권한을 통해 노드는 다음을 수행할 수 있습니다:
- ECR에서 컨테이너 이미지 가져오기
- 컨트롤 플레인과 통신
- CNI 플러그인을 통한 네트워킹 관리
단계 3 – 워커 노드 추가
포드를 호스팅하기 위해 Node Group을 생성합니다.
| Setting | Value |
|---|---|
| AMI | Amazon Linux 2 |
| Desired nodes | 1 (나중에 확장 가능) |
| Security group ports | 22, 80, 8080 |
| SSH access | 활성화됨 |
몇 분 후에 Node Group이 Active 상태가 되어 워크로드를 받을 준비가 됩니다.
단계 4 – 클러스터 인증
로컬 kubeconfig를 업데이트하여 kubectl이 클러스터와 통신할 수 있도록 합니다:
aws eks update-kubeconfig --region us-east-1 --name my-cluster
이 명령은 클러스터 자격 증명을 로컬에 저장합니다.
연결 확인
kubectl get nodes
노드가 나열되면 클러스터가 올바르게 구성된 것입니다.
Step 5 – 2048 게임 Pod 배포
2048 게임에 대한 pod 정의를 생성합니다:
apiVersion: v1
kind: Pod
metadata:
name: 2048-pod
labels:
app: 2048-ws
spec:
containers:
- name: 2048-container
image: blackicebird/2048
ports:
- containerPort: 80
매니페스트를 적용합니다:
kubectl apply -f 2048-pod.yaml
Pod 상태를 확인합니다:
kubectl get pods
Pod가 Running 상태를 표시하면, 애플리케이션이 클러스터 내에 성공적으로 배포된 것입니다.
Step 6 – 애플리케이션 노출하기
Internet에서 게임에 접근할 수 있도록 LoadBalancer 서비스를 생성합니다:
apiVersion: v1
kind: Service
metadata:
name: 2048-service
spec:
type: LoadBalancer
selector:
app: 2048-ws
ports:
- protocol: TCP
port: 80
targetPort: 80
서비스를 적용합니다:
kubectl apply -f 2048-service.yaml
잠시 후 AWS가 ELB를 프로비저닝합니다. DNS 이름을 가져옵니다:
kubectl get svc 2048-service
브라우저에서 해당 DNS 이름을 열면 2048 게임이 정상적으로 동작합니다.
애플리케이션 노출을 위한 추가 세부 사항

파드가 실행 중이지만 아직 클러스터 외부에서 접근할 수 없습니다. 이를 해결하기 위해 Kubernetes Service를 생성합니다:
apiVersion: v1
kind: Service
metadata:
name: mygame-svc
spec:
selector:
app: 2048-ws
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
서비스를 배포합니다:
kubectl apply -f mygame-svc.yaml
서비스 상세 정보를 확인합니다:
kubectl describe svc mygame-svc
Kubernetes가 자동으로 공용 LoadBalancer를 프로비저닝합니다.
7단계 — 애플리케이션에 접근하기
로드밸런서가 생성되면 AWS가 퍼블릭 DNS 엔드포인트를 생성합니다. 해당 DNS 이름을 브라우저에서 열면 2048 게임 인터페이스가 표시되고 애플리케이션에 공개적으로 접근할 수 있게 됩니다.

애플리케이션 스케일링
Kubernetes의 가장 큰 장점 중 하나는 수평 스케일링입니다. 트래픽이 증가하면 추가 복제본을 생성할 수 있습니다:
kubectl scale deployment my-app --replicas=3
Kubernetes는 자동으로 트래픽을 파드에 분산시켜 고가용성과 향상된 성능을 보장합니다.
이 프로젝트에서 배운 점
- Kubernetes 워크로드 – 파드가 클러스터 내에서 컨테이너화된 애플리케이션을 실행하는 방식.
- 관리형 Kubernetes – Amazon EKS가 제어 플레인을 관리하여 클러스터 관리를 단순화하는 방법.
- Kubernetes 네트워킹 – 서비스와 로드밸런서가 애플리케이션을 외부에 노출하는 방식.
- 클라우드 인프라스트럭처 – AWS가 네트워킹, 컴퓨팅, 컨테이너 오케스트레이션을 함께 통합하는 방법.
가능한 개선 사항
- Deployments 대신 독립형 파드 사용.
- Ingress controllers 구현.
- CI/CD pipelines 추가.
- Prometheus와 Grafana를 사용한 모니터링.
- Terraform을 사용한 인프라 자동화.
이러한 추가 사항은 프로젝트를 production‑grade Kubernetes deployment에 더 가깝게 만들 것입니다.
최종 생각
Kubernetes는 처음에 압도적으로 느껴질 수 있지만, 이와 같은 프로젝트를 통해 모든 것이 어떻게 맞물리는지 훨씬 쉽게 이해할 수 있습니다. 2048 게임과 같은 간단한 애플리케이션을 배포함으로써 다음과 같은 점을 명확히 확인할 수 있습니다:
- 컨테이너는 파드(pod) 내부에서 실행됩니다.
- 파드는 워커 노드(worker node)에서 실행됩니다.
- 서비스는 애플리케이션을 외부에 노출합니다.
- 로드 밸런서는 외부 접근을 제공합니다.
DevOps, Kubernetes, 혹은 Cloud Engineering을 배우고 있다면, 이러한 프로젝트를 구축하는 것이 실무 경험을 쌓는 가장 좋은 방법 중 하나입니다.
프로젝트 저장소
전체 프로젝트 저장소에서 코드, YAML 매니페스트 및 설정 단계를 탐색하세요:
