Skip to content

Bash-based automation tool that generates Kubernetes manifests, deploys services to AWS EKS, and configures ALB path-based routing.

Notifications You must be signed in to change notification settings

jiu-jung/bash-eks-autodeploy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 

Repository files navigation

🚀 AWS EKS Autodeploy

Docker Hub 이미지를 기반으로:

  1. ECR로 이미지 업로드
  2. Kubernetes Deployment / Service / Ingress YAML 자동 생성
  3. kubectl apply로 EKS에 배포
  4. AWS Load Balancer Controller로 ALB + Path-based Routing(/a, /b, /c) 구성

까지를 원클릭 스크립트로 자동화한 데모 프로젝트입니다.

Docker pull → ECR push → Kubernetes manifest 자동 생성 → kubectl apply → ALB 라우팅
E2E 워크플로우를 한 번에 재현할 수 있도록 구성했습니다.



🧱 Tech Stack

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


📁 Repository Structure

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/ 아래에 생성됩니다.



🧩 Architecture

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 생성 및 설정 자동화


⚙️ Prerequisites

다음 도구들이 로컬 환경에 설치되어 있다고 가정합니다.

  • aws-cli
  • eksctl
  • kubectl
  • helm
  • docker
  • AWS 계정 및 IAM 권한
    • EKS, ECR, IAM Policy, ALB 등을 생성할 수 있는 권한 필요


🔧 1. 공통 환경 변수 설정 (config/env.sh)

config/env.shinfra + 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_IDVPC_ID는 반드시 본인 계정에 맞게 수정해야 합니다.
  • 이 파일만 수정하면 infra-create.sh00-common-env.sh 모두에 반영됩니다.


🏗️ 2. EKS 클러스터 & ALB Controller 생성 (infra/infra-create.sh)

cd infra
chmod +x infra-create.sh
./infra-create.sh

이 스크립트는 다음을 수행합니다.

  1. eksctl create clusterEKS 클러스터 생성

    • Managed Node Group, OIDC, Node 수, 타입 등 설정
  2. AWS Load Balancer Controller용 IAM Policy 다운로드 & 생성

  3. eksctl create iamserviceaccountIRSA(ServiceAccount + IAM Role) 생성

  4. Helm 차트로 AWS Load Balancer Controller 설치

성공 시 다음 명령으로 상태를 확인할 수 있습니다.

kubectl get nodes
kubectl get deployment -n kube-system aws-load-balancer-controller


📦 3. 애플리케이션 환경 변수 설정 (scripts/00-common-env.sh)

#!/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 등을 추가해 쉽게 확장할 수 있습니다.



🚀 4. One-click Application Deploy (scripts/deploy-all.sh)

4-1. 권한 설정

cd scripts
chmod +x *.sh

4-2. 원클릭 배포

./deploy-all.sh

deploy-all.sh는 내부적으로 다음 세 가지를 순서대로 실행합니다.

  1. 01-build-and-push.sh

    • Docker Hub에서 이미지 pull
    • ECR URI로 tag
    • ECR에 push
  2. 02-generate-manifests.sh

    • manifests/service-a.yaml
    • manifests/service-b.yaml
    • manifests/service-c.yaml
    • manifests/ingress.yaml → 위 파일들을 자동 생성
  3. 03-deploy.sh

    • kubectl apply -f로 위 YAML들을 클러스터에 배포
    • kubectl get pods, kubectl get svc, kubectl get ingress로 상태 출력


📜 Scripts 설명

파일명 위치 역할
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개 스크립트를 순차 실행하는 원클릭 파이프라인


🌐 ALB & Path-based Routing 테스트

1) Ingress 확인

kubectl get ingress

출력 예시:

NAME               CLASS   HOSTS   ADDRESS                                            PORTS   AGE
test-path-routing  alb     *       k8s-default-testpath-xxxx.ap-northeast-2.elb.amazonaws.com   80      1m

2) 브라우저 또는 curl로 테스트

http://<ALB-DNS>/a
http://<ALB-DNS>/b
http://<ALB-DNS>/c
  • /aservice-a (nginxdemos/hello)
  • /bservice-b (hashicorp/http-echo with "Hello from Service B")
  • /cservice-c (hashicorp/http-echo with "Hello from Service C")


🧹 Cleanup (리소스 정리)

실습이 끝난 후 비용 절감을 위해 리소스를 정리해 주세요.

1) 애플리케이션 리소스 삭제

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.yaml

2) EKS 클러스터 삭제

eksctl delete cluster --name <EKS_CLUSTER_NAME> --region <AWS_REGION>

3) 추가 정리

  • 필요 시 ECR 리포지토리IAM Policy/Role도 함께 삭제해 주세요.

About

Bash-based automation tool that generates Kubernetes manifests, deploys services to AWS EKS, and configures ALB path-based routing.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages