Go로 하이브리드 Docker 오케스트레이터 구축하기: 단일 VM에서 멀티 노드 클러스터로의 여정
요약
Go 언어를 사용하여 Docker Compose의 단순함과 Nomad의 분산형 신뢰성을 결합한 하이브리드 오케스트레이터를 구축하는 과정을 다룹니다. Google DeepMind의 AI 에이전트인 Antigravity와 협업하여 인프라 구축부터 Flutter 대시보드 생성까지 전 과정을 진행한 사례를 소개합니다.
핵심 포인트
- CoreDNS와 Caddy를 활용한 분산형 DNS 및 로컬 인그레스 구조 설계
- Manager VM을 거치지 않는 효율적인 트래픽 라우팅 구현
- Antigravity AI 에이전트를 활용한 복잡한 네트워크 디버깅 및 인프라 자동화
- cAdvisor와 Prometheus를 통한 클러스터 관측성(Observability) 확보
Docker Compose의 고유한 단순함과 HashiCorp Nomad의 분산형 타겟팅 및 신뢰성을 결합할 수 있다면 어떨까요?
Go 언어로 작성된
- 분산형 DNS (Decentralized DNS, CoreDNS): 스택이 배포될 때, Gubernator는 컨테이너를 호스팅하는 Worker VM의 IP를 직접 가리키는 도메인(예:
hello-app.gbnt)을 등록합니다. - 로컬 인그레스 (Localized Ingress, Caddy): 각 VM은 자체적으로 독립적인 Caddy Ingress 컨테이너를 실행합니다.
- 분산형 Caddyfile (Decentralized Caddyfiles): Manager의 Caddy는 Manager에서 로컬로 실행 중인 컨테이너에 대한 리버스 프록시 (Reverse-proxy) 규칙만 관리합니다. Worker 에이전트는 주기적으로 Manager에 자신에게 할당된 태스크를 확인(Poll)하고, 오직 자신의 로컬 컨테이너만을 대상으로 하는 로컬 Caddyfile을 생성합니다.
이는 만약 hello-app.gbnt가 gbnt-worker2 (192.168.252.10)에 배포된다면 다음과 같은 과정을 의미합니다:
- 클라이언트의 브라우저가 DNS를 질의하면,
192.168.252.10으로 해석(Resolve)됩니다. - 브라우저는
gbnt-worker2의 80번 포트에서 실행 중인 Caddy에 직접 연결합니다. - Caddy는 해당 요청을 로컬 컨테이너 IP(예:
172.17.0.2:80)로 프록시합니다. - Manager VM을 거치는 트래픽(Transit traffic)이 전혀 발생하지 않습니다.
Antigravity (Google DeepMind)와의 공동 저작
이 프로젝트를 특별하게 만드는 점은 Go 코드, GORM 통합, Flutter 대시보드 위젯, 그리고 클러스터 설정의 100%가 Google DeepMind의 에이전트형 AI 코딩 어시스턴트인 Antigravity와 공동 저작되었다는 점입니다.
단순한 자동 완성이나 채팅창과는 달리, Antigravity는 에이전트 역량(Agentic capabilities)을 갖춘 페어 프로그래머(Pair programmer)로서 동작합니다:
- 복잡한 네트워크 동작 디버깅 (Debugging Complex Network Behaviors): 여러 Docker 네트워크(
bridge및gbnt-monitor-net등)에 연결된 컨테이너의 IP가 결합되는(예:172.17.0.2172.19.0.7) 문제를 발견했습니다. Antigravity는 컨테이너 IP 추출 로직을 추적하여 수정안을 제안하고 파서(Parser)를 검증했습니다. - 인프라 부트스트래핑 (Infrastructure Bootstrapping): Antigravity는 Multipass 명령을 실행하여 VM을 생성하고, Go 바이너리를 전송하며, 인증 키를 구성하고, JWT 토큰을 통해 워커(Worker)들을 클러스터에 참여시켰습니다.
- Flutter 대시보드 자동 생성 (Auto-Generating the Flutter Dashboard): Antigravity는 Flutter Web UI를 설계하고 반복 개선하며, 실시간 클러스터 토폴로지 맵(Topology map), 라이브 작업 상태, 시스템 메타데이터 및 버전 태그를 포함하는 설정 대화 상자와 같은 기능들을 구현했습니다.
클러스터 관측성 (Cluster Observability)
관측성(Observability)은 내장되어 있습니다. gbnt monitor init을 실행하면, 매니저(Manager)는 전용 네트워크인 gbnt-monitor-net을 통해 연결된 완전한 텔레메트리 스택(Telemetry stack)을 실행합니다:
- cAdvisor: 하드웨어 및 컨테이너 메트릭(Metrics)을 노출합니다.
- Prometheus: 모든 노드로부터 메트릭을 스크랩(Scrape)합니다.
- Grafana: 메트릭을 시각화합니다.
- Loki & Promtail: 모든 노드에 걸쳐 로그를 집계(Aggregate)합니다.
결론 (Conclusion)
Gubernator는 멀티 호스트 Docker 배포를 관리하기 위해 Kubernetes와 같은 무거운 오케스트레이터가 필요하지 않다는 것을 증명합니다. Go, SQLite, CoreDNS, 그리고 Caddy를 결합하여 매우 빠른 분산형 오케스트레이터를 구축했습니다.
Antigravity와 같은 에이전트형 코더(Agentic coder)와 페어 프로그래밍을 함으로써, AI가 리팩터링(Refactoring), 교차 컴파일(Cross-compilation), VM 배포 및 프론트엔드 업데이트를 처리하는 동안 저는 고수준 아키텍처에 집중할 수 있었습니다.
경량 오케스트레이션 시스템 구축에 관심이 있다면, Gubernator 리포지토리를 확인하고 구축을 시작해 보세요!
경량 오케스트레이터를 구축하거나 사용해 본 적이 있나요? 아래 댓글로 알려주세요!
#devops #docker #golang #ai #pairprogramming #antigravity
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기