flex 팀이 Terraform plan의 근본적 한계(변경 여부는 보여주지만 동작은 보장하지 않는다)를 극복하기 위해 kind와 vcluster로 로컬 인프라 검증 환경을 구성하고, Pulumi + Kotlin 헥사고날 아키텍처로 재현 가능한 인프라 구조를 만든 사례를 다룬다. 인프라를 소프트웨어처럼 테스트하고 재현하는 방법론 시리즈의 4번째 글이다.
핵심 포인트- Terraform plan은 선언 변경 사항만 비교하며 실제 환경 동작 여부는 보장하지 않는다는 한계가 출발점이다.
- kind와 vcluster로 노트북에서 인프라를 먼저 테스트한 뒤 클라우드에 배포하는 로컬 검증 환경을 구축했다.
- Pulumi + Kotlin 헥사고날 아키텍처로 AWS/NCP/로컬 등 다양한 구현(Adapter)을 같은 명세(Port)에 끼워 넣을 수 있게 설계했다.
- network→cluster→identity→storage→bootstrap 동일 모듈 구조를 여러 클라우드에 적용해 재현 가능성을 확보했다.
- pulumi up 이후 ArgoCD가 모든 앱을 정상 상태로 조정할 때까지 폴링하는 추가 검증 단계를 도입했다.
상세 정리- plan 한계 정의: Terraform plan은 선언이 어떻게 바뀌는지만 보여준다. 실제 인프라가 그 상태에서 정상 동작하는지는 apply 전까지 알 수 없다.
- 두 가지 해결 방향: 테스트 가능성(로컬에서 먼저 검증)과 재현 가능성(어떤 클라우드·환경에서도 동일 구조 재현)을 목표로 잡았다.
- 로컬 검증 환경: kind(Kubernetes in Docker)와 vcluster(가상 클러스터)로 노트북에서 실제 인프라와 유사한 환경을 구성해 클라우드 배포 전 검증한다.
- 헥사고날 인프라 설계: Port(인터페이스)와 Adapter(구현) 분리. 동일 Port에 AWS/NCP/로컬 각각의 Adapter를 구현해 환경별 전환이 가능하다.
- Pulumi + Kotlin 채택 이유: 선언형 DSL이 아닌 일반 프로그래밍 언어로 인프라를 코드화해 조건문·반복·테스트 작성이 용이하다.
- 모듈 구조 통일: network→cluster→identity→storage→bootstrap 순서로 모든 환경에 동일 모듈 구조를 적용해 환경 간 일관성을 확보했다.
- ArgoCD 폴링: pulumi up 완료 후 ArgoCD가 모든 앱을 Synced/Healthy 상태로 만들 때까지 폴링 — 인프라 배포 완료가 아닌 애플리케이션 정상 동작까지 검증한다.
- 최종 효과: 환경 변경을 안전하고 빠르게 만들어 Environment Variant(환경별 변형) 구현이 가능해졌다.
왜 읽나IaC를 운영하며 plan→apply 사이 검증 불확실성에 고민 중인 인프라·DevOps 엔지니어, 특히 Pulumi + Kubernetes 로컬 검증 환경 구성에 관심 있는 팀에게 실용적이다.