목차 열기
GitOps 구성 개요
역할: 3-레포 분리 구조와 클러스터 내부 App-of-Apps 패턴을 한눈에 보여주는 개요
301 Terraform → 302 Bootstrap → 303 Helm/Values GitOps 의 3-레포 분리 + ArgoCD Root App → Infra Apps / Application Apps 의 App-of-Apps 패턴으로 클러스터 내부 리소스를 관리합니다.
내부 구성
문서 이미지를 큰 화면으로 확인합니다.
레포 역할 분리
301 Terraform
AWS 인프라 리소스를 코드로 관리합니다. EKS 클러스터, VPC, RDS, ElastiCache, IAM 역할, IRSA, Karpenter SQS 등 클러스터 외부 리소스를 담당합니다.
301-terraform/
├── environments/
│ ├── dev/ # On-Prem Dev (변수만)
│ ├── staging/ # AWS EKS Staging
│ └── prod/ # AWS EKS Prod
├── modules/ # 재사용 모듈
│ ├── eks/
│ ├── vpc/
│ ├── rds/
│ ├── elasticache/
│ ├── karpenter/
│ ├── dns/
│ ├── cdn/
│ ├── waf/
│ ├── bastion/
│ ├── audit-events/
│ ├── security-events/
│ └── ...
├── stacks/
│ ├── root/ # 공통 리소스 (ECR, IAM Bots, SSO)
│ │ ├── ecr/
│ │ ├── iam-bots/
│ │ └── sso/
│ ├── staging/
│ │ └── cdn-set/
│ └── prod/
│ └── cdn-set/
└── tf-backend/ # S3 + DynamoDB 백엔드 초기화
302 Bootstrap
클러스터 초기 상태(ArgoCD 없음)에서 최초 1회 실행합니다. Dev(On-Prem)와 EKS는 인프라 구조가 달라 부트스트랩 내용이 다릅니다.
302-bootstrap/
└── environments/
├── ca-staging/ # EKS Staging
│ ├── scripts/
│ │ └── install-all.sh
│ └── argo-init/
│ ├── root-application.yaml
│ ├── external-secret-github.yaml
│ └── external-secret-rbac.yaml
├── dev/ # On-Prem kubeadm
│ └── scripts/
│ ├── cert-manager/ # Let's Encrypt TLS
│ ├── ddns/ # DuckDNS 갱신
│ ├── eso/ # ESO (IAM User 기반)
│ ├── sealed-secrets/ # Sealed Secrets
│ ├── argocd/
│ └── ...
├── ca-prod/
└── prod/
EKS 부트스트랩 순서 (install-all.sh)
| 단계 | 작업 | 비고 |
|---|---|---|
| 1 | External Secrets Operator (ESO) 설치 | Helm, IRSA 설정 포함 |
| 2 | ClusterSecretStore 생성 | AWS Secrets Manager 연결 |
| 3 | Karpenter 설치 | Public ECR OCI 차트 |
| 4 | ArgoCD 설치 | Helm, values-argocd-install.yaml 적용 |
| 5 | GitHub SSH Key ExternalSecret 적용 | 303 레포 접근용 |
| 6 | ArgoCD RBAC ConfigMap 설정 | Google OAuth 권한 매핑 |
| 7 | Root Application 등록 | ArgoCD가 303 레포 동기화 시작 |
Dev(On-Prem) 부트스트랩 순서
On-Prem은 AWS IRSA를 쓸 수 없고 공인 IP도 고정이 아니라 별도 처리가 필요합니다. 컴포넌트별 스크립트를 순서대로 실행합니다.
| 단계 | 작업 | 비고 |
|---|---|---|
| 1 | cert-manager 설치 | Let's Encrypt ClusterIssuer — ACM 대신 |
| 2 | DDNS 설정 | DuckDNS CronJob — 공유기 공인 IP 변경 대응 |
| 3 | ESO 설치 + ClusterSecretStore 생성 | IAM User(bot-kubeadm) 자격증명 기반 (IRSA 불가) |
| 4 | ArgoCD 설치 | Helm |
| 5 | Root Application 등록 | ArgoCD가 303 dev/ 경로 동기화 시작 |
이후부터는 303 레포의 변경이 ArgoCD를 통해 자동 배포됩니다.
303 Helm/Values GitOps
ArgoCD가 지속적으로 동기화하는 레포입니다. 환경별 values와 공통 차트 템플릿을 분리하여 관리합니다.
303-helm/
├── common-charts/ # 환경 공통 차트 템플릿
│ ├── apps/
│ │ ├── java-service/ # Java 백엔드 공통 차트
│ │ └── ai-service/ # AI 서비스 공통 차트
│ └── infra/
│ ├── namespaces/
│ ├── rbac/
│ ├── network-policies/
│ ├── istio/
│ ├── istio-security/
│ ├── kafka/
│ ├── kyverno-policies/
│ ├── monitoring/
│ └── ...
├── ca-staging/ # Staging 환경별 리소스 (AWS EKS)
│ ├── root/
│ │ ├── Chart.yaml
│ │ ├── templates/ # App-of-Apps 템플릿
│ │ └── values.yaml # 전체 앱 목록 + Sync Wave 정의
│ ├── charts/ # Staging 전용 차트
│ │ ├── alb-ingress/
│ │ ├── karpenter/
│ │ ├── istio/
│ │ └── ...
│ └── values/ # 환경별 values 파일
│ ├── core/
│ ├── apps/
│ ├── infra/
│ ├── istio/
│ ├── monitoring/
│ ├── security/
│ └── messaging/
└── dev/ # Dev 환경별 리소스 (On-Prem kubeadm)
├── root/ # App-of-Apps 진입점
├── charts/ # Dev 전용 차트
│ ├── core/
│ │ ├── ddns/ # DuckDNS 갱신 CronJob
│ │ └── ecr-creds/ # ECR imagePullSecret 갱신
│ ├── data/
│ │ ├── postgresql/
│ │ ├── redis/
│ │ ├── redis-ai/
│ │ ├── kafka-ui/
│ │ └── cloudbeaver/
│ ├── istio/
│ │ └── swagger-oauth/
│ └── security/
│ ├── cert-manager/
│ ├── oauth2-proxy/
│ ├── service-secrets/
│ └── ai-service-secrets/
└── values/ # 환경별 values 파일
흐름 요약
301 Terraform→ AWS 리소스(VPC/EKS/RDS 등) 프로비저닝302 Bootstrap→ 클러스터 최초 설치 (ArgoCD + Root App 등록, 1회성)303 Helm/Values Git 레포→ ArgoCD가 지속 동기화- Root App → Infra Apps · Application Apps로 App-of-Apps 확산
- Infra Apps: Istio, ESO, Karpenter, Kyverno, 관측성 스택
- Application Apps: 백엔드 / AI 서비스 (ApplicationSet으로 배포)
App-of-Apps 구조 및 Sync Wave 상세 → ArgoCD App-of-Apps