Day 5 - EKS 배포 · E2E
Terraform → Spring → GitHub → Argo CD → EKS 전체 흐름 검증
목차
학습 목표
- 전체 파이프라인을 한 번 끝까지 수행한다
- 배포 실패 시 어느 구간인지 좁힌다
- 실습 리소스를 안전하게 정리한다
E2E 시나리오
수행 순서
- Infra (Day 1):
terraform apply·kubectl get nodes - App (Day 2): 코드·Dockerfile 준비
- CI (Day 3): Secrets/Variables 설정 후 main push
- CD (Day 4): Argo CD Application Synced
- Verify: Pod Ready · HTTP 200 · 이전 버전 롤백 1회
# 배포 상태
kubectl -n spring-demo get pods -o wide
kubectl -n spring-demo describe deploy spring-demo
kubectl -n spring-demo logs -l app=spring-demo --tail=100
# 임시 포트포워드 검증
kubectl -n spring-demo port-forward svc/spring-demo 8080:80
curl -s http://localhost:8080/
curl -s http://localhost:8080/actuator/health
접속 · 노출
| 방식 | 용도 |
|---|---|
port-forward | 실습·디버그 |
Service type LoadBalancer | 빠른 외부 노출 (비용 주의) |
| ALB Ingress Controller | 실무형 HTTP 라우팅 |
Ingress 스케치:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: spring-demo
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: spring-demo
port:
number: 80
ALB Controller · IRSA는 Terraform으로 함께 관리하는 것이 이상적입니다.
관측 · 로그
| 영역 | 도구 예 |
|---|---|
| 메트릭 | CloudWatch Container Insights, Prometheus |
| 로그 | CloudWatch Logs, Fluent Bit |
| 트레이스 | (선택) OpenTelemetry |
| CD 상태 | Argo CD UI · argocd app get |
최소 실습: kubectl logs + Actions 로그 + Argo 이벤트.
kubectl -n argocd get events --sort-by='.lastTimestamp' | tail
argocd app get spring-demo
장애 대응 플레이북
| 증상 | 의심 구간 | 확인 |
|---|---|---|
| PR 테스트 실패 | App / CI | Actions log, 로컬 ./gradlew test |
| ECR push 거부 | IAM OIDC / 정책 | Role trust, ECR policy |
| ImagePullBackOff | ECR / 태그 / 노드 권한 | 이미지 존재, node IAM |
| CrashLoopBackOff | 앱 설정 | logs, probe path, env |
| Argo OutOfSync | GitOps 경로 | path, branch, credentials |
| Synced but Unhealthy | K8s 리소스 | describe, events |
롤백:
# GitOps에서 이전 태그로 revert 후 push
# 또는
argocd app rollback spring-demo <history-id>
비용 정리
실습 종료 시 순서 예:
- Argo Application 삭제 (또는 prune)
- LoadBalancer / Ingress 잔여 확인
terraform destroy(EKS · 노드 · VPC · ECR 정책에 따라 ECR 이미지 별도 삭제)
# 남은 LB 확인
kubectl get svc -A | grep LoadBalancer
aws elbv2 describe-load-balancers --query 'LoadBalancers[].LoadBalancerName'
terraform destroy
최종 체크리스트
파이프라인
- Terraform으로 EKS · ECR · OIDC 생성
- Spring 이미지 CI 빌드·푸시
- GitOps 태그 자동 커밋
- Argo CD Synced + Healthy
- HTTP 헬스 체크 성공
- 롤백 1회 성공
이해도 (설명 가능해야 함)
- 왜 CI가 클러스터에 직접 apply하지 않는가
- 이미지 태그와 Git 커밋의 관계
- EKS 노드가 ECR pull 하는 권한 경로
- selfHeal / prune 의미