86. GitOps (깃옵스) - 선언적 인프라 통제와 지속적 동기화 아키텍처
⚠️ 이 문서는 개발자가 터미널 창에 뻘건 명령어(
kubectl apply,terraform apply)를 수동으로 타이핑하며 인프라를 지었다 부쉈다 하다가 휴먼 에러로 회사 서버 1만 대를 통째로 날려 먹는 원시적인 막노동을 완전히 박멸하기 위해, **회사 서버의 '완벽한 이상적 목표 상태(Desired State)'를 텍스트 문서(YAML)로 적어서 오직 깃허브(Git) 저장소에만 보관하고, 쿠버네티스 뱃속에 숨겨둔 맹견(Agent 봇)이 24시간 Git을 노려보다가 글자가 바뀌는 그 즉시 1초 만에 서버의 실제 상태(Actual State)를 Git의 텍스트와 100% 똑같이 멱살 잡고 뜯어고쳐(Sync) 버리는 '궁극의 Pull 기반 무인 배포 체계인 GitOps'**를 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: "Git이 곧 법이요, 우주의 진리다." 인프라 엔지니어가 권력을 버리고 터미널 밖으로 쫓겨났다. 사람이 마우스나 키보드로 서버를 직접 만지는 행위를 엄격히 금지하고, 오직 깃허브에 올라간 텍스트 파일(Git Commit)만이 서버의 모양을 바꿀 수 있는 유일한 권력(SSOT)이 된다.
- 가치: 보안과 불변성(Immutability)이 폭발한다. 누군가 서버에 몰래 접속해 백도어(파드 1개)를 띄워도, 로봇이 1초 만에 "어? Git 문서엔 이 파드 띄우라는 말이 없는데?"라며 해커의 파드를 냅다 찢어 죽여버리고 원상복구(Auto-Healing) 시켜버리는 극강의 튼튼함을 자랑한다.
- 기술 체계: **단일 진실 공급원(SSOT)**인 Git Repository, K8s 클러스터 안에서 문서를 읽어오는 Pull 기반 에이전트(ArgoCD, Flux 등), 그리고 Git의 글자(Desired)와 현재 클러스터 꼴(Actual)의 차이를 수학적으로 맞추는 조정 루프(Reconciliation Loop) 로 구동된다.
Ⅰ. 푸시(Push) 방식의 오만과 터미널의 공포
비밀번호를 들고 남의 집에 쳐들어가는 택배 기사는 언제든 집을 부술 수 있다.
- 기존 CI/CD (Push 방식)의 치명적 결함:
- 옛날 젠킨스(Jenkins)는 힘이 너무 셌다. 자기가 도커 이미지를 굽고 나면, K8s 클러스터의 마스터 비밀번호(Kubeconfig)를 손에 꽉 쥐고
kubectl apply를 냅다 갈겨서 서버에 파드를 억지로 밀어 넣었다(Push). - 문제 1 (보안 구멍): 만약 해커가 젠킨스 서버 1대를 털면? 젠킨스 손에 들린 비밀번호로 회사의 모든 운영 서버 클러스터 수백 대가 1초 만에 쑥대밭이 되는 광역 파괴가 일어난다.
- 문제 2 (상태 불일치, Configuration Drift): 젠킨스가 배포를 끝내고 자러 갔다. 새벽에 주니어 개발자가 장애 났다고 운영 서버 터미널에 몰래 접속해
kubectl edit으로 숫자를 5로 싹 고치고 퇴근했다. 다음 날 아침, 깃허브 코드에는 '3'이라 적혀있는데 실제 서버는 '5'로 돌아가고 있는 끔찍한 거짓말(Drift) 현상이 터져 회사가 혼란에 빠진다.
- 옛날 젠킨스(Jenkins)는 힘이 너무 셌다. 자기가 도커 이미지를 굽고 나면, K8s 클러스터의 마스터 비밀번호(Kubeconfig)를 손에 꽉 쥐고
- GitOps의 역발상 (Pull 방식의 선언적 통제):
- 위워크(Weaveworks)가 선언했다. "야 젠킨스! 너한테서 K8s 비밀번호 압수! 넌 그냥 이미지 굽고 깃허브(Git) 텍스트 파일 글씨나 고쳐놔!"
- 대신 K8s 클러스터 내부 가장 깊숙하고 안전한 곳에 'ArgoCD'라는 감시견(Agent)을 한 마리 박아둔다.
- 이 감시견은 밖으로 짖지 않고(외부 노출 없음), 조용히 인터넷을 통해 바깥에 있는 깃허브(Git) 저장소만 3분에 한 번씩 스윽 쳐다본다(Pull). "어? 주인이 깃허브 텍스트 파일의 숫자를 3에서 5로 바꿨네?" 감시견이 스스로 클러스터 내부의 파드 개수를 5개로 늘려버린다.
📢 섹션 요약 비유: 푸시(Push) 방식은 셰프(젠킨스)가 오토바이를 몰고 손님 집(운영 서버) 비밀번호를 직접 누르고 들어가 거실 탁자에 피자를 쾅 던지고(강제 배포) 나가는 무단침입 배송입니다. 도둑이 셰프를 털면 온 동네 집이 다 털리죠. GitOps(Pull) 방식은 손님 집 거실 안쪽에 충성스러운 리트리버(ArgoCD) 한 마리를 키우는 겁니다. 셰프는 바깥 우체통(Git)에 '오늘 메뉴는 피자'라고 쪽지만 적고 집에 갑니다. 셰프는 비밀번호를 모릅니다. 집 안의 리트리버가 창문 밖 우체통 쪽지를 보고, 아하! 피자! 라며 자기가 직접 피자를 창문 틈으로 주워 와서 거실에 예쁘게 세팅(Sync) 해놓는 완벽하게 닫혀있는 초안전 벙커 배달망입니다.
Ⅱ. 단일 진실 공급원 (SSOT)과 무한 부활의 마법 (Reconciliation)
Git이 거짓말을 하지 않는 한, 세상의 모든 장애는 1초 만에 치유된다.
- Single Source of Truth (Git = SSOT):
- GitOps의 가장 무서운 규칙이다. "지금 우리 회사 서버 10만 대가 어떻게 생겨 먹었지?"가 궁금하면 터미널을 열고 서버를 찔러볼 필요가 없다.
- 그냥 깃허브(Git) 레포지토리의 YAML 파일 글자를 읽으면 된다. Git에 적힌 글자가 곧 현장 서버의 100% 물리적 현실이기 때문이다. Git 자체가 전사 인프라의 마스터 도면(SSOT)으로 신분 상승했다.
- 재조정 루프 (Reconciliation Loop)의 철퇴:
- 새벽에 악성 해커(또는 멍청한 직원)가 어떻게든 K8s 클러스터에 뚫고 들어와서
kubectl delete pod를 날려버렸다. 서버가 터졌다. - ArgoCD(감시견)의 심장인 재조정 루프가 즉각 1초 만에 발동한다.
- 감시견의 뇌구조: "지금 눈앞의 현실(Actual)은 파드 0개인데, 내가 손에 쥔 깃허브 법전(Desired)에는 무조건 파드 3개가 떠 있어야 한다고 적혀있네? 이 불경한 현실을 당장 처단해라!"
- 감시견이 해커를 비웃으며 0.1초 만에 파드 3개를 제자리로 부활시켜 버린다 (Auto-Healing). 인간이 조작한 어떠한 꼼수도 감시견의 1초 컷 원상복구를 뚫을 수 없다.
- 새벽에 악성 해커(또는 멍청한 직원)가 어떻게든 K8s 클러스터에 뚫고 들어와서
- 타임머신 롤백 (Git Revert):
- 어제 2.0 버전을 배포했는데 치명적 결제 버그가 났다.
- 데브옵스 엔지니어는 서버를 끄고 내리고 땀 뺄 필요가 1도 없다. 그냥 깃허브 웹사이트에 들어가 어제 커밋으로
git revert(되돌리기)버튼 하나 딸깍 누른다. - 1초 뒤 감시견이 "어? Git 글자가 1.0으로 다시 돌아갔네?" 하고 스스로 클러스터 전체를 어제 상태로 완벽하게 뜯어고쳐 광속 롤백을 완성한다.
📢 섹션 요약 비유: Git은 '완벽한 호텔 방 인테리어 사진첩(SSOT)'이고, ArgoCD는 눈이 돌아간 결벽증 호텔 청소부입니다. 청소부는 3분에 한 번씩 방에 들어와서 사진첩과 똑같은지 방을 검사합니다. 손님(해커)이 침대 위치를 10cm 비틀어놓거나 수건을 한 장 훔쳐 가도, 청소부가 즉시 나타나 "사진첩(Git)이랑 다르잖아!"라고 소리치며 1초 만에 침대와 수건을 사진첩과 100% 똑같은 위치로 원상복구 시켜버립니다. 호텔 방은 영원히 사진첩과 1픽셀도 다르지 않은 멸균 상태(Immutability)를 무한 유지하게 됩니다.
Ⅲ. CI와 CD의 완벽한 분단 (분리주의 철학)
개발자 저장소와 인프라 저장소는 건널 수 없는 강이어야 한다.
- 2개의 Git 저장소 파기 (Code Repo vs Config Repo):
- GitOps를 하는 회사는 무조건 깃허브 저장소(Repo)를 2개로 찢는다.
- App Repo (앱 개발자용): 자바(
Java)나 파이썬 소스코드가 들어있다. 개발자가 코드를 푸시하면 젠킨스(CI)가 코드를 컴파일하고 도커 이미지(v2.0)를 구워서 창고(ECR)에 던지는 역할까지만 하고 죽는다. 배포는 절대 안 한다. - Config Repo (인프라/매니페스트용): 순수한 YAML 텍스트 뼈대 파일만 수만 장 얌전하게 모여있는 인프라 성역이다. 젠킨스가 이미지(
v2.0)를 굽고 나면, 마지막 유언으로 이 Config Repo의 YAML 파일 한 줄(image: v1.0 -> v2.0)만 스윽 고쳐주고 눈을 감는다.
- 분단의 이유 (권한 폭발 방지):
- 왜 찢을까? 개발자가 실수로 앱 코드를 잘못 짰을 땐 서버 전체가 망가지진 않는다.
- 하지만 Config Repo에 적힌 YAML 글자 하나 잘못 고치면 클러스터 노드 100대가 한 번에 날아가는 대재앙이 터진다.
- 2개로 찢어놓으면, 무서운 Config Repo에는 '수석 인프라 아키텍트' 1명만
Approve(승인)버튼을 누를 수 있도록 접근 통제(RBAC)를 극한으로 조여 매어 보안 사고를 99% 억제할 수 있다.
📢 섹션 요약 비유: App Repo는 빵(코드)을 반죽하는 '주방'이고, Config Repo는 그 빵을 매대 어디에 전시할지 적어둔 '매장 인테리어 규정집'입니다. 요리사(개발자/CI)는 주방에서 빵을 다 구웠으면, 자기 맘대로 매장에 나가서 빵을 진열하면 안 됩니다(분리주의). 요리사는 매니저에게 "2.0 크루아상 다 구웠습니다"라고 카톡(Git Commit 수정)만 남기고 사라집니다. 그러면 매장 전담 청소부(ArgoCD)가 규정집을 읽고 나와서 빵을 진열장(운영 서버)에 아름답고 안전하게 꽂아 넣는 철저한 역할 분담과 보안 통제의 결정체입니다.