질문의 역사
이 도전 과제는 2010년대 중반에 발생한 명령형 구성 관리의 운영 실패에서 유래되었습니다. 이 시기에 Puppet과 Chef는 동적 클라우드 환경에서 구성 드리프트 때문에 확장성 한계에 직면했습니다. Weaveworks에 의해 선진된 GitOps 패러다임은 Kubernetes를 통해 대중화되면서 불변의 아티팩트와 지속적인 조정 루프를 갖춘 선언형 인프라로 산업의 방향을 바꾼 것입니다. 현대의 기업은 이제 버전 관리된 의도와 런타임 현실 간의 편차를 1분 이하로 감지해야 하며, 이를 위해 인력 개입 없이 모든 것을 자율적으로 운영할 수 있는 정교한 제어 평면이 필요합니다.
문제
전통적인 가변 인프라는 수동 SSH 개입 및 핫 패치를 통해 눈송이 서버를 생성하여 예측할 수 없는 배포 실패 및 보안 취약점을 유발하고, 고속 릴리스 동안까지도 문제가 발생하게 됩니다. 명령형 자동화 도구는 지속적인 검증 없이 절차적 단계를 수행하여 구성 변경이 누적되도록 하여 치명적인 실패가 발생할 때까지는 이를 인식하지 못합니다. 기본적인 문제는 Git에 저장된 선언형 사양과 물리적-물리적 (bare-metal), VM, 컨테이너에서의 일시적인 런타임 상태 간의 엄격한 일관성을 유지함으로써 롤백 기능을 중앙 집중식 병목 없이 지원하는 것입니다.
해결책
이질적인 환경에서 불변의 인프라 생명 주기 관리를 위하여 Kubernetes를 보편적인 추상화 계층으로 활용하는 제어 평면 구조를 설계하고, Cluster API에 의해 조정되도록 합니다. ArgoCD 또는 Flux를 GitOps 엔진으로 배포하여 30초마다 Git 저장소를 폴링하여 서버 측 적용을 통한 드리프트 감지를 구현하고, 필드 소유권 추적과 함께 원하는 상태를 자동으로 강제 적용합니다. 점진적인 배포를 위해 Argo Rollouts를 구현하고, Prometheus 메트릭을 통합하여 오류 비율이 정의된 기준을 초과할 경우 자동으로 카나리아 분석 및 회로 차단기 롤백을 자동화합니다. 모든 kubectl 수정이 거부되도록 하는 OPA Gatekeeper 입장 제어기를 통과하여 불변성을 강화하고, Packer를 사용하여 금본위 머신 이미지를 생성하며, Ceph 또는 AWS EBS를 사용하여 지속적인 상태 외부화를 위한 불변 컨테이너 런타임을 갖춘 Containerd를 활용합니다.
다섯 개의 AWS 지역에서 운영되는 글로벌 핀테크 플랫폼은 구성 드리프트로 인해 40%의 운영 사고와 불합격 준수 감사로 어려움을 겪었습니다. 그들의 레거시 EC2 인프라는 수동 패키지 업데이트 및 SSH 문제 해결 허용으로 인해 커널 버전이 서로 다른 홍채 서버 및 문서화되지 않은 Nginx 구성 변경을 생성했습니다. 배포 프로세스는 운영 패치로 인해 축적된 불일치 상태로 인해 15%의 롤백 실패 비율로 4시간의 유지 보수 기간을 요구했습니다.
해결책 A: Ansible 기반의 명령형 패치
운영 팀은 초기에는 기존의 가변 인스턴스 간의 구성을 표준화하기 위해 Ansible 플레이북을 구현하는 것을 고려했습니다. 이 접근법은 인프라 교체 없이 중요한 CVE에 대한 즉각적인 해결책을 제공하여 기존 운영 전문 지식을 활용하고 현재 AWS 환경에 최소한의 아키텍처 변경이 필요했습니다. 그러나 이는 변동성의 기본적인 반 패턴을 지속시키고, 동시 플레이북 실행 중 경쟁 조건을 생성하며, 변경 사항에 대한 불변의 감사 추적이 없고, SSH 연결 타임아웃으로 인해 지역 간 확장성이 떨어지는 문제를 일으켰습니다. 팀은 이 해결책이 드리프트를 제거하지 못하고, 수동 수정 워크플로우를 통해 상당한 운영적인 과중을 발생시켰기 때문에 이 솔루션을 거부했습니다.
해결책 B: 주기적인 크론 드리프트 감지와 함께하는 Terraform
아키텍처 팀은 Lambda 함수가 매시간 terraform plan을 실행하여 자산 전반에서 구성 편차를 감지하는 주기적인 Terraform을 사용하는 방안을 제안했습니다. 이는 선언형 인프라 정의 및 상태 파일 추적을 S3 백엔드를 통해 제공했지만, 그 접근 방식은 기본적인 지연 한계로 고통 받았습니다. Terraform 플랜은 글로벌 범위에서 실행하는 데 8-12분이 소요되어 1분 이하 감지 요건을 위반하며, 해당 도구는 런타임 Kubernetes 리소스 변화에 대해 본질적으로 인식하지 못했습니다. 롤백 메커니즘은 수동 개입이나 복잡한 상태 파일 조작이 필요하였으며, 이는 사고 대응 중 인간 오류의 가능성을 초래했습니다. 팀은 감지 지연 제한 및 인간 승인 워크플로우 없이 드리프트를 자동으로 수정할 수 없는 불능으로 인해 이를 거부했습니다.
해결책 C: ArgoCD 및 Cluster API와 함께하는 GitOps
선택된 아키텍처는 지속적인 조정을 위해 ArgoCD, 불변 노드 제공을 위한 Cluster API 및 CIS 경직화 표준으로 최적화된 금본위 머신 이미지를 위한 Packer를 사용함으로써 GitOps 원칙을 구현했습니다. 이 해결책은 Kubernetes 컨트롤러 감시 및 etcd 이벤트 스트리밍을 통해 45초 이내에 구성 드리프트를 감지하는 제어 루프를 생성했습니다. Argo Rollouts는 자동 카나리아 배포를 가능하게 하고, 오류 비율이 1%를 초과하거나 대기 시간이 SLO 기준을 초과할 경우 자동 롤백을 유도했습니다. 모든 ConfigMap과 Deployment 변경이 Git 저장소에서 발생하도록 하는 OPA Gatekeeper 정책이 적용되어 수동 수정을 방지하고 불변의 감사 추적을 통해 준수를 보장했습니다.
결과
구성 드리프트 사건을 3개월 이내에 95% 감소시켰고, 눈송이 서버를 완전히 제거했습니다. 배포 빈도는 주간에서 시간 단위 릴리스로 증가했으며, 제로 다운타임 점진적 배포가 유지 보수 기간을 대체하고 진정한 지속적 배포를 가능하게 했습니다. 실패한 배포에 대한 평균 복구 시간(MTTR)은 45분에서 3분으로 단축되었으며, 자동화된 Git 기반 롤백을 통해 마지막으로 확인된 좋은 상태로 복귀하였습니다. 보안 태세는 SSH 접근을 제거하고 불변 인프라를 시행하며, 구성 관리 또는 무단 런타임 변경에 대한 제로 발견 사항과 함께 SOC 2 Type II 감사를 통과하면서 크게 향상되었습니다.