AWS

EKS - VPC CNI

rygus 2026. 2. 8. 16:36
728x90

안녕하세요. 

오늘은 EKS의 VPC CNI에 대해 알아보겠습니다. 

 

# VPC CNI 란? 

Amazon VPC CNI는 EKS(Amazon Elastic Kubernetes Service) 클러스터에서

Pod의 네트워킹을 담당하는 기본 플러그인입니다.

가장 큰 특징은 파드가 VPC의 실제 IP 주소를 직접 할당받는다는 점입니다.

다른 쿠버네티스 CNI(예: Calico, Flannel)가 오버레이 네트워크(Overlay Network, VXLAN/IP-in-IP 등)를 사용하여 캡슐화 통신을 하는 것과 달리, VPC CNI는 AWS의 VPC 네트워크 인프라에 파드를 직접 편입시킵니다.

 

# VPC CNI의 IP 할당 과정

1. Primary ENI 에서 찾기

Pod가 생성되면 가장 먼저 Primary ENI를 확인합니다.

  • Primary ENI의 보조 IP 대역 확인: 현재 기본 인터페이스에 할당된 IP 중 남는 슬롯이 있는지 확인합니다.
  • Yes: 사용 가능한 IP가 있다면 즉시 Pod에 IP를 할당하고 성공적으로 마칩니다.

2. Secondary ENI에서 확인

Primary ENI에 자리가 없다면, 이미 노드에 붙어 있는 Secondary ENI들을 살펴봅니다.

  • Secondary ENI 확인: WARM_IP_TARGET 등의 설정에 의해 미리 생성되어 있는 보조 ENI가 있는지 확인합니다.
  • Yes: Secondary ENI가 존재한다면, 해당 ENI 내에 비어 있는 Secondary IP 대역이 있는지 체크합니다.
    있다면 그 IP를 가져와 Pod에 할당합니다.

3. 신규 ENI 생성

기존에 연결된 어떤 ENI에도 남는 IP가 없다면, 노드에 새로운 네트워크 인터페이스를 추가해야 합니다.

  • Secondary ENI 생성 가능 여부 확인: 현재 인스턴스 타입(예: t3.large)이 허용하는 최대 ENI 개수를 초과하지 않았는지 확인합니다.
  • Yes 신규 ENI 생성 : EC2 인스턴스에 새로운 ENI를 Attach 하고, 거기서 IP를 할당받아 Pod에 연결합니다. 이 과정은 AWS API 호출이 발생하므로 IP 할당 속도가 일시적으로 느려질 수 있습니다.

4. 실패 (Failure)

만약 인스턴스가 허용하는 최대 ENI 개수도 꽉 찼고, 더 이상 할당할 수 있는
IP 대역이 없다면 IP 할당에 실패하게 됩니다.
이 경우 Pod는 Pending 상태에 머물게 됩니다.

 

 

이러한 VPC CNI에는 Secondary IP 모드 Prefix Delegation 모드가 있습니다. 

하나씩 확인해보겠습니다. 

 

# Secondary IP 모드 (이하 보조 IP 모드)

보조 IP 모드는 VPC CNI의 기본 동작 방식으로 EKS를 생성하면 보조 IP 모드로 생성됩니다.

 

이제 콘솔에서 확인해보겠습니다.

EC2에 가면 EKS 노드에 해당하는 EC2가 있습니다. 

 

보조 IP가 엄청 많이 할당되어 있는 게 보이실 텐데요. 

저희가 파드를 하나 생성하면 해당 대역 중 하나가 파드의 IP로 잡히게 됩니다. 

kubectl run test-pod --image=nginx

 

보조 IP 대역 중 하나인 11.0.3.214가 할당되어 있는 것을 확인 가능합니다.

 

그렇다면 최대 몇 개의 파드가 배포 가능할까요? 

간단한 명령어로 확인 가능합니다.

kubectl get node <node name> -o yaml | grep allocatable -A7

 

 

현재 `t3.large` 타입으로 생성 가능한 최대 파드 수는 35개입니다. 

실제로 그런지 확인해 보겠습니다. 

kubectl create deployment my-eks-test --image=nginx --replicas=32

 

기본으로 배포되어 있는 파드가 4개 있으니 32개만 배포하겠습니다. 

 

 

한 대만 배포가 되지 않았습니다. 

description을 확인해보겠습니다. 

파드가 너무 많다는 오류를 확인할 수 있습니다. 

 

# Prefix  Delegation 모드 (이하 접두사 위임 모드)

기존의 VPC CNI는 ENI(Elastic Network Interface)에 보조 IP를 하나씩 할당하여 Pod에 부여했습니다.

반면, 접두사 위임 모드는 개별 IP 대신 /28 bit를 ENI 슬롯에 할당합니다.

  • 핵심 차이점: 1개 슬롯 = 1개 IP (기존) → 1개 슬롯 = 16개 IP (Prefix 모드)

 

 

그렇다고 모든 상황에서 쓸 수 있는 것은 아니고 Nitro Type에서만 사용 가능합니다. 

AWS Nitro System은 가상화 효율을 극대화하기 위해
AWS가 자체 개발한 하드웨어 및 소프트웨어 프레임워크입니다.

 

Nitro를 지원하는 EC2는 하기 docs에서 확인 가능합니다. 

 

 

적용 방법은 aws-node daemonset의 ENABLE_PREFIX_DELEGATION 옵션을 true로 바꿔주면 됩니다.

kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true

 

 

감사합니다.

 

*참고 문서

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/choosing-instance-type.html?utm_source=chatgpt.com#determine-max-pods

https://kimalarm.tistory.com/51

https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/cni-increase-ip-addresses.html