[0] TRACK/[c] EKS

AWS-EKS-3TIER

페페 더 엔지니어 2026. 9. 26. 20:08

[0] 아키텍쳐 설계

 

ㄴ ANSIBLE 셋업 부

지금 EC2 방식 EKS 방식
Ansible로 Nginx 설치·화면 복사 Web 이미지에 Nginx·HTML·JS·설정 포함
Java 설치·JAR 복사·systemd 등록 App 이미지에 Java 실행 환경·JAR 포함
app.env 파일 배포 실행 시 환경변수·Secret으로 주입
서버별 설치·재시작 Deployment로 Pod 생성·업데이트

 

ㄴ 배포 흐름

로컬 또는 GitHub Actions
  │
  ├─ Web 이미지 빌드
  └─ App 이미지 빌드
          ↓
     ECR에 이미지 Push
          ↓
 Kubernetes Deployment에 이미지 지정
          ↓
 EKS에서 이미지를 받아 Pod 실행

Nginx의 프록시 대상도 App의 사설 IP 목록 대신 app-service:8080 같은 Kubernetes Service 이름으로 변경하는 거야.

Bastion은 필수는 아니야. EKS API에 접근할 네트워크 경로와 권한이 있는 로컬 PC나 배포 Runner에서 kubectl·Helm으로 배포하면 돼. DB 비밀번호는 이미지에 넣지 않고 실행 시 전달하고.

 

ㄴ 접속, 관리

② Pod는 보통 SSH 대신 kubectl exec

EKS 접속 설정과 권한이 있는 PC에서 실행하면 돼. 먼저 노드에 SSH로 들어갈 필요는 없어.

# Pod 목록
kubectl get pods -n todo

# 지정한 Pod의 컨테이너 셸 열기
kubectl exec -it -n todo POD이름 -- /bin/sh

# 접속하지 않고 로그 확인
kubectl logs -n todo POD이름

todo는 예시 네임스페이스야. 컨테이너가 여러 개라면 -c 컨테이너이름을 추가해. 셸이 없는 이미지에서는 /bin/sh 접속이 안 되므로 별도 디버깅 컨테이너를 사용해. Kubernetes 문서

Pod 내부 접속은 진단용으로 쓰고, 실제 변경은 이미지나 배포 설정에 반영하는 게 좋아. 내부에서 직접 수정한 파일은 컨테이너가 재생성되면 사라질 수 있어.

 


1. 준비

ㄴ 디렉토리 설계

aws-eks-project/
├─ terraform/       # AWS 인프라
├─ modules/         # 재사용 모듈 + EKS·ECR 모듈
├─ services/
│  ├─ web/          # 기존 화면 + Dockerfile
│  └─ app/          # 기존 Spring Boot + Dockerfile
├─ kubernetes/      # Deployment·Service·Ingress 등
└─ HANDOFF.md       # 기존 구성·검증 결과·EKS 전환 계획

ㄴ GITHUB 연동

ㄴ 기존 모듈 재사용

 


2. 디렉토리

ㄴ module

ㄴ DB

ㄴ ECR

ㄴ EKS

ㄴ Network

ㄴ Security

 

ㄴ Services

ㄴ Kubernetes

 

 


 

3. 실행

ㄴ 인프라 프로비저닝

ㄴ k8s 접속 내 로컬 IP

ㄴ k8s 접근 권한 arn role

IAM 정책의 eks:* EKS 클러스터 생성·조회·삭제, 접근 권한 설정
EKS Access Policy 또는 Kubernetes RBAC 클러스터 안의 Pod·Deployment·Service 조회·생성·삭제
네 IAM 사용자 또는 Role
    ↓ EKS Access Entry로 등록
AmazonEKSClusterAdminPolicy 연결
    ↓
kubectl로 클러스터 전체 관리

ㄴ DB PW

ㄴ 배포

ㄴ 도구 설치

도구 용도
Docker Desktop Web/App 이미지 빌드 → ECR push
kubectl EKS에 Deployment·Service·Ingress 적용
Helm AWS Load Balancer Controller 설치
eksctl 작성한 가이드에서 Controller용 IAM 권한 연결

 

ㄴ 이미지 빌드

cd C:\terraform\aws-eks-3tier

docker build --platform linux/amd64 -t todo-web:v1 ./services/web
docker build --platform linux/amd64 -t todo-app:v1 ./services/app

docker image ls

 

ㄴ EKS 노드 연결

aws eks update-kubeconfig --region ap-northeast-2 --name eks-3tier-dev

kubectl get nodes

 

ㄴ ECR 푸쉬

# ECR 주소 가져오기
cd /drives/c/terraform/aws-eks-3tier

APP_REPO=$(terraform -chdir=terraform output -raw app_repository_url)
WEB_REPO=$(terraform -chdir=terraform output -raw web_repository_url)
REGISTRY="${APP_REPO%%/*}"

echo "$APP_REPO"
echo "$WEB_REPO"

# ECR 로그인
aws ecr get-login-password --region ap-northeast-2 \
  | docker login --username AWS --password-stdin "$REGISTRY"
  
# 이미지 태그 지정 후 업로드
docker tag todo-app:v1 "${APP_REPO}:v1"
docker tag todo-web:v1 "${WEB_REPO}:v1"

docker push "${APP_REPO}:v1"
docker push "${WEB_REPO}:v1"

 

 


ㄴ 로드밸런서 컨트롤러

ㄴ 디렉토리

modules/
└─ alb_controller/
   ├─ main.tf       # IAM Role·정책, ServiceAccount, Helm 설치
   ├─ variables.tf
   ├─ outputs.tf
   └─ locals.tf

addons/
├─ main.tf          # alb_controller 모듈 호출
├─ variables.tf
├─ outputs.tf
├─ locals.tf
└─ versions.tf      # AWS·Helm 등 Provider 설정

 

ㄴ 실행

terraform -chdir=addons init
terraform -chdir=addons plan
terraform -chdir=addons apply

 

ㄴ 체크

# 컨트롤러 정상실행 확인
kubectl rollout status deployment/aws-load-balancer-controller -n kube-system --timeout=180s

 

ㄴ DB연결 / 배포 / Ingress 적용시 자동 생성됨

kubectl apply -f kubernetes/ingress/ingress.yml
kubectl get ingress -n todo -w

 


 

ㄴ DB연결

ㄴ env파일 준비

# 복사
Copy-Item kubernetes/app/app.env.example kubernetes/app/app.env
terraform -chdir=terraform output -raw db_address

# app.env
DB_URL <- endpoint 넣어준다
DB_USERNAME
DB_PASSWORD <- PW 넣어준다

 

ㄴ Kubernetes Secret 등록

kubectl apply -f kubernetes/namespace.yml
kubectl create secret generic app-db -n todo 
   \ --from-env-file=kubernetes/app/app.env 
   \ --dry-run=client -o yaml | kubectl apply -f -