#DevOps

[인프라를 소프트웨어처럼 4/5] plan은 동작을 모른다: 인프라를 테스트·재현한다는 것

[인프라를 소프트웨어처럼 4/5] plan은 동작을 모른다: 인프라를 테스트·재현한다는 것
01

Summary

IaC의 아킬레스건 'plan 성공, apply 실패'의 악순환을 깨부수는 헥사고날 인프라 설계 전략

Pulumi와 로컬 쿠버네티스로 배포 전 진짜 인프라 동작을 검증하고 완벽히 재현 가능한 인프라를 확보하는 방법

본 아티클은 Terraform과 같은 기존 IaC의 plan 단계가 지닌 구조적 한계를 극복하기 위해 소프트웨어 공학의 헥사고날 패턴을 인프라 설계에 이식한 실제 엔지니어링 여정을 소개합니다. Kotlin 인터페이스 기반의 Port 설계를 통해 실제 클라우드 인프라와 로컬 테스트용 검증 어댑터(kind, vcluster)를 분리 교체할 수 있도록 아키텍처를 설계했습니다. 이에 더해 인프라 배포 이후 ArgoCD가 모든 애플리케이션의 헬스 상태를 최종적으로 수렴하는 과정까지 통합 스크립트로 확인해 견고하고 안전한 플랫폼 생태계를 일구는 과정을 다룹니다.

  • 01plan 단계는 설정 형식의 변화를 확인할 뿐 배포 이후의 온전한 비즈니스 구동 여부까지 검증하지는 못한다는 한계 극복
  • 02인프라의 명세(Port)와 세부 구현(Adapter)을 구분하여 환경 구성을 손쉽게 교체할 수 있도록 헥사고날 설계 차용
  • 03Pulumi와 Kotlin 도입을 통해 컴파일 레이어의 타입 안전성을 인프라 정의 영역으로 가져오고 기존의 풍부한 테스트 생태계 결합
  • 04로컬 클러스터 도구(kind, vcluster)를 어댑터로 장착하여 로컬 노트북 환경에서 먼저 구동 결과를 즉각 모니터링하는 검증 체계 구현
  • 05pulumi up 배포 명령의 완료에 그치지 않고 ArgoCD의 Synced 및 Healthy 메트릭을 추적해 완전한 서비스 기동 시점 보장

RECOMMENDATION

안정적인 클라우드 프로비저닝을 추구하는 DevOps 엔지니어와 다수의 격리된 개발 환경을 빠르게 구성하고 안전하게 해체하길 원하는 플랫폼 설계자에게 모범적인 아키텍처 가이드로 강력하게 추천합니다.

The Problem

IaC의 plan 단계는 리소스 명세의 변경 유무만을 비교하기 때문에 실제 인프라와 앱이 정상 구동되는지 검증하지 못하고, 배포(apply) 시점에서야 오류를 감지하게 되는 구조적 공백이 발생합니다.

The Solution

헥사고날 아키텍처를 IaC에 대입하여 인프라 규격을 Port로 추상화하고, 로컬 환경(kind, vcluster)을 Adapter로 구축하여 로컬에서 먼저 배포해 본 후, pulumi up 및 ArgoCD가 모든 앱을 Synced 및 Healthy로 수렴시킬 때까지 폴링하여 유효성을 검증합니다.

The Result

인프라 변경 전 로컬 사전 검증으로 배포 실패율을 극적으로 최소화했으며, 5대 스택 구조의 설계를 기반으로 멀티 클라우드 환경에서도 두려움 없이 동일 인프라를 반복 재현 및 생성해낼 수 있는 기반을 구축했습니다.

Trade-off

클라우드 서비스 고유의 기능이나 세밀한 권한 및 물리 환경을 로컬의 kind/vcluster 상에 완벽하게 일관되게 동기화해 관리하기 위한 부가적 엔지니어링 리소스가 발생할 수 있습니다.

03

Key Concepts

Concept · 01

헥사고날 IaC (Hexagonal IaC)

소프트웨어 아키텍처의 포트 앤 어댑터 패턴 개념을 인프라 제어 코드로 가져와, 특정 클라우드 환경 명세와 구체적인 프로비저닝 구현체를 엄격하게 격리하고 선택적으로 결합해내는 설계 방식입니다.

  • Kotlin의 VirtualNetwork 인터페이스 등을 인프라 명세(Port)로 확립
  • AWS, NCP, 로컬 가상 환경 등을 각각 구체적 구현체(Adapter)로 설계하여 동적으로 변경할 수 있게 지원
Concept · 02

kind 및 vcluster

로컬 물리적 장비 내부에서 도커 또는 가상화 컨테이너 기반으로 경량화된 독립적 쿠버네티스 클러스터를 손쉽고 자유롭게 기동해 주는 개발 친화적 오케스트레이션 제어 도구입니다.

  • 실제 퍼블릭 클라우드에 연결하여 과금을 초래하지 않고 노트북 등 로컬 환경에서 테스트 어댑터 역할을 직접 수행
  • 인프라 명세가 선언된 상태로 로컬에서 실제 리소스로 환원되어 의존성이 무결하게 해결되는지 눈으로 사전 확인하는 창구 제공
Concept · 03

ArgoCD Health Check

선언적인 GitOps 저장소 상태를 모니터링하여 대상 쿠버네티스 클러스터 안의 전반적인 배포 리소스가 명세대로 일치하도록 강제하고 모든 세부 서비스들의 구동 건강도 상태를 측정하는 도구 기능입니다.

  • 인프라 자체를 만드는 Pulumi의 실행 단계 이후, 상위 애플리케이션이 실질적으로 다 떴는지 확인하기 위해 파이프라인상에 폴링 스크립트를 적용해 최종 확인
  • 인프라의 완성도를 단순 하드웨어 Provisioning 성공을 넘어 비즈니스 애플리케이션의 안정 구동 수준으로 끌어올려 상태의 일관성을 강화