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λ ν¨κ» μμ ν΄ μ£ΌμΈμ.