농업 데이터 기반 BNPL 플랫폼 '콩콩팥팥'의 쿠버네티스 매니페스트를 관리하는 GitOps 레포지토리입니다. ArgoCD가 이 레포를 단일 소스(Single Source of Truth)로 삼아 클러스터 상태를 동기화합니다.
Note: 실제 운영은 온프레미스 내부의 GitLab에서 이루어졌으며, 본 GitHub 저장소는 공개용 미러링 레포지토리입니다. 아래 CI/CD 흐름의 소스 및 GitOps 저장소는 모두 GitLab을 기준으로 동작합니다.
git-ops/
├── on-prem/ # 온프레미스 쿠버네티스 클러스터 매니페스트
│ ├── redis/ # Redis 7 (캐시 및 세션 관리)
│ ├── service-auth/ # 인증 서비스
│ ├── service-core/ # 코어 서비스
│ ├── service-payment/ # 결제 서비스
│ ├── service-admin/ # 관리자 서비스
│ └── service-batch/ # 정산 및 연체 관리 배치 (CronJob)
└── aws/ # AWS(EKS) 환경 매니페스트
└── service-catalog/ # 상품 카탈로그 서비스
온프레미스와 AWS 환경을 분리하여 매니페스트를 관리합니다. 각 서비스 디렉터리는 기본적으로 deployment.yaml, service.yaml, ingress.yaml로 구성됩니다.
GitLab(소스) → Jenkins(빌드) → Harbor(이미지) → 현재 레포(GitOps) → ArgoCD(배포)로 이어지는 Push 기반 CI + Pull 기반 CD 파이프라인을 구축했습니다. 애플리케이션 소스 저장소와 배포 매니페스트 저장소를 분리하여, 이미지 태그 업데이트 커밋만으로 배포가 트리거되도록 구성했습니다.
-
GitLab 소스 저장소에 코드가 Push 되면, Webhook을 통해 Jenkins 파이프라인 트리거
-
Jenkins에서 코드 빌드, 테스트 및 컨테이너 이미지 빌드를 수행한 후 Harbor에 이미지를 Push
-
Jenkins가 현재 GitOps 레포지토리의
deployment.yaml내 이미지 태그를 새로 빌드한 버전으로 자동 교체하고 Commit & Push (예:ci: update service-admin image tag to <sha>)
-
GitOps 저장소에 커밋이 발생하면 GitLab Webhook이 ArgoCD에 알림을 보내고, ArgoCD는 저장소를 Pull 하여 매니페스트 변경 사항(이미지 태그 등)을 감지
-
변경된 매니페스트를 기준으로 Harbor에서 새 이미지를 Pull 하고, 새로운 Pod를 띄워 무중단 롤아웃을 수행
- 온프레미스 이미지는 Harbor(
harbor.dev6.fisa)에서imagePullSecrets: harbor-secret을 통해 인증 후 가져오며, AWS 환경은 ECR 사용
- 온프레미스 이미지는 Harbor(
빌드 파이프라인 대시보드 > 프론트엔드 및 백엔드의 각 마이크로서비스(admin, auth, core, payment 등)에 대한 빌드 진행 상태, 최근 성공/실패 여부, 소요 시간을 한눈에 모니터링하고 관리합니다.
프라이빗 컨테이너 이미지 저장소 (On-Prem) > Jenkins에서 성공적으로 빌드된 서비스별 도커 이미지가 안전하게 보관되는 레지스트리입니다. 프로젝트별 접근 권한 제어 및 이미지 관리를 담당합니다.
Trivy 기반 취약점 스캔 결과 > Harbor는 저장된 컨테이너 이미지에 대해 Trivy 스캐너를 사용하여 보안 취약점을 자동으로 분석합니다. 위 이미지는 특정 서비스 이미지에 대한 스캔 결과이며, Critical(47개), High(58개) 등 취약점의 심각도와 수정 가능 여부를 한눈에 파악하여 배포 전 보안 결함을 최소화합니다.
서비스별 Application 동기화 상태 > Git 저장소의 매니페스트와 실제 쿠버네티스 클러스터의 상태가 일치하는지(Synced), 리소스가 정상적으로 구동 중인지(Healthy) 시각적으로 확인하고 관리할 수 있습니다.
Ingress는 nginx IngressClass를 사용합니다. 상시 실행 워크로드는 nodeSelector: workload=core 조건에 따라 스케줄링됩니다. (배치 CronJob은 노드 제약 없음)
| 서비스 | 포트 | 외부 호스트(Ingress) | 비고 |
|---|---|---|---|
| service-auth | 8091 | api-auth.dev6.fisa |
|
| service-core | 8090 | api-core.dev6.fisa |
HikariCP keepalive 튜닝 |
| service-payment | 8092 | api-payment.dev6.fisa |
HPA용 resources, readiness/liveness probe |
| service-admin | 8080 | api-admin.dev6.fisa |
|
| service-batch | - | - | CronJob |
| redis | 6379 | (클러스터 내부) | redis:7-alpine |
| 서비스 | 포트 | 비고 |
|---|---|---|
| service-catalog | 8081 | EKS 환경 배포 및 ECR 이미지 사용 |
민감 정보(DB 비밀번호, 토큰 등)는 GitOps 레포지토리에 직접 저장하지 않습니다.
각 애플리케이션은 쿠버네티스 클러스터 내부에 별도로 생성된 Secret 객체를 envFrom.secretRef방식으로 참조하여 구동됩니다.
전체 시스템을 구성하는 프로젝트 레포지토리 목록입니다.
| 레포 | 설명 |
|---|---|
back-end |
금융 핵심 도메인 백엔드 |
front-end |
사용자용 웹앱 프론트엔드 |
front-end-admin |
관리자용 웹 프론트엔드 |
ai-prediction-model |
시계열 예측 모델 · 오토스케일링 정책 |
mcp-aiops-backend |
FastMCP 기반 AIOps 백엔드 |
infra |
Terraform 기반 IaC · 운영 스크립트 |