83. 롤링 배포 (Rolling Update) - 점진적 교체와 버전 혼재의 딜레마
⚠️ 이 문서는 서비스가 돌아가고 있는 운영 서버 100대를 한 방에 확 끄고 켜서 고객 10만 명을 길바닥으로 쫓아내는 대참사를 막기 위해, **서버 100대를 1대씩, 혹은 10대씩 차례대로 야금야금 죽이고 새 버전(v2.0)으로 살려내어 전체 서버 대수(트래픽 수용량)를 항상 100대로 아슬아슬하게 유지하며 도미노처럼 릴리스하는, 쿠버네티스(K8s)의 가장 짠돌이(가성비) 기본 무중단 배포 전술인 '롤링 배포(Rolling Deployment)'**를 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 한 손으론 벽돌을 빼고 동시에 다른 손으론 새 벽돌을 끼워 넣어 집(서비스)이 무너지지 않게 하는 곡예다. 구버전 파드를 한 개 죽이고, 신버전 파드를 한 개 띄우는 과정을 100번 반복하여 천천히 물갈이를 한다.
- 가치: 추가적인 클라우드 서버 기계(돈)를 단 1원도 들이지 않고도 무중단(Zero Downtime) 배포를 100% 구현할 수 있는 극강의 가성비를 자랑하며, K8s
Deployment객체에 태생적으로 내장된 국룰 배포법이다.- 기술 체계 (치명적 한계): 10분이 걸리는 배포 과정 중간에, 이미 v2.0으로 바뀐 서버에 접속한 손님과 아직 덜 바뀐 v1.0 서버에 접속한 손님이 동시에 공존하며 핑퐁 치는 '버전 혼재(Version Inconsistency)' 지옥이 반드시 발생하므로, 앞단과 뒷단 코드가 완벽히 하위 호환성을 지켜야만 이 배포를 쓸 수 있다.
Ⅰ. 롤링 업데이트의 메커니즘 (MaxSurge와 MaxUnavailable)
무조건 1개 죽고 1개 켜지는 게 아니다. 엑셀과 브레이크 밟는 속도를 내 맘대로 조절한다.
- 파드 교체의 도미노 (ReplicaSet의 교대):
- K8s 클러스터에 구버전(v1.0) 파드 10개가 쌩쌩하게 돌고 있다.
- 개발자가 K8s에
kubectl set image deployment/myapp myapp=v2.0명령어를 날려 도커 이미지를 교체한다. - K8s의 지휘관(Deployment Controller)이 새로운 레플리카셋(RS-v2.0)을 하나 허공에 만들고 롤링(Rolling) 톱니바퀴를 돌리기 시작한다. "자, v1.0 파드 1개 죽여! 그리고 즉시 v2.0 파드 1개 켜!" $\rightarrow$ "다 켜졌어? 그럼 v1.0 하나 더 죽여!" 이 짓을 10번 반복한다.
- 속도 조절 밸브 1:
MaxUnavailable(인내심의 한계):- 1대 죽고 1대 켜지는 걸 기다리려면 100대 교체에 1시간이 넘게 걸린다. 속 터진다.
- 이 옵션은 **"배포 도중에 동시에 몇 대의 파드가 죽어서(결근해서) 빵꾸가 나도 회사가 안 망하고 참아줄 수 있는가?"**를 정의한다.
maxUnavailable: 20%로 세팅하면, K8s는 100대 중 20대를 한 방에 팍 죽여버리고(80대만 트래픽 방어) 20대를 미친 듯이 빨리 띄워 올리는 공격적이고 빠른 배포를 쏜다.
- 속도 조절 밸브 2:
MaxSurge(영끌 자원 여력):- "파드가 1대라도 죽으면 트래픽 방어가 안 돼서 터집니다!" 하는 회사가 있다.
- 이 옵션은 **"배포 도중에 원래 정원(100대)을 뚫고 초과해서(Surge) 서버를 몇 대까지 더 욱여넣을 수 있는가?"**를 정의한다. (클러스터 CPU의 잉여 체력)
maxSurge: 20%로 세팅하면, 기존 파드는 한 놈도 안 죽인 상태(100대)에서 일단 새 파드 20대를 무식하게 오버해서 더 띄워 올린다(총 120대). 새 파드 20대가 뜨고 나서야 구형 파드 20대를 죽인다. 속도는 빠르지만 클러스터의 잉여 CPU 자원이 빵빵해야만 쓸 수 있는 부자들의 롤링법이다.
📢 섹션 요약 비유: 맥도날드 주방에 알바생 10명이 햄버거를 굽고 있습니다. 유니폼(버전)을 파란색에서 빨간색으로 갈아입혀야 합니다. 롤링 배포는 1명씩 차례로 화장실에 가서 옷을 갈아입고 오게 하는 것입니다. MaxUnavailable은 "야 2명씩 동시에 화장실 가! 남은 8명이 피 터지게 버티면 되니까(속도 우선)." MaxSurge는 "안돼 손님 밀려! 대기실에서 빨간 옷 입은 새 알바생 2명 먼저 주방으로 밀어 넣어(총 12명 됨)! 걔네가 햄버거 굽기 시작하면 그때 파란 옷 2명 집에 보내(안정성 우선)."라며 주방장(K8s)이 가게 상황에 맞춰 교대 속도와 빵꾸 룰을 찰떡같이 조절하는 지능형 교대 시스템입니다.
Ⅱ. 롤링 배포의 치명적 딜레마: 버전 혼재의 공포
새로고침을 누를 때마다 화면 버튼이 생겼다 사라졌다 하는 타임머신.
- 라우팅의 분산 (Version Inconsistency):
- 롤링 배포가 50% 진행되었다(v1.0 파드 5대, v2.0 파드 5대 동시 가동 중).
- 고객 A가 홈페이지를 누른다. 로드밸런서가 이 고객을 1번 파드(v2.0)로 던진다. 고객은 새로 바뀐 [빨간색 결제 버튼]을 본다.
- 고객 A가 "어라?" 하고 키보드
F5(새로고침)를 탁 누른다. - 로드밸런서는 이번엔 고객 A를 10번 파드(v1.0)로 휙 던져버린다. 0.1초 만에 화면에서 빨간 결제 버튼이 증발해 버리고 옛날 파란 화면으로 돌아가 버린다. 고객은 컴퓨터가 귀신 들린 줄 알고 대폭동 클레임을 건다. (이래서 프론트엔드 UI 변경에는 롤링 배포를 함부로 쓰지 못한다.)
- 데이터베이스(DB) 스키마의 하위 호환성 강제:
- 더 무서운 건 데이터베이스다. v2.0 소스코드에서 회원 DB의
[나이]컬럼을 냅다 삭제(DROP)해 버리는 파괴적 배포를 쏘았다고 치자. - 롤링이 50% 진행된 10분 동안, 죽음을 앞둔 v1.0 파드 5대는 아직 살아있어서 회원가입 버튼을 누른 고객의
[나이]데이터를 DB에 넣으려고INSERT쿼리를 미친 듯이 쏜다. - 하지만 DB엔 이미 나이 컬럼이 날아갔다. v1.0 파드들은 피를 토하며 수천 건의
500 Internal Error를 뿜어내어 결제 시스템이 대폭파된다. - 결론: 롤링 배포를 쓰려면 개발자는 뼈를 깎는 고통으로 "v1.0 코드와 v2.0 코드가 완전히 똑같은 DB 테이블 1개를 동시에 바라보고 있어도 절대 에러가 나지 않도록(N-1 하위 호환성)" 스키마 변경 시 컬럼 삭제를 절대 하지 않는 등 무자비한 코딩 원칙을 철통같이 지켜야만 한다.
- 더 무서운 건 데이터베이스다. v2.0 소스코드에서 회원 DB의
📢 섹션 요약 비유: 알바생들 유니폼(롤링 교체)을 갈아입히는 10분 동안 매장 홀에는 옛날 파란 옷 알바 5명과 새 빨간 옷 알바 5명이 섞여서 서빙을 합니다(버전 혼재). 문제는 사장님이 신메뉴(DB 변경)를 도입하면서 파란 옷 알바들에게는 레시피를 안 알려준 것입니다. 손님이 파란 옷 알바에게 신메뉴를 시키는 순간 알바가 멘붕에 빠져서 주방에 불이 나고 햄버거가 다 터집니다(하위 호환성 결여로 인한 서버 에러). 이 10분의 혼돈을 막으려면 사장님은 반드시 구형 알바와 신형 알바 모두가 고장 없이 소화할 수 있는 안전한 레시피(호환 코드)로만 매장을 운영해야 하는 강박증에 시달리게 됩니다.
Ⅲ. 그럼에도 왜 롤링 배포를 쓰는가? (돈의 맛)
가난한 스타트업부터 수만 대의 서버를 돌리는 거인들까지 놓지 못하는 이유.
- 무적의 가성비 (Zero Extra Cost):
- 블루/그린 배포(Blue/Green)를 하려면 서버 100대를 통째로 똑같이 복사본으로 100대 더 띄워야 한다. 단 10분의 배포를 위해 1,000만 원어치 클라우드 월세(가상머신 비용)가 허공에 증발한다.
- 롤링 배포는 100대 서버라는 기존 자원 파이(Pie) 안에서 1놈 죽이고 1놈 살리는 교대 근무를 서기 때문에, 추가 서버 비용이 단 1원도 들지 않는 무중단 배포의 극한 가성비 템이다. (스타트업이 블루그린을 꿈꾸다 AWS 청구서를 맞고 롤링으로 도망치는 이유다.)
- K8s의 절대적 수호자 (Health Check 연동):
- 롤링 배포 중 새로 뜬 v2.0 파드 1개가 하필 오타가 있어서 뻗었다(CrashLoopBackOff).
- K8s 지휘관은 똑똑하다. 새로 띄운 파드 1개가
Readiness Probe(건강 검진)를 통과하지 못하면? "어? 이거 독가스(버그 코드) 탔네! 배포 당장 중단(Pause)!" 이라며 롤링 컨베이어 벨트를 그 자리에 콱 세워버린다. - 나머지 90대의 멀쩡한 v1.0 파드들은 죽지 않고 그대로 살아남아 서비스 전체가 무너지는 최악의 대형 롤아웃 참사를 K8s가 스스로 브레이크를 밟아 방어해 내는 미친 생존력을 뽐낸다.
📢 섹션 요약 비유: 이사 갈 때 부자들이 쓰는 '블루/그린 이사'는 아예 똑같은 새집 1채를 10억 주고 사놓고, 1초 만에 몸만 헬기 타고 쏙 이사 가는 궁극의 편안함입니다. 하지만 돈이 없는 우리들(롤링 배포)은 지금 살고 있는 30평짜리 좁은 집안에서, 한 손으로 장판 1장 뜯고 동시에 한 손으로 새 장판 1장 까는 짓을 100번 반복하며 어떻게든 돈 한 푼 안 들이고 집안을 통째로 리모델링하는 눈물겨운 짠돌이 생존 공법입니다. 조금 먼지도 날리고 덜컹거리지만(버전 혼재), 비용 0원으로 리모델링(무중단 배포)을 100% 해내는 위대한 쿠버네티스의 노가다 예술입니다.