Docker Hub 이미지를 기반으로:
- ECR로 이미지 업로드
- Kubernetes Deployment / Service / Ingress YAML 자동 생성
kubectl apply로 EKS에 배포- AWS Load Balancer Controller로 ALB + Path-based Routing(
/a,/b,/c) 구성
까지를 원클릭 스크립트로 자동화한 데모 프로젝트입니다.
“Docker pull → ECR push → Kubernetes manifest 자동 생성 → kubectl apply → ALB 라우팅”
E2E 워크플로우를 한 번에 재현할 수 있도록 구성했습니다.
Cloud / Network
- AWS EKS, ECR, IAM, ALB (Application Load Balancer)
- AWS Load Balancer Controller (Ingress ↔ ALB 연동)
Kubernetes
- Deployment, Service (ClusterIP), Ingress (path-based routing)
- Ingress Class:
alb, TargetType:ip
Tools & Automation
eksctl,kubectl,helm,aws-cli,docker- Bash Shell Script
eks-ecr-k8s-autodeploy-demo/
├── README.md
├── config/
│ └── env.sh # 공통 AWS/EKS 환경 변수
├── infra/
│ └── infra-create.sh # EKS 클러스터 + ALB Controller 자동 생성 스크립트
├── scripts/
│ ├── 00-common-env.sh # 공통 env + 서비스/ECR 설정
│ ├── 01-build-and-push.sh # Docker Hub → ECR 이미지 업로드 자동화
│ ├── 02-generate-manifests.sh # K8s Deployment/Service/Ingress YAML 자동 생성
│ ├── 03-deploy.sh # kubectl apply 전체 배포
│ └── deploy-all.sh # 위 3개 스크립트를 순차 실행하는 원클릭 스크립트
└── manifests/
├── README.md # 이 폴더 설명 (auto-generated 파일 안내)
└── .gitkeep # 실제 YAML은 스크립트 실행 시 생성실제 service-a.yaml, service-b.yaml, service-c.yaml, ingress.yaml은 02-generate-manifests.sh 실행 시 manifests/ 아래에 생성됩니다.
EKS + ECR + ALB Path-based Routing 구조를 단순화하면 다음과 같습니다.
- ECR: service-a, service-b, service-c용 프라이빗 이미지 저장소
- EKS: 3개의 Deployment(Pod) + 3개의 ClusterIP Service
- Ingress: /a, /b, /c 경로에 따라 각 Service로 라우팅
- AWS Load Balancer Controller: Ingress 리소스를 감지 → ALB 생성 및 설정 자동화
다음 도구들이 로컬 환경에 설치되어 있다고 가정합니다.
- aws-cli
- eksctl
- kubectl
- helm
- docker
- AWS 계정 및 IAM 권한
- EKS, ECR, IAM Policy, ALB 등을 생성할 수 있는 권한 필요
config/env.sh는 infra + app 배포에서 공통으로 사용하는 환경 파일입니다.
#!/bin/bash
#########################################
# 공통 AWS / EKS 환경 변수
#########################################
export AWS_REGION="ap-northeast-2"
export AWS_ACCOUNT_ID="<YOUR_AWS_ACCOUNT_ID>"
export EKS_CLUSTER_NAME="eks-demo"
export NODE_GROUP_NAME="demo-node-group"
export VPC_ID="<YOUR_VPC_ID>"
echo "[config/env.sh] 공통 환경 변수 로드 완료"AWS_ACCOUNT_ID와VPC_ID는 반드시 본인 계정에 맞게 수정해야 합니다.- 이 파일만 수정하면
infra-create.sh와00-common-env.sh모두에 반영됩니다.
cd infra
chmod +x infra-create.sh
./infra-create.sh이 스크립트는 다음을 수행합니다.
-
eksctl create cluster로 EKS 클러스터 생성- Managed Node Group, OIDC, Node 수, 타입 등 설정
-
AWS Load Balancer Controller용 IAM Policy 다운로드 & 생성
-
eksctl create iamserviceaccount로 IRSA(ServiceAccount + IAM Role) 생성 -
Helm 차트로 AWS Load Balancer Controller 설치
성공 시 다음 명령으로 상태를 확인할 수 있습니다.
kubectl get nodes
kubectl get deployment -n kube-system aws-load-balancer-controller#!/bin/bash
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_ENV="${SCRIPT_DIR}/../config/env.sh"
if [ -f "$CONFIG_ENV" ]; then
source "$CONFIG_ENV"
else
echo "ERROR: config/env.sh 를 찾을 수 없습니다: $CONFIG_ENV"
exit 1
fi
#########################################
# 서비스별 ECR Repo / Image 설정
#########################################
export SERVICE_A_REPO="service-a"
export SERVICE_B_REPO="service-b"
export SERVICE_C_REPO="service-c"
export SERVICE_A_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_A_REPO}"
export SERVICE_B_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_B_REPO}"
export SERVICE_C_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${SERVICE_C_REPO}"
export SRC_IMAGE_A="nginxdemos/hello:latest"
export SRC_IMAGE_B="hashicorp/http-echo:latest"
export SRC_IMAGE_C="hashicorp/http-echo:latest"
echo "=== 00-common-env.sh 설정 완료 ==="
echo "AWS_ACCOUNT_ID = $AWS_ACCOUNT_ID"
echo "EKS_CLUSTER_NAME = $EKS_CLUSTER_NAME"
echo "SERVICE_A_URI = $SERVICE_A_URI"
echo "SERVICE_B_URI = $SERVICE_B_URI"
echo "SERVICE_C_URI = $SERVICE_C_URI"여기서는 **서비스(ECR Repo 이름, Docker Hub Source 이미지)**를 정의합니다.
필요하면 service-d 등을 추가해 쉽게 확장할 수 있습니다.
cd scripts
chmod +x *.sh./deploy-all.shdeploy-all.sh는 내부적으로 다음 세 가지를 순서대로 실행합니다.
-
01-build-and-push.sh- Docker Hub에서 이미지 pull
- ECR URI로 tag
- ECR에 push
-
02-generate-manifests.shmanifests/service-a.yamlmanifests/service-b.yamlmanifests/service-c.yamlmanifests/ingress.yaml→ 위 파일들을 자동 생성
-
03-deploy.shkubectl apply -f로 위 YAML들을 클러스터에 배포kubectl get pods,kubectl get svc,kubectl get ingress로 상태 출력
| 파일명 | 위치 | 역할 |
|---|---|---|
config/env.sh |
config/ |
AWS 계정/리전, EKS 클러스터, VPC ID 등 공통 환경 변수 |
infra-create.sh |
infra/ |
EKS 클러스터 생성 + ALB Controller 설치 자동화 |
00-common-env.sh |
scripts/ |
config/env.sh를 읽고 서비스별 ECR Repo / Source 이미지 설정 |
01-build-and-push.sh |
scripts/ |
Docker Hub → ECR: pull/tag/push 전체 자동화 |
02-generate-manifests.sh |
scripts/ |
Deployment/Service/Ingress YAML 파일을 manifests/에 자동 생성 |
03-deploy.sh |
scripts/ |
kubectl apply로 K8s 리소스 전체 배포 + 상태 조회 |
deploy-all.sh |
scripts/ |
위 3개 스크립트를 순차 실행하는 원클릭 파이프라인 |
kubectl get ingress출력 예시:
NAME CLASS HOSTS ADDRESS PORTS AGE
test-path-routing alb * k8s-default-testpath-xxxx.ap-northeast-2.elb.amazonaws.com 80 1mhttp://<ALB-DNS>/a
http://<ALB-DNS>/b
http://<ALB-DNS>/c/a→service-a(nginxdemos/hello)/b→service-b(hashicorp/http-echowith"Hello from Service B")/c→service-c(hashicorp/http-echowith"Hello from Service C")
실습이 끝난 후 비용 절감을 위해 리소스를 정리해 주세요.
kubectl delete -f manifests/ingress.yaml
kubectl delete -f manifests/service-a.yaml
kubectl delete -f manifests/service-b.yaml
kubectl delete -f manifests/service-c.yamleksctl delete cluster --name <EKS_CLUSTER_NAME> --region <AWS_REGION>- 필요 시 ECR 리포지토리 및 IAM Policy/Role도 함께 삭제해 주세요.