96. VPA (Vertical Pod Autoscaler) - 파드 수직 자동 스케일러
⚠️ 이 문서는 쿠버네티스 클러스터에서 파드(Pod)의 '개수'를 여러 개로 늘려서 부하를 분산하는 HPA(수평 스케일러)와 달리, 데이터베이스나 캐시 서버처럼 개수를 쪼갤 수 없거나 분산 처리가 불가능한 애플리케이션이 메모리 초과로 뻗는 것을 막기 위해, **컨테이너 자체의 체력(CPU와 메모리의 Request/Limit 값)을 밑바닥부터 헐크처럼 통째로 키워버리거나 깎아내어 자원 할당량을 수직 상향/하향 조정해 주는 'VPA (수직 파드 오토스케일러)'**를 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: "알바생을 더 뽑아라(HPA)"가 아니라, "지금 일하고 있는 1명의 주방장에게 근력 강화 주사를 놔서 덩치(CPU/RAM)를 강제로 키워라(VPA)"라는 개념의 스케일업(Scale-up) 기술이다.
- 가치: 개발자가 처음에 파드의 CPU를
100m, RAM을256Mi로 대충 때려 맞춰 적어두었다가 런타임에 메모리 부족(OOM)으로 파드가 터지는 삽질을 없애준다. 기계가 며칠간 파드의 섭취량을 감시하다가 "얘는 램 512Mi가 적당하네"라며 설정값(yaml) 자체를 인공지능처럼 알아서 최적화해 고쳐버린다.- 기술 체계: HPA와 동시에 같은 CPU/RAM 메트릭을 바라보게 세팅하면 둘이 멱살을 잡고 싸우게 되므로 절대 같이 쓰면 안 되며(예외 있음), VPA가 자원 크기를 바꿀 때는 어쩔 수 없이 기존 파드를 한 번 죽이고(Evict) 더 큰 덩치로 새로 띄워야 하는 파괴적 재시작(Downtime)이 동반된다.
Ⅰ. 수동 리소스 할당의 찍기(Guesswork) 고통
개발자는 자기 앱이 램을 얼마나 퍼먹는지 정확히 모른다.
- Requests와 Limits의 딜레마:
- 쿠버네티스 파드를 배포할 때, 착한 개발자는 항상
resources.requests(최소 요구량)와limits(최대 제한량)를 적는다. - 하지만 이 값은 100% 감(Guess)으로 찍은 숫자다. "램 512MB면 넉넉하겠지?" 하고 배포했는데 새벽에 트래픽이 터져 512MB를 넘자, 쿠버네티스 OOM Killer가 냅다 파드의 목을 날려버려 서비스가 장애 난다.
- 쿠버네티스 파드를 배포할 때, 착한 개발자는 항상
- 오버 프로비저닝 (Over-provisioning)의 낭비:
- 놀란 개발자는 다음 배포 때 무서워서 파드의 램 리미트를
4GB로 엄청나게 크게 잡아버린다. - 실제로 이 파드는 1GB밖에 안 쓰는데, 쿠버네티스는 이 파드를 위해 4GB의 공간을 영원히 예약(Block)해둔다. 결국 비싼 AWS 노드 서버(EC2) 공간이 텅텅 비었는데도 다른 파드가 못 들어가는 막대한 돈 낭비(자원 누수)가 발생한다.
- 놀란 개발자는 다음 배포 때 무서워서 파드의 램 리미트를
📢 섹션 요약 비유: 엄마(개발자)가 고등학생 아들(파드)에게 매달 용돈(자원)을 5만 원 줍니다. 아들이 문제집 살 돈이 모자라 굶어 쓰러집니다(OOM 에러). 놀란 엄마가 다음 달부터 용돈을 50만 원 쏴줍니다. 아들은 10만 원만 쓰고 40만 원은 지갑에 썩혀둡니다(오버 프로비저닝). 엄마의 한 달 생활비(클라우드 요금)만 거덜 나는 눈물 나는 헛발질의 연속입니다.
Ⅱ. VPA의 기적: 며칠 지켜보고 체질을 바꿔버린다
찍지 마라. 기계가 학습해서 완벽한 맞춤형 옷을 재단해 준다.
- Recommender (감시와 추천):
- VPA 엔진을 켜두면, 이 똑똑한 봇이 며칠 동안 클러스터 구석에 숨어서 내 파드가 CPU와 램을 얼마나 쓰는지 그래프 패턴을 조용히 관찰(History)한다.
- "흠, 개발자가 처음에 램 256MB로 적어놨는데, 지켜보니 어젯밤에 피크 칠 때 400MB까지 쓰네? 이 파드는 512MB로 세팅하는 게 제일 예쁘고 안전하겠어."라고 완벽한 최적의 권장 값(Recommendation)을 산출한다.
- Updater 와 Auto 모드의 파괴적 갱신:
- VPA를
updateMode: Auto로 세팅해 두었다 치자. - VPA가 "너 덩치 키워야 해!"라고 결심한 순간, 런타임에 고무줄처럼 램 크기를 쓱 늘릴 수는 없다 (리눅스 컨테이너의 한계).
- VPA는 미련 없이 **현재 돌아가는 파드를 즉시 암살(Evict/Kill)해 버리고, 0.1초 뒤 자신이 계산한 거대한 CPU/RAM 세팅값(
512MB)이 적힌 새로운 파드로 바꿔치기해서 부활(Restart)**시켜 버린다. (이 과정에서 아주 잠깐의 서비스 끊김이 발생할 수 있다.)
- VPA를
- Off 모드 (권고만 받기):
- 운영 서버 한복판에 파드가 강제로 껐다 켜지는 게 무서운 DBA나 엔지니어는
updateMode: Off로 둔다. - 이렇게 하면 VPA는 파드를 안 죽이고 "내가 관찰해 보니 512MB가 딱이야"라고 귓속말로 조언(로그 기록)만 해준다. 개발자는 다음 배포 때 그 조언을 참고해서 yaml 파일의 숫자를 고치면 된다.
- 운영 서버 한복판에 파드가 강제로 껐다 켜지는 게 무서운 DBA나 엔지니어는
📢 섹션 요약 비유: 아들의 용돈을 얼마 줘야 할지 모르는 엄마를 위해, 가계부 AI 비서(VPA)가 아들의 한 달 치 카드 내역(메트릭)을 완벽히 분석합니다. 그리고 엄마에게 "아들은 매달 딱 12만 5천 원을 쓰네요. 앞으로 용돈을 13만 원으로 자동 변경(Auto)해 드릴까요, 아니면 참고만 하시겠어요(Off)?"라고 완벽한 컨설팅 리포트를 들이미는 맞춤형 자산 관리 시스템입니다.
Ⅲ. HPA vs VPA: 멱살잡이와 아키텍처의 분리
두 마리의 호랑이를 같은 산(CPU 메트릭)에 두면 산이 무너진다.
- 동시 적용의 치명적 오류 (Race Condition):
- 어떤 멍청한 개발자가 "오! 그럼 HPA로 개수도 늘리고, VPA로 덩치도 키우면 무적의 서버가 되겠네?" 하고 두 개를 똑같이
CPU 기준으로 켜버렸다. - 트래픽이 몰려 CPU가 80%를 찍었다.
- HPA 봇: "앗 CPU가 높네? 파드 개수를 2개에서 4개로 늘려!"
- VPA 봇: "앗 CPU가 높네? 현재 파드를 죽이고 CPU 덩치를 2배 큰 놈으로 새로 띄워!"
- 둘이 동시에 발작하면서 파드가 4개로 늘어남과 동시에 기존 파드들이 죽어 나가고 재부팅되는 대혼란(플래핑)이 터져 시스템이 지옥에 빠진다.
- 어떤 멍청한 개발자가 "오! 그럼 HPA로 개수도 늘리고, VPA로 덩치도 키우면 무적의 서버가 되겠네?" 하고 두 개를 똑같이
- 절대적 원칙 (지표의 분리):
- 쿠버네티스의 철칙: "절대로 HPA와 VPA를 'CPU/메모리'라는 똑같은 조건(Metric)으로 동시에 엮지 마라."
- 굳이 같이 써야 한다면? **HPA는 [카프카 큐에 쌓인 메시지 수(Custom Metric)]**를 보고 개수를 늘리게 하고, **VPA는 [CPU/RAM(Resource Metric)]**을 보고 덩치를 키우게 역할을 완벽하게 찢어놓아야만 두 로봇이 평화롭게 공존할 수 있다.
📢 섹션 요약 비유: 불이 난 현장(CPU 100%)에 소방관 두 명이 도착했습니다. 한 명(HPA)은 "빨리 동료 소방관 5명을 더 데려와!(개수 증가)"라고 무전을 치고, 다른 한 명(VPA)은 "야, 너 입고 있는 방화복 작으니까 잠깐 벗고 이 2배 두꺼운 헐크 방화복으로 갈아입어!(덩치 키우기)"라며 불 속에서 동료의 옷을 강제로 벗기고 있습니다. 두 지시가 동시에 떨어지면 소방관은 불타 죽습니다. 지휘 체계는 무조건 하나로 통일해야 합니다.