EKS 서브넷 IP 고갈 — 파드 churn과 WARM_IP_TARGET
부하 테스트를 하느라 파드를 짧은 주기로 대량 생성·삭제했더니, 어느 순간부터 새 파드가 IP 를 할당받지 못하고 그대로 Pending 에 쌓이기 시작했습니다. 노드에 자리가 없어서라면 스펙이나 대수를 올리면 되는데, 노드는 멀쩡한데 서브넷에 남은 사설 IP 가 없어서 벌어진 일이었습니다.
처음에는 회수(flush) 시간만 줄이면 되겠다 싶었습니다. 파드를 지워도 그 IP 가 바로 안 돌아오니, 반납이 빨라지면 부족분이 메워질 거라고 본 겁니다.
삭제된 IP가 바로 안 돌아오는 이유
파드가 삭제돼도 그 IP 는 바로 다른 파드에 안 갑니다. 기본 30초쯤 쿨다운을 두고 묶어 두는데, 회수하자마자 재사용하면 이전 연결에 남아 있던 패킷이 그 IP 를 물려받은 새 파드로 흘러 들어갈 수 있기 때문입니다.
그래서 이 시간을 줄이는 건 답이 아니었습니다. 깔끔하게 조절할 수 있는 값도 아니고, 억지로 줄이면 위험합니다. 그리고 줄여봐야 근본 문제가 안 풀립니다. churn 이 빠르면 30초든 5초든 그 사이에 가용 IP 가 다시 0 이 됩니다.
진짜 문제 — 노드가 점유한 유휴 IP
VPC CNI 는 파드가 요청하기 전에 IP 를 미리 확보해둡니다. 파드가 뜰 때 빨리 주려고 여유분(warm pool)을 노드마다 붙여둡니다.
기본값(WARM_ENI_TARGET=1)은 ENI 하나 분량의 IP 를 통째로 여유로 잡습니다.
노드가 실제로 파드 몇 개만 돌려도, 수십 개 IP 를 쥐고만 있습니다. 노드가
많으면 이렇게 점유만 된 IP 들이 서브넷의 가용 IP 를 소진합니다. 파드가 안 써도
서브넷에서는 이미 나간 IP 입니다.
그래서 노드가 여유분을 덜 쥐게 바꿉니다.
kubectl set env daemonset aws-node -n kube-system \
WARM_IP_TARGET=3 MINIMUM_IP_TARGET=5
WARM_IP_TARGET 은 “쓰는 IP 위에 몇 개를 여유로 둘지”, MINIMUM_IP_TARGET
은 “최소 몇 개는 미리 붙여둘지” 입니다. 이걸 낮추면 노드가 안 쓰는 IP 를
서브넷에 돌려줘서, 다른 노드·파드가 쓸 IP 가 늘어납니다.
물론 공짜는 아니라서, 여유분을 적게 쥐면 파드가 갑자기 늘 때 IP 를 새로 붙이는 API 호출이 그만큼 늘어 파드 시작이 조금 느려집니다. “IP 를 아끼는 것” 과 “빨리 뜨는 것” 을 맞바꾸는 겁니다. 절대 IP 가 부족한 상황에서는 아끼는 쪽으로 기웁니다.
그래도 부족하면 — IP 공간 확장
warm target 을 낮춰도 서브넷 자체가 작으면 한계가 있습니다. 이땐 IP 공간을 늘립니다.
- 서브넷 CIDR 확장 — 워크로드용 서브넷을
/22이상으로 크게. - secondary CIDR + custom networking — VPC 에
100.64.0.0/10같은 큰 대역을 추가로 붙이고, 파드는 그 대역에서 IP 를 받게 합니다. 파드용 IP 공간을 노드용과 분리해서 크게 확보하는 방법입니다.
주의할 건, 이 상황에서 Prefix Delegation 은 방향이 반대라는 겁니다. Prefix
Delegation 은 노드가 IP 를 /28(16개) 단위로 더 많이 쥐게 해서 노드당 파드
밀도를 높이는 기능입니다. 노드 스펙(ENI 한도)이 병목일 때 쓰는 거고, 서브넷
IP 가 절대적으로 부족한 상황에서는 오히려 서브넷을 더 빨리 비웁니다.
IP를 들고 있는 건 파드가 아니라 노드
증상은 “IP 부족”, 첫 직감은 “회수를 빨리 하자” 였습니다. 그런데 회수 쿨다운은 안전장치라 건드릴 게 아니었고, 진짜 원인은 노드가 안 쓰는 IP 를 쥐고 있는 것이었습니다.
- 회수 시간 → 손대지 않는다 (안전장치, 근본 해결 아님)
WARM_IP_TARGET/MINIMUM_IP_TARGET→ 낮춰서 노드가 IP 를 덜 쥐게- 그래도 부족하면 → 서브넷 확장 또는 secondary CIDR 로 IP 공간 자체를 늘림
“IP 가 부족하다” 를 보면 회수를 빠르게 할 방법부터 찾게 되는데, 그 전에
누가 IP 를 쥐고 있는지를 봅니다. 파드가 아니라 노드의 warm pool 이 들고
있는 경우가 대부분이라, WARM_IP_TARGET 을 조이는 것만으로 서브넷에 IP 가
돌아옵니다.
댓글 0