87. 푸시 기반(Push-based) 배포 - 젠킨스의 강제 배포와 보안 딜레마

⚠️ 이 문서는 어제 배운 'GitOps(Pull 방식)'의 우아함을 깨닫기 위해 반드시 알아야 할, 데브옵스(DevOps) 1세대 시절 수많은 기업이 찬양했지만 치명적인 보안 구멍과 통제 불능의 끔찍한 한계 때문에 결국 클라우드 네이티브 시대에서 버림받게 된, **젠킨스(Jenkins) 같은 CI 서버가 쿠버네티스 클러스터의 마스터 비밀번호(권한)를 쥐고 바깥에서 억지로 도커 이미지를 밀어 넣어 때려 박는 폭력적인 아키텍처인 '푸시 기반(Push-based) 배포'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 배포의 주도권을 클러스터 바깥에 있는 외부 시스템(젠킨스, GitLab CI 등)이 쥐고 있다. CI 서버가 파이프라인의 끝에서 스스로 kubectl apply를 실행하여 운영 서버에 코드를 강제로 구겨 넣는(Push) 하향식 폭격 배포다.
  2. 가치 (치명적 한계): 외부 시스템이 100대의 운영 서버 클러스터에 접속하려면 각 클러스터의 관리자 자격 증명(Kubeconfig, API Key)을 젠킨스 뱃속에 몽땅 쑤셔 넣어야 한다. 만약 젠킨스 서버가 해킹당하면 전 세계의 사내 서버가 1초 만에 쑥대밭이 되는 최악의 보안 단일 장애점(SPOF)이 된다.
  3. 기술 체계: Git 푸시 -> 젠킨스(CI) 빌드 -> 젠킨스 안에서 쉘 스크립트로 kubectl 명령어 실행 -> K8s 클러스터 도달 이라는 일방통행 흐름이다. 젠킨스가 불을 뿜고 뒤돌아서면, K8s 내부가 나중에 엉망진창이 되어도 젠킨스는 알 길이 없는 스스로 치유(Auto-Healing) 불가의 장님 시스템이다.

Ⅰ. 푸시(Push) 방식의 메커니즘과 그 시절의 영광

개발부터 배포까지 터미널 안 켜고 젠킨스 버튼 하나면 다 되던 시절.

  1. 파이프라인의 폭력적 직진 (One-Way Traffic):
    • 개발자가 깃허브에 코드를 Push 한다.
    • 바깥망에 설치된 CI 서버(Jenkins)가 깨어난다. 코드를 다운받고, 컴파일(Java)하고, 도커 이미지(v1.0)를 구워서 도커 허브 창고에 던져놓는다. 여기까지는 완벽한 CI(지속적 통합)다.
    • 문제는 마지막 CD(배포) 단계다. 젠킨스가 파이프라인의 마지막 스크립트(Shell)를 돌린다.
    • sh "kubectl set image deployment/myapp myapp=v1.0 --kubeconfig=/secret/admin.conf"
    • 젠킨스는 자기 뱃속에 꽁꽁 숨겨둔 운영 서버의 마스터 열쇠(admin.conf)를 꺼내어, 바깥 인터넷망에서 운영망(K8s)의 API 서버 정문을 따고 들어가 이 이미지를 강제로 덮어씌워 버린다(Push).
  2. 왜 이걸 찬양했는가? (초기 편의성):
    • 파이프라인 스크립트 한 장에 "빌드 $\rightarrow$ 테스트 $\rightarrow$ 배포"가 하나의 아름다운 직선(Linear) 로직으로 다 적혀있으니 개발자 입장에선 직관적이고 편했다.
    • 쿠버네티스(K8s) 클러스터 내부에는 아무런 배포 로봇(Agent)을 깔 필요가 없어서 인프라팀도 귀찮은 세팅이 없었다.

📢 섹션 요약 비유: 푸시 배포는 공장장(젠킨스)이 요리를 다 만든 뒤에, 오토바이를 타고 손님 집(운영 서버) 도어락 비밀번호(Kubeconfig 권한)를 직접 치고 현관문을 벌컥 열어젖힌 다음 거실 탁자에 피자(앱)를 쾅! 던져놓고 오토바이를 타고 다시 자기 공장으로 돌아가 버리는 굉장히 폭력적이고 강제적인 배송 시스템입니다. 편하긴 한데, 손님 입장에서는 외지인이 언제든 내 집 문을 따고 들어올 수 있다는 엄청난 불안감을 껴안고 살아야 합니다.


Ⅱ. 파멸의 시작: 3가지 치명적인 데브옵스 지옥

권력이 한 놈에게 너무 몰려있으면 무조건 부패하고 터진다.

  1. 보안의 댐 붕괴 (God Mode Jenkins):
    • 대기업에 K8s 클러스터가 개발망 10대, 검증망 10대, 운영망 50대가 있다.
    • 푸시 방식(젠킨스)으로 이걸 다 배포하려면? 젠킨스 서버 뱃속 폴더에 70대 클러스터의 '관리자 마스터 비밀번호' 70개를 몽땅 txt 파일로 저장해 둬야 한다.
    • 어느 날 젠킨스 서버의 플러그인 취약점이 뚫려 러시아 해커가 젠킨스를 먹었다. 해커는 젠킨스 뱃속에 있는 70개의 마스터 키를 주워다가 단 1분 만에 회사 전산망 70개의 심장을 파괴하고 랜섬웨어 락을 걸어버린다. 한 바구니에 담은 계란(권한)이 부른 대참사다.
  2. 망 분리의 한계 (방화벽 뚫어주기 노가다):
    • 은행 같은 곳은 내부 운영 서버망을 인터넷과 완벽하게 끊어놓는다(망 분리).
    • 젠킨스(외부망)가 운영 서버(내부망)에 푸시(Push)를 하려면, 보안팀에게 가서 "제발 젠킨스 IP 하나만 내부망으로 뚫고 들어오게 방화벽 문(Inbound Port 6443) 좀 열어주세요!"라고 무릎 꿇고 빌어야 한다. 보안팀은 죽어도 안 된다고 싸우는 끔찍한 네트워크 협상이 매번 일어난다.
  3. 장님 파이프라인 (Drift의 방치):
    • 젠킨스가 푸시를 쾅 쏘고 배포 성공(Success) 초록불을 띄운 뒤 퇴근했다.
    • 새벽에 어떤 직원이 몰래 운영 서버 터미널에 들어가 파드 개수를 3개에서 1개로 줄였다.
    • 젠킨스는 바깥에 있으므로, 어젯밤 배포해 놓고 온 서버가 지금 안에서 불타는지 누가 손을 댔는지(Drift 현상) 전혀 알 방법이 없다(모니터링 단절). 결국 소스코드(Git)와 실제 서버가 100% 따로 노는 고질병이 낫질 않는다.

📢 섹션 요약 비유: 공장장(젠킨스)의 권력이 너무 센 것이 파멸의 원인입니다. 공장장 주머니에 동네 70가구의 모든 집 현관문 비밀번호 마스터키 70개(보안 취약점)가 달그락거리며 들어있습니다. 도둑이 공장장만 납치하면 동네 70가구를 싹 다 털어먹을 수 있습니다. 게다가 철통보안을 자랑하는 부잣집(망 분리 망)은 아예 외부인이 도어락을 누르는 것조차 막아놔서, 공장장이 담장을 넘어 피자를 던져주러 갈 수가 없습니다. 가장 큰 문제는, 공장장이 피자를 배달하고 뒤돌아서는 순간 그 집에 강도가 들어 피자를 훔쳐 가도 공장장(장님 파이프라인)은 절대 알 수가 없어 책임을 질 수 없다는 끔찍한 단절의 한계입니다.


Ⅲ. GitOps(Pull)로의 권력 이양과 혁명

바깥놈에게 비밀번호를 주지 마라. 안에서 문을 살짝 열고 가져가게 하라.

  1. 권력의 회수 (Inbound의 철폐):
    • 데브옵스 엔지니어들이 푸시 방식을 폐기 처분했다.
    • 젠킨스의 뱃속에 있던 운영 서버 마스터 키 70개를 전기톱으로 갈아버리고 권한을 빼앗았다. "젠킨스 넌 이제 빌드(CI)만 해!"
    • 그리고 외부 방화벽으로 들어오는 모든 인바운드(Inbound) 문을 시멘트로 막아버렸다. 아무도 밖에서 운영 서버 K8s를 직접 찌를(Push) 수 없다.
  2. 어제 배운 ArgoCD (Pull 방식)의 승리:
    • 대신 운영 K8s 클러스터의 가장 안전한 내부망 한가운데에 ArgoCD 봇을 심어두었다.
    • ArgoCD 봇이 스스로 안에서 밖으로 아웃바운드(Outbound) 인터넷 창문을 살짝 열고 깃허브(Git)만 스윽 감시하다가, 새로운 코드가 올라오면 봇이 직접 코드를 잡아당겨(Pull) 자기 뱃속(K8s 클러스터)에 안전하게 배포(Sync)한다.
    • 결과: 방화벽 구멍을 뚫어달라고 사정할 필요가 없어졌고, 클러스터 밖에는 그 어떤 비밀번호도 굴러다니지 않아 해커의 1차 타겟(단일 장애점)이 완벽하게 소멸했다. 이것이 클라우드 네이티브 진영이 푸시(Push)를 쓰레기통에 버리고 깃옵스(GitOps/Pull)로 100% 갈아탄 위대한 역사적 배경이다.

📢 섹션 요약 비유: 결국 불안에 떨던 마을 주민(인프라 아키텍트)들은 공장장(젠킨스)의 마스터키 70개를 뺏어 용광로에 녹여버리고, 외부에서 손님 집 문을 여는 행위(Push)를 법으로 금지해 버렸습니다. 방화벽 문은 밖에서 안 열리고 오직 안에서 밖으로만 열리게 개조했습니다. 대신 집 안 거실에 똑똑한 애완견(ArgoCD)을 키웁니다. 애완견이 안에서 밖으로 난 개구멍(Outbound)을 통해 목만 살짝 내밀고 우체통(Git)에 새 피자가 왔는지 쳐다보다가(Pull 감시), 피자가 오면 자기가 입으로 물고 들어와 식탁에 안전하게 세팅합니다. 밖의 강도는 문을 열쇠로 딸 방법이 영원히 사라져버린, 철통 방어 요새(GitOps)의 탄생입니다.