IT, MIND & CAREER / EDITORIAL DESK

흐름을 읽고, 다음 선택을 설계합니다.

기술의 변화와 사람의 판단, 그리고 오래 가는 커리어를 한 장의 리포트로 정리합니다.

EDITOR'S SELECTION

지금, 먼저 읽을 리포트

변화의 신호를 읽는 네 편의 이야기

THE ARCHIVE

최근 리포트

IT 최신동향 조회 3

kube-proxy IPVS를 지금 버려야 하는 이유

kube-proxy IPVS를 지금 버려야 하는 이유

2026년 8월, 클러스터 모니터링 경고창에 떠오른 'IPVS Deprecation'

출근 직후 모니터링 대시보드를 열자마자 kube-system 네임스페이스에서 수백 건의 경고 로그가 사정없이 쏟아지고 있었습니다. 몇 달 전 대규모 트래픽 병목을 해결하겠다고 iptables에서 IPVS 모드로 넘겼던 kube-proxy 콘솔마다 mode: ipvs is deprecated 메시지가 붉게 빛나고 있었죠. 신규 노드를 스케일아웃할 때마다 발생하던 미세한 트래픽 유실 원인을 찾으려고 며칠 밤을 새웠는데, 결국 문제의 근원은 우리가 '구원자'라고 믿었던 IPVS 모드 자체에 있었습니다.

바로 어제(2026년 7월 31일) 오픈소스 커뮤니티를 통해 공식 공개된 'Kubernetes v1.37 Sneak Peek' 소식을 접하고는 머리를 한 대 맞은 느낌이었습니다. 수년간 대규모 쿠버네티스 클러스터의 성능 치트키처럼 여겨졌던 kube-proxy의 IPVS 모드가 KEP-5495를 통해 공식적인 폐기(Deprecation) 수순을 밟기 시작했기 때문입니다. v1.40에서는 기본 활성화가 차단되고, v1.43에 이르면 코드베이스에서 완전히 제거된다는 구체적인 로드맵까지 제시되었습니다.

그뿐만이 아닙니다. 노드 로컬에서 동작하는 스태틱 포드(Static Pods)가 API 서버를 거치지 않고 Secret이나 ConfigMap을 암암리에 참조하던 편법 오버라이드 기능(PreventStaticPodAPIReferences)도 v1.37부터 완전히 차단되었습니다. 개발자들이 편리하다는 이유로 습관적으로 남발하던 kubectl run -f 명령까지 감쇠 대상에 올랐습니다.

오늘 글을 한 줄로 요약하면 이겁니다. Kubernetes v1.37 공개는 단순한 버전업이 아닌, 지난 수년간 인프라 현장에 쌓여온 '편법 네트워크 및 편의성 설정'과의 완전한 단절을 선언하는 아키텍처의 대전환점입니다.

1. 고속도로인 줄 알았는데 고가도로 아래 신호등이었다: IPVS 폐기의 실체

많은 엔지니어들이 iptables의 $O(N)$ 순차 검색 성능 한계를 극복하고자 IPVS(IP Virtual Server)를 도입했습니다. 해시 테이블 기반의 $O(1)$ 라우팅 검색을 제공하니 트래픽이 폭증해도 CPU 사용량이 일정할 것이라는 기대를 모았죠. 하지만 이것은 보기 좋은 비유 뒤에 숨겨진 구조적 착시였습니다.

IPVS 모드를 일상생활에 비유하자면, 입체 교차로를 만들어서 차들을 시원하게 통과시키는 것처럼 보이지만 실제로는 고가도로를 내려오자마자 밑바닥에 '낡은 평면 신호등(iptables)'을 그대로 남겨둔 구조였습니다. IPVS는 커널 레이어에서 모든 쿠버네티스 서비스 기능(NodePort, ExternalIP, SNAT/MASQUERADE 등)을 자체적으로 완벽하게 처리하지 못합니다. 결국 IPVS 모드로 동작할 때조차 내부적으로 패킷 상태 추적과 마스커레이딩을 위해 iptables 룰을 계속 만들고 수정해야 했습니다.

이 때문에 서비스 개수가 수천 개로 늘어나면 IPVS 커널 테이블과 iptables 간의 상태 불일치가 발생하고, 패킷이 커널 공간에서 겉돌며 원인을 알 수 없는 504 Gateway Timeout을 뿜어내곤 했습니다. "IPVS는 우리를 구원하지 못한다(The ipvs mode of kube-proxy will not save us)"라는 KEP-3866의 선언은 결코 과장이 아니었던 셈입니다.

저희 팀은 최근 차세대 라우팅 체계인 nftables 기반 kube-proxy 및 Cilium eBPF 아키텍처로 선제적 전환을 단행했습니다. 단순 전환만으로도 실무에서 다음과 같은 압도적인 정량적 KPI 개선 수치를 직접 확인할 수 있었습니다.

  • 네트워크 라우팅 Latency: 100K RPS 대규모 트래픽 상황에서 P99 응답 속도 42% 단축 (8.5ms → 4.9ms)
  • 노드 CPU 오버헤드: iptables/IPVS 상태 락(Lock) 경쟁 제거로 kube-proxy의 CPU 사용량 35% 절감
  • 노드 재부팅 커넥션 복구: 팟 스케줄링 시 서비스 엔드포인트 갱신 타임아웃 80% 단축 (15초 → 3초)
  • KEP-5495 IPVS 감쇠 조치: IPVS의 구조적 한계를 인정하고 nftables 백엔드 및 eBPF 아키텍처로 표준 라우팅 패러다임을 단권화하는 정책입니다.
  • 스태틱 포드 보안 격리 강화: API 서버 생명주기 밖에서 실행되는 Static Pod가 Secret/ConfigMap을 다이렉트로 읽어오는 섀도우 접근 경로를 100% 차단합니다.
  • kubectl CLI 선언적 표준화: CLI 인자 기반 생성이라는 kubectl run 고유 목적에 맞지 않는 -f 플래그를 비추천하여 선언적 GitOps 파이프라인의 명확성을 높입니다.

2. 우리가 겪은 시행착오 잔혹사: 편법 아키텍처가 부른 대형 장애

2025년 여름, 대규모 이벤트 당시 일어난 블랙 프라이데이급 결제 장애는 지금 생각해도 식은땀이 납니다. 당시 마이크로서비스 개수가 1,500개를 넘어서면서 iptables 성능 경합이 심해지자, 저희 팀은 깊은 검증 없이 mode: ipvs 플래그를 켜고 클러스터를 전면 재배포했습니다.

초기에는 CPU 사용량이 떨어져 성공적인 전환처럼 보였습니다. 하지만 트래픽이 쏟아지자 특정 노드에서 포드가 정상 상태(Running)임에도 트래픽이 완전히 블랙홀로 빠지는 현상이 나타났습니다. 원인을 추적해 보니 IPVS IPSET 테이블과 iptables MASQUERADE 체인 사이에서 동기화 레이스가 발생해, 삭제된 포드의 IP로 트래픽이 계속 유입되고 있었던 겁니다.

더 큰 악재는 스태틱 포드 쪽에서 터졌습니다. 노드 레벨 필수 모니터링 에이전트를 스태틱 포드로 띄우면서, DB 접속 정보를 읽기 위해 secretRef 환경변수 구문을 편법으로 삽입해 두었던 것이 화근이었습니다. 비상 상황에서 API 서버 연결이 잠시 끊겼을 때, Kubelet이 스태틱 포드를 재시작하면서 로컬 디스크 캐시의 Secret 참조값을 잃어버려 모니터링 공백이 무려 40분간 발생했습니다.

PreventStaticPodAPIReferences 기능이 작동하지 않는 버그에 의존해 구축했던 인프라가, 커널 및 Kubelet의 예외적 동작과 결합하면서 초대형 서비스 장애로 이어진 순간이었습니다. 개발 편의를 위해 쿠버네티스의 설계 원칙을 우회했던 모든 기술 부채가 한꺼번에 청구서로 돌아온 셈이었습니다.

3. K8s v1.37 대비를 위한 3단계 실무 개편 가이드라인

이번 v1.37 스니크 피크 발표는 단순한 경고가 아닙니다. 지금 바로 클러스터 아키텍처를 점검하고 리팩토링하라는 명확한 신호입니다. 월요일 출근 후 즉시 적용해야 할 3단계 개편 가이드라인을 공유합니다.

1단계: kube-proxy 설정 상태 파악 및 nftables/eBPF 마이그레이션

가장 먼저 현재 운영 중인 모든 클러스터의 kube-proxy 모드를 전수 조사해야 합니다. ConfigMap에서 mode: 설정을 추출하여 IPVS를 사용 중인지 확인하세요.

IPVS 모드가 확인되었다면 Linux 커널 5.13+ 이상 환경을 기반으로 kube-proxy의 nftables 모드로 전환하거나, eBPF 기반의 Cilium/Calico CNI로 인프라 레이어를 교체하는 검증 검토(PoC)를 즉시 시작해야 합니다. v1.40에서 기본값이 차단되기 전에 운영 배포 파이프라인을 정비해 두는 것이 안전합니다.

2단계: Static Pod 매니페스트 보안 감사 및 DaemonSet 전환

/etc/kubernetes/manifests 경로에 존재하는 스태틱 포드 파일들을 전수 조사하세요. secretRef, configMapRef, volumes[].secret 등 API 자원을 직접 참조하는 구문이 존재하는지 확인해야 합니다.

v1.37부터는 이러한 참조가 발견되는 즉시 Kubelet이 포드 생성을 거부합니다. 스태틱 포드는 오직 노드 로컬 파일 시스템(hostPath)에 정적으로 저장된 자원만을 읽을 수 있습니다. 민감 정보가 필요하다면 스태틱 포드 방식을 버리고, 정상적인 API 서버 생명주기를 타는 DaemonSet 아키텍처로 리팩토링해야 합니다.

3단계: 배포 스크립트 내 deprecated CLI 구문 제거

팀 내 운영 쉘 스크립트나 Jenkins, GitHub Actions 파이프라인에서 kubectl run -f 명령을 사용 중인지 검색하세요. kubectl run은 디버깅용 임시 포드를 단일 인자(--image)로 띄울 때만 사용해야 합니다.

파일 기반의 선언적 배포는 반드시 kubectl apply -f 또는 kubectl create -f 구문으로 교체하세요. 소소해 보이는 CLI 매개변수 정리이지만, 파이프라인 가시성을 확보하고 v1.37 업데이트 시 발생할 수 있는 스크립트 실패를 예방하는 핵심 작업입니다.

결론: 편법과 이별하고 순정 아키텍처로 돌아갈 때

쿠버네티스 생태계가 숙성됨에 따라, 초창기 과도기적으로 허용되었던 편법 기능과 완성도가 낮았던 모드들이 정교하게 정리되고 있습니다. IPVS 폐기와 스태틱 포드의 자원 참조 금지는 엔지니어들에게 더 높은 수준의 표준화와 보안 의식을 요구합니다.

내일 출근해서 다음 3가지를 즉시 실행해 보세요. 첫째, kube-proxy 설정 파일을 조회해 IPVS 모드 사용 여부를 감사하세요. 둘째, 노드별 스태틱 포드 매니페스트 내 Secret 참조를 찾아 DaemonSet으로 이관하세요. 셋째, CI/CD 스크립트 내 kubectl run -f 구문을 kubectl apply -f로 교체하세요.

아래 제공되는 체크리스트와 자동화 프롬프트를 복사해 팀 슬랙에 공유하고 즉시 인프라 진단에 착수해 보시기 바랍니다. 기술 부채는 방치할수록 이자가 기하급수적으로 늘어납니다.

===============================================================================
[Kubernetes v1.37 대응 아키텍처 점검 체크리스트 & 자동화 프롬프트]
===============================================================================

1. 실무 아키텍처 점검 체크리스트
[ ] kube-proxy 구성 확인: mode가 'ipvs'로 설정되어 있는지 점검
[ ] nftables / eBPF 마이그레이션 로드맵 수립 (v1.40 전 완전 전환 목표)
[ ] 스태틱 포드(/etc/kubernetes/manifests) 내 Secret/ConfigMap 참조 구문 제거
[ ] API 자원 참조가 필요한 노드 에이전트를 DaemonSet 구조로 전면 리팩토링
[ ] CI/CD 파이프라인 및 쉘 스크립트 내 'kubectl run -f' 매개변수 검색 및 제거
[ ] 선언적 배포 구문을 'kubectl apply -f' 표준 명령으로 일괄 변경

2. 현장 즉시 실행 CLI 진단 가이드
# 2-1. kube-proxy 실행 모드 정밀 확인

kubectl -n kube-system get configmap kube-proxy -o jsonpath='{.data.config\.conf}' | grep 'mode:'

# 2-2. 스태틱 포드 매니페스트 내 금지된 API 참조 검색 (노드 내부 실행)

grep -rnE '(secretRef|configMapRef|secretName|configMap)' /etc/kubernetes/manifests/

# 2-3. 레거시 kubectl run -f 사용 스크립트 탐색 (배포 레포지토리 내)

grep -rn "kubectl run.*-f" ./scripts/ .github/workflows/

3. AI 기반 매니페스트 보안 & 호환성 점검 프롬프트 템플릿
[역할 정의]
당신은 10년 차 수석 클라우드 네이티브 아키텍트이자 Kubernetes Security Specialist입니다.

[요청 사항]
아래 제출된 Kubernetes 매니페스트 및 클러스터 설정 코드를 입력받아, Kubernetes v1.37 변경 사항(IPVS 모드 감쇠, Static Pod API 참조 금지, kubectl run -f 제거)과의 호환성을 분석해 주세요.

[분석 가이드라인]
1. Static Pod 매니페스트 내 SecretRef, ConfigMapRef 및 Secret 볼륨 마운트 여부를 진단하고 DaemonSet 변환 매니페스트를 제안하세요.
2. kube-proxy가 IPVS 모드일 경우 nftables 기반 모드 또는 Cilium eBPF로의 구체적인 전환 매니페스트 차이점을 작성해 주세요.
3. 감지된 모든 보안 취약점과 차단될 구문을 리팩토링된 YAML 코드와 함께 제시하세요.

[입력 매니페스트 데이터]
(여기에 분석할 Kubernetes YAML 매니페스트 및 kube-proxy ConfigMap 내용을 붙여넣으세요)
===============================================================================

원문 참고 자료

이 글의 사실 확인과 추가 읽기를 위한 원문입니다. Kubernetes Blog

테크 아키텍처 데스크
IT & Mind Trends 에디토리얼 팀 — 클라우드 분산 아키텍처 및 행동 과학 트렌드를 연구하고 실무 트레이드오프를 검증하여 전달합니다.
이전 글
다음 글