PinHouse 서비스의 클라우드 인프라와 Kubernetes 플랫폼 운영 기준을 코드로 관리하는 레포지토리입니다.
이 레포지토리는 단순히 리소스를 생성하는 Terraform 저장소가 아니라, 인프라 계층, 플랫폼 계층, 배포 계층의 책임을 분리해 운영 가능한 구조로 정리한 것이 핵심입니다.
.
├── terraform/
│ ├── modules/ # 재사용 가능한 인프라 모듈
│ └── environments/ # dev, staging, prod 환경별 루트 구성
├── k8s-helm/
│ ├── platform-chart/ # Gateway, Certificate, ExternalSecret 등 플랫폼 공통 리소스
│ └── releases/ # NGINX Gateway Fabric, External Secrets Operator 등 컨트롤러 release 값
├── k8s-argocd/ # Argo CD Application 선언
├── k8s-kustomize/ # 애플리케이션 기본 매니페스트
└── .github/workflows/ # Terraform plan/apply 자동화
- GCP 기반 네트워크, 컴퓨트, 로드밸런서, 스토리지, Artifact Registry 같은 인프라 리소스
- Kubernetes 클러스터에서 공통으로 필요한 Gateway, Certificate, NetworkPolicy, ExternalSecret 같은 플랫폼 리소스
- Argo CD와 GitHub Actions를 이용한 선언형 배포 흐름
- 환경별 설정 분리와 보안 기준
이 저장소는 세 개의 계층으로 나뉩니다.
Terraform이 담당합니다.
- VPC, 서브넷, 컴퓨트, 로드밸런서, 스토리지 같은 기반 인프라를 선언적으로 관리합니다.
- 환경은
dev,staging,prod로 분리하고, 공통 모듈은terraform/modules에 둡니다. - Artifact Registry, Private Google Access 같은 운영에 필요한 기반 리소스도 이 계층에서 관리합니다.
Helm이 담당합니다.
- 컨트롤러 설치와 플랫폼 리소스 생성을 분리합니다.
- 예를 들어 NGINX Gateway Fabric release는 컨트롤러와
GatewayClass를 소유하고,platform-chart는 실제Gateway,Certificate,ExternalSecret,NetworkPolicy를 생성합니다. - 이 구조를 통해 “컨트롤러 운영”과 “플랫폼 정책/구성”의 변경 단위를 분리합니다.
Argo CD와 GitHub Actions가 담당합니다.
- GitHub Actions는 인프라 변경에 대해 plan/apply 흐름을 제공합니다.
- Argo CD는 클러스터 내부 애플리케이션 선언을 지속적으로 동기화합니다.
- 결과적으로 인프라는 Terraform, 클러스터 플랫폼은 Helm, 애플리케이션 배포는 Argo CD가 맡는 구조입니다.
이 저장소의 핵심 설계 원칙은 책임 분리입니다.
- Terraform은 “클라우드 자원”을 관리합니다.
- Helm release는 “컨트롤러 설치”를 관리합니다.
platform-chart는 “클러스터 공통 정책과 플랫폼 리소스”를 관리합니다.- Argo CD는 “애플리케이션 선언과 배포 상태”를 관리합니다.
이렇게 나누면 다음 이점이 있습니다.
- 어떤 변경이 인프라 변경인지, 플랫폼 정책 변경인지, 앱 배포 변경인지 구분이 명확합니다.
- 환경별 차이를 values/variables 수준에서 통제할 수 있습니다.
- 운영 중 장애나 변경 이슈가 생겼을 때 책임 범위를 빠르게 좁힐 수 있습니다.
환경은 dev, staging, prod 기준으로 나뉘며, 각 환경은 서로 다른 운영 목적을 가집니다.
dev: 기능 검증과 빠른 반복staging: 운영 전 검증과 통합 테스트prod: 실제 서비스 운영
같은 구조를 유지하되, 환경별 값만 다르게 가져가는 방식을 기본 원칙으로 삼았습니다. 즉, 구조는 공통화하고 값은 분리하는 방식입니다.
시크릿은 GCP Secret Manager를 기준으로 운영합니다.
중요한 점은 GCP Secret Manager가 /Prod/BE/DB_URL 같은 계층형 path를 지원하지 않는다는 것입니다.
그래서 이 저장소에서는 다음과 같은 flat prefix 규칙을 사용합니다.
Prod_BE_DB_URLProd_BE_DB_PASSWORDStg_BE_REDIS_HOST
External Secrets Operator는 이 prefix 규칙을 기반으로 secret들을 한 번에 찾고,
rewrite를 통해 prefix를 제거한 뒤 Kubernetes Secret으로 변환합니다.
예를 들어 Prod_BE_*를 가져오면 Kubernetes 내부에서는 DB_URL, DB_PASSWORD 같은 key로 사용됩니다.
이 방식의 장점은 다음과 같습니다.
- GCP Secret Manager 제약을 우회하지 않고, 서비스/환경 구분을 유지할 수 있습니다.
- 서비스별로 시크릿 집합을 일관된 규칙으로 확장하기 쉽습니다.
- Terraform state는 GCS remote backend로 분리 관리합니다.
- 실제
terraform.tfvars같은 민감 파일은 커밋하지 않습니다. - GitHub Actions와 클러스터 워크로드는 Workload Identity 기반 인증을 우선합니다.
- External Secrets Operator는 GCP Secret Manager 권한을 통해 런타임에 시크릿을 동기화합니다.
즉, 정적 비밀을 레포지토리에 넣지 않고, 실행 시점에 필요한 권한만 부여하는 방식으로 운영합니다.
이 저장소는 다음 역량을 보여주기 위한 결과물입니다.
- 클라우드 인프라를 코드로 설계하고 운영 구조로 정리하는 능력
- Kubernetes 플랫폼 리소스와 컨트롤러 책임을 분리하는 설계 능력
- 환경별 운영 기준과 배포 구조를 일관되게 유지하는 능력
- Secret, Gateway, Certificate, NetworkPolicy 같은 운영 핵심 요소를 통합적으로 다루는 능력
- “리소스를 만든다” 수준이 아니라 “운영 가능한 구조를 만든다”는 관점