프로젝트 개요
본 프로젝트는 Terraform을 사용하여 AWS 또는 GCP와 같은 클라우드 환경에 Kubernetes 클러스터를 프로비저닝하고, GitOps (ArgoCD) 및 CI/CD (GitHub Actions)를 결합하여 애플리케이션 배포를 자동화하는 시스템을 구축하는 것을 목표로 합니다. 또한, 모니터링 설정을 추가하여 운영 관점에서도 완성도를 높일 것입니다. Terraform의 모듈화, 동적 블록, 변수 관리 및 Best Practices를 모두 활용할 수 있는 실전형 프로젝트입니다.
기술 스택
분야 | 사용 기술 |
---|
클라우드 인프라 | AWS (EKS, S3, DynamoDB, IAM) |
인프라 관리 | Terraform, Helm |
컨테이너 및 Kubernetes | Kubernetes (EKS), Docker |
CI/CD 및 GitOps | GitHub Actions, ArgoCD |
모니터링 | Prometheus, Grafana |
보안 | IAM Roles (AWS), Kubernetes RBAC, Ingress (ALB/NGINX), Network Policies |
기타 | Git, Markdown/README |
프로젝트 목표
- Terraform을 통한 인프라 코드 관리 (IaC)
- Kubernetes 클러스터 및 애플리케이션 배포 자동화
- GitOps 워크플로우를 통한 배포 프로세스 최적화
- CI/CD 파이프라인을 통한 개발-배포 주기 단축
- 모니터링 및 보안 설정을 통한 운영 준비성 확보
프로젝트 구성
-
인프라 설계 (Terraform)
- 사용 도구: Terraform, AWS/GCP, Terraform Module, Remote State
- 구현 내용:
- AWS에서 EKS (Elastic Kubernetes Service) 클러스터 생성 또는 GCP에서 GKE (Google Kubernetes Engine) 프로비저닝.
- VPC, 서브넷, 보안 그룹 등 네트워크 리소스를 모듈화하여 관리.
- Terraform State를 S3 또는 GCS와 같은 원격 백엔드에 저장하고, DynamoDB로 상태 잠금 (Locking) 설정.
- terraform workspace를 사용하여 dev, staging, prod 환경 분리.
-
Kubernetes 리소스 관리 (Terraform + Helm)
- 사용 도구: Terraform Helm Provider, Kubernetes Provider
- 구현 내용:
- Terraform으로 Helm 차트를 통해 Prometheus와 Grafana와 같은 모니터링 도구 배포.
- 동적 블록 (Dynamic Block)을 사용하여 환경별로 다른 설정 (예: 리소스 크기)을 유연하게 적용.
- 조건문 (Conditionals)을 활용하여 dev 환경에서는 저비용 인스턴스를, prod에서는 고성능 인스턴스를 선택.
-
애플리케이션 배포 자동화 (GitOps + ArgoCD)
- 사용 도구: Terraform, ArgoCD, GitHub Actions
- 구현 내용:
- 샘플 애플리케이션 (예: NGINX 웹 서버 또는 간단한 Flask 앱)을 Kubernetes에 배포.
- Terraform으로 ArgoCD를 설치하고, Git 리포지토리와 연동하여 GitOps 워크플로우 구현.
- GitHub Actions로 CI/CD 파이프라인 설정: 코드 푸시 → 이미지 빌드 → ArgoCD 동기화.
-
변수와 출력값 활용
- 구현 내용:
- input 변수를 사용하여 클러스터 이름, 리전, 노드 수 등을 사용자 지정 가능하게 설정.
- output으로 클러스터 엔드포인트, ArgoCD 대시보드 URL 등을 출력하여 사용자 편의성 강화.
-
모니터링 및 보안 관리
- 구현 내용:
- Prometheus와 Grafana로 클러스터 모니터링 설정.
- Terraform으로 IAM 역할과 정책을 정의하여 최소 권한 원칙 (Least Privilege) 적용.
- Provisioners를 사용하여 클러스터 생성 후 초기 설정 스크립트 실행 (선택 사항).
-
Best Practices 적용
- 코드 구조를 모듈화하고, 변수 파일 (terraform.tfvars)로 환경별 설정 분리.
- Terraform 코드에 주석 추가 및 README 작성으로 문서화.
- .gitignore에 민감한 정보 (예: API 키) 제외.
프로젝트 워크플로우
- 인프라 프로비저닝:
terraform init
, terraform plan
, terraform apply
로 AWS/GCP에 Kubernetes 클러스터 생성.
- ArgoCD 설치: Terraform으로 ArgoCD를 클러스터에 배포하고 Git 리포지토리 연결.
- CI/CD 설정: GitHub Actions 워크플로우 파일 작성 (예:
.github/workflows/deploy.yml
).
- 애플리케이션 배포: 샘플 앱을 컨테이너화하고, ArgoCD로 배포.
- 모니터링 확인: Grafana 대시보드에서 클러스터 상태 확인.
포트폴리오에 담을 내용
- 프로젝트 개요: 프로젝트 목표와 사용 기술 스택.
- 구성도: Terraform으로 만든 인프라와 GitOps 워크플로우 다이어그램 (수작업 또는 draw.io로 작성).
- 코드 샘플:
main.tf
, variables.tf
, 모듈 예시 등.
- 스크린샷:
- Terraform apply 완료 후 출력값.
- ArgoCD 대시보드와 배포 상태.
- Grafana 모니터링 화면.
- 배운 점: Terraform 모듈화, GitOps 도입, CI/CD 통합 경험 정리.
추가 아이디어
- Terraform Cloud 연동: Terraform Cloud를 백엔드로 사용하고, 팀 협업 기능 활용.
- Ansible 통합: Provisioners 대신 Ansible을 연동하여 서버 초기화 작업 추가.
- 보안 강화: AWS Secrets Manager와 Terraform을 연동하여 민감한 데이터 관리.
예상 소요 시간
2025년 3월 - 4월 초 예상 (2-3주)
예상 비용 (AWS EKS, ArgoCD, Nginx)
AWS EKS를 하루 4시간, 7일 동안 사용하는 프로젝트의 예상 비용을 한화로 계산해 보겠습니다. 환율은 2024년 6월 24일 기준 1달러당 1,380원으로 가정.
- AWS EKS 클러스터 비용 (달러)
- EKS 컨트롤 플레인: 2.8달러
- EC2 워커 노드 (t3.medium 3개, 온디맨드): 3.36달러
- EBS 스토리지: 1달러 미만 (약 0.5달러로 가정)
- 네트워크 비용: 1달러 미만 (약 0.5달러로 가정)
- 총합: 약 7.16달러
- 한화로 환산
- 7.16달러 * 1,380원/달러 = 약 9,880원
- 스팟 인스턴스 사용 시
- EC2 워커 노드 비용을 50% 절감하면: 3.36달러 / 2 = 1.68달러
- 총합: 약 5.5달러
- 한화 환산: 5.5달러 * 1,380원/달러 = 약 7,590원
- 결론
- 온디맨드 인스턴스 사용 시: 약 9,880원
- 스팟 인스턴스 사용 시: 약 7,590원
따라서, 하루 4시간, 7일 동안 AWS EKS, ArgoCD, Nginx를 사용하는 프로젝트의 예상 비용은 한화로 약 7,590원에서 9,880원 사이가 될 것으로 예상.
2-3 주 기간 가정 시, 한화 30,000으로 예측.
프로젝트 진행 순서
1. 프로젝트 환경 준비
1.1. AWS/GCP 계정 생성 및 자격 증명 설정
- AWS 계정을 생성하고, IAM 역할 및 자격 증명을 설정합니다.
- API 키 및 액세스 권한을 설정하여 Terraform과 CLI 도구들이 클라우드 리소스에 접근할 수 있도록 합니다.
- Terraform, AWS CLI, kubectl, Helm을 설치하여 클라우드 환경을 관리하고 Kubernetes 클러스터와 상호작용합니다.
1.3. GitHub 레포지토리 생성 및 GitHub Actions 사용 설정
- GitHub 레포지토리를 생성하고, GitHub Actions를 사용하여 CI/CD 파이프라인을 설정합니다.
- Terraform을 설치하고,
terraform init
명령어로 초기화합니다.
2.2. AWS/GCP 설정
- AWS (EKS) 클러스터를 선택하고, 클라우드 제공자의 API 키와 권한을 설정합니다.
2.3. VPC, 서브넷 및 네트워크 리소스 설정
- Terraform으로 VPC, 서브넷, 라우팅 테이블, NAT 게이트웨이 등을 생성합니다.
- 보안 그룹 및 네트워크 ACL 설정을 통해 네트워크 보안을 강화합니다.
2.4. Kubernetes 클러스터 프로비저닝
- AWS EKS 클러스터를 Terraform을 이용해 설정합니다.
terraform apply
명령어로 클러스터를 생성합니다.
2.5. 원격 상태 관리
- AWS S3를 사용하여 Terraform 상태를 저장합니다.
- DynamoDB (AWS) Locking을 설정하여 상태 잠금을 관리합니다.
3. Kubernetes 리소스 및 모니터링 배포
3.1. Helm 설치
- Kubernetes 클러스터에 Helm을 설치하여 차트를 통해 애플리케이션을 관리합니다.
- Terraform을 사용하여 Helm 차트를 통해 Prometheus 및 Grafana를 배포합니다.
- 동적 블록을 사용해 환경에 맞는 리소스 크기와 설정을 최적화합니다.
4. GitOps 및 CI/CD 설정
4.1. ArgoCD 설치
- Kubernetes 클러스터에 ArgoCD를 설치하고, GitHub 리포지토리와 연동하여 GitOps 워크플로우를 설정합니다.
4.2. 애플리케이션 배포
- 간단한 애플리케이션 (예: NGINX 또는 Flask)을 컨테이너화하고 GitHub에 푸시합니다.
- GitHub Actions로 CI/CD 파이프라인을 설정하여 코드 푸시 → 이미지 빌드 → ArgoCD 동기화를 자동화합니다.
5. 애플리케이션 배포 자동화 (GitOps + ArgoCD)
5.1. ArgoCD와 GitHub 리포지토리 연동
- ArgoCD와 Git 리포지토리를 연결하여 GitOps 방식을 적용합니다.
5.2. 애플리케이션 자동 배포
- 코드 푸시 시 자동으로 Docker 이미지를 빌드하고 ArgoCD가 이를 Kubernetes에 배포합니다.
6. 모니터링 설정 (Prometheus + Grafana)
6.1. Prometheus 설치
- Terraform을 사용하여 Prometheus를 배포하고, 클러스터 메트릭을 수집합니다.
6.2. Grafana 대시보드 설정
- Prometheus와 Grafana를 연결하여 Kubernetes 클러스터 상태를 모니터링하는 대시보드를 작성합니다.
7. 보안 설정
7.1. IAM 역할 및 정책 설정
- 최소 권한 원칙을 적용하기 위해 IAM 역할을 정의합니다.
7.2. Kubernetes RBAC 설정
- Kubernetes에서 역할 기반 접근 제어(RBAC)를 설정하여 보안을 강화합니다.
7.3. Ingress 설정 (ALB/NGINX)
- AWS ALB 또는 NGINX Ingress Controller를 사용하여 트래픽을 관리하고 보안을 강화합니다.
7.4. Kubernetes Network Policy 설정
- 클러스터 내부의 안전한 통신을 위해 네트워크 보안 정책을 설정합니다.
8. 최적화 및 Best Practices 적용
- Terraform 코드를 모듈화하여 환경별로 재사용 가능하게 관리합니다.
terraform.tfvars
파일을 사용하여 환경별 변수 분리 관리합니다.
8.2. 문서화
- 코드에 주석을 추가하고, README.md를 작성하여 프로젝트의 개요와 실행 방법을 정리합니다.
- 아키텍처 다이어그램 및 구성도를 수작업 또는 draw.io로 작성합니다.
8.3. GitOps Best Practices
- Git 리포지토리에서 애플리케이션 설정 및 상태를 관리하여 GitOps 방식을 최적화합니다.
9. 최종 검토 및 테스트
terraform apply
후 리소스 생성 및 연결 상태를 확인합니다.
9.2. ArgoCD 배포 상태 확인
- ArgoCD UI에서 배포 상태 및 동기화를 확인합니다.
9.3. Grafana 대시보드 확인
- 클러스터 상태를 모니터링하고 알림을 설정하여 운영 상태를 점검합니다.
9.4. CI/CD 파이프라인 테스트
- 코드 푸시 후 자동 빌드, 배포, ArgoCD 동기화를 검증합니다.
10. 포트폴리오 및 문서화
10.1. 포트폴리오 작성
- 프로젝트 개요, 사용 기술, 구현 내용을 정리합니다.
- 코드 샘플 및 스크린샷을 첨부하여 프로젝트 결과물을 시각적으로 보여줍니다.
- 배운 점 및 경험을 공유하여 프로젝트에서 얻은 교훈을 정리합니다.
git hub - psj020528