88. 풀 기반(Pull-based) 배포 (GitOps 방식)
⚠️ 이 문서는 바깥에 있는 젠킨스(Jenkins) 서버가 운영망 쿠버네티스 마스터 비밀번호를 탈취당해 회사가 통째로 털리는 끔찍한 푸시(Push) 방식의 보안 취약점을 완전히 멸망시키고, **오직 쿠버네티스 클러스터 '내부' 깊숙한 곳에 숨겨진 똑똑한 에이전트 봇(ArgoCD)만이 바깥쪽 인터넷(Git)을 살짝 쳐다보고 바뀐 설정 파일을 스스로 낚아채어 자기 뱃속(K8s)에 적용(Sync)해 버리는 궁극의 방어형/스텔스 무중단 배포 체계인 '풀(Pull) 기반 배포와 GitOps 패러다임'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 배포의 권력을 클러스터 바깥(젠킨스)에서 클러스터 안쪽(ArgoCD 봇)으로 완벽하게 이동(Inversion of Control)시킨 쿠데타다. 외부에서 안으로 들어오는 문(Inbound)은 시멘트로 다 발라버린다.
- 가치: 젠킨스가 K8s 비밀번호를 알 필요가 아예 사라지므로(Credential-less) 보안이 100% 미친 듯이 떡상한다. 게다가 내부 봇이 3분마다 Git 문서(정답지)와 현재 파드 상태를 감시하여, 해커가 파드를 몰래 지워도 1초 만에 좀비처럼 원상 복구(Auto-healing) 시키는 불멸의 인프라를 달성한다.
- 기술 체계: 설정 코드가 적힌 Git Repository(단일 진실 공급원), 클러스터 내부의 Pull 에이전트(ArgoCD, FluxCD), 그리고 불일치(Drift)를 감지하고 강제로 동기화하는 **Reconciliation Loop(재조정 루프)**의 삼위일체로 굴러간다.
Ⅰ. 젠킨스(Push)의 붕괴: 인바운드 방화벽의 공포
비밀번호를 들고 찾아오는 방문 판매원은 강도로 돌변할 수 있다.
- 기존 푸시(Push) 배포의 끔찍한 보안 멍에:
- 어제 복습한 내용이다. 젠킨스가 K8s에
kubectl apply를 쏘려면, 회사의 엄격한 인프라 보안팀을 찾아가 사정해야 한다. "제발 젠킨스 IP 하나만 내부 운영망으로 들어오게 방화벽(Inbound) 좀 뚫어주쇼!" - 보안팀은 뒷목을 잡는다. "외부망 젠킨스 털리면 우리 은행 운영망 전체가 1초 만에 쑥대밭이 되는 건데 미쳤냐?" 결국 VPN을 깔고 억지로 터널을 뚫는 등 네트워크가 걸레짝이 된다.
- 어제 복습한 내용이다. 젠킨스가 K8s에
- 풀(Pull) 방식의 역발상: 아웃바운드의 마법:
- 발상을 180도 뒤집었다. "밖에서 안으로 들어오는 문(Inbound 방화벽)을 모조리 용접해서 막아버려라!"
- 그 대신 클러스터 안쪽에 얌전한 로봇(ArgoCD)을 한 마리 심어둔다.
- 로봇은 안에서 밖으로 인터넷을 살짝 열고 나가는 아웃바운드(Outbound) 통신만 쓴다. (기업 방화벽은 보통 나가는 통신은 널널하게 열어준다.)
- 밖으로 나간 로봇은 깃허브(Git) 저장소만 스윽 쳐다보고 "어? YAML 파일 글씨 바뀌었네?" 하고 그 파일을 입에 물고 다시 자기 집(클러스터 내부)으로 쏙 돌아온다.
📢 섹션 요약 비유: 푸시(Push)는 중국집 배달원(젠킨스)이 우리 집(운영 서버) 도어락 비밀번호를 누르고 거실까지 들어와서 짜장면을 식탁에 쾅 세팅하고 나가는 무단 침입 배송입니다. 배달원 주머니 털리면 온 동네 빈집털이가 터집니다. 풀(Pull) 방식은 배달원에게 비밀번호를 주지 않습니다. 집 안에서 키우는 영리한 골든리트리버(ArgoCD)에게 바구니를 물려줍니다. 배달원은 밖의 우체통(Git)에 짜장면만 두고 갑니다. 집 안의 리트리버가 문틈(아웃바운드)으로 손만 살짝 내밀어 우체통에서 짜장면을 빼앗아(Pull) 집 안 식탁에 예쁘게 세팅하는 완벽한 밀실 보안 배송입니다.
Ⅱ. GitOps 철학과 단일 진실 공급원 (SSOT)
"서버에 접속해서 상태를 보지 마라. Git에 적힌 글씨가 곧 서버의 현실이다."
- 모든 인프라는 텍스트로 적힌다 (IaC의 끝판왕):
- GitOps의 절대 헌법 1조. "파드 개수를 3개로 늘리고 싶으면 터미널에
kubectl scale치지 마라! 오직 깃허브에 있는deployment.yaml파일의replicas: 3글자만 수정해서Git Commit쳐라!" - 이 깃허브 저장소가 회사 전산망의 '단일 진실 공급원(Single Source of Truth, SSOT)' 즉 헌법 재판소가 된다.
- GitOps의 절대 헌법 1조. "파드 개수를 3개로 늘리고 싶으면 터미널에
- 지속적 감시와 재조정 (Reconciliation Loop):
- 뱃속의 ArgoCD 봇은 3분에 한 번씩(또는 Webhook을 받아 즉시) 깃허브(헌법) 글자와 현재 클러스터 뼈대(현실)를 비교한다.
- 깃허브엔
replicas: 3인데, 현실 클러스터엔 파드가 2개밖에 없네? (불일치, Configuration Drift 발생) - 봇은 묻지도 따지지도 않고, 즉시 깃허브(헌법)의 내용대로 현실 세계를 멱살 잡고 뜯어고쳐서 파드를 1개 더 띄워 3개를 만들어버린다(Sync/Reconcile).
- 무적의 자가 치유 (Auto-Healing):
- 새벽 3시에 멍청한 주니어 직원이 운영 서버에 터미널로 몰래 들어가서 실수로 결제 DB 파드를 날려버렸다(
kubectl delete pod db). - 옛날 같으면 아침 출근 때까지 사이트가 뻗어 뉴스에 났겠지만, GitOps 환경에서는 봇이 1초 만에 "어? 깃허브엔 DB 파드 무조건 살아있으라고 적혀있는데 누가 지웠어!"라며 0.1초 만에 DB를 무덤에서 부활시켜 버린다. 인간의 뻘짓을 1초 만에 무효화하는 미친 좀비 인프라가 탄생한다.
- 새벽 3시에 멍청한 주니어 직원이 운영 서버에 터미널로 몰래 들어가서 실수로 결제 DB 파드를 날려버렸다(
📢 섹션 요약 비유: Git은 '완벽한 호텔 방 인테리어 사진첩(SSOT)'이고, ArgoCD 봇은 눈이 뒤집힌 결벽증 호텔 청소부입니다. 청소부는 3분에 한 번씩 방에 들어와서 사진첩의 사진과 똑같이 방이 세팅되어 있는지 검사합니다. 진상 손님(해커 또는 멍청한 개발자)이 침대 위치를 10cm 비틀어놓거나 수건을 한 장 훔쳐 가도, 청소부가 즉시 나타나 "사진첩(Git)이랑 다르잖아!"라고 소리치며 1초 만에 침대와 수건을 사진첩과 100% 똑같은 위치로 원상 복구시켜 버립니다. 호텔 방은 영원히 사진첩과 1픽셀도 다르지 않은 절대 불변의 멸균 상태(Immutability)를 영구 유지하게 됩니다.
Ⅲ. CI와 CD의 완벽한 이혼 (저장소 분리 전략)
소스코드와 인프라 코드를 한 바구니에 담으면 폭탄이 터진다.
- Repo를 2개로 갈기갈기 찢어라:
- 완벽한 풀(Pull) 배포를 위해, 회사는 깃허브 저장소를 강제로 2개로 분리한다.
- App Repo (애플리케이션 코드 저장소): 개발자들이
Java코드를 푸시하는 곳. 젠킨스(CI)가 여기서 코드를 긁어가 도커 이미지(myapp:v2.0)로 굽고 창고에 던지는 역할까지만 하고 죽는다. 배포는 손도 못 댄다. - Config Repo (인프라 매니페스트 저장소):
deployment.yaml같은 K8s 설정 파일만 순수하게 모여있는 텍스트 창고다. 젠킨스가 이미지를 굽고 남긴 마지막 유언(버전 1.0을 2.0으로 텍스트 수정)이 여기에 적힌다. ArgoCD는 오직 이 창고의 글자만 쳐다보고 배포(Pull)를 때린다.
- 왜 찢어놓는가? (보안과 권한 통제):
- 만약 App Repo에 인프라(YAML) 설정까지 다 때려 박아 넣으면, 수습 개발자가 자기 앱 로직(
if-else) 고치다가 실수로replicas: 1000으로 오타를 낸다. ArgoCD가 그걸 무식하게 그대로 읽고 클러스터에 파드 1000개를 띄워버려 AWS 요금 1억 폭탄을 맞고 회사가 망한다. - 2개로 찢어놓으면, 위험한 폭탄이 든 **Config Repo(인프라 창고)**에는 오직 보안이 인증된 수석 아키텍트(Infra Admin) 1명만이 [Approve(Merge)] 버튼을 누를 수 있도록 접근 통제(RBAC)를 극한으로 꽉 조여 매어, 전사 인프라 대재앙을 99.9% 억제할 수 있다.
- 만약 App Repo에 인프라(YAML) 설정까지 다 때려 박아 넣으면, 수습 개발자가 자기 앱 로직(
📢 섹션 요약 비유: App Repo는 빵(코드)을 반죽하고 굽는 '주방'이고, Config Repo는 그 빵을 매장 어디에 전시할지 치수와 가격표를 적어둔 '매장 인테리어 관리 규정집'입니다. 요리사(개발자)는 주방에서 빵을 다 구웠으면, 자기 맘대로 매장에 나가서 빵을 매대에 마구 던져놓으면 안 됩니다(분리주의). 요리사는 "2.0 크루아상 다 구웠습니다"라고 카톡(Git Commit 수정)만 남기고 퇴근합니다. 그러면 매장 전담 수석 청소부(ArgoCD)가 규정집을 꼼꼼히 읽고 나와서 빵을 진열장(운영 서버)에 아름답고 안전하게 각 잡고 꽂아 넣는 철저한 권력 분립 체계입니다.