[AWS EKS] AWS VPC CNI 개념 및 Pod 네트워크 구성 이해

주영·2025년 2월 14일
0

이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.

1. AWS VPC CNI 소개

1.1 Kubernetes CNI란?

K8S CNI(Container Network Interface)는 Kubernetes에서 네트워크 환경을 구성하는 플러그인 시스템입니다.
이를 통해 Kubernetes 클러스터 내에서 Pod 간 통신을 처리하고, IP 주소를 할당할 수 있습니다.

🔗 공식 문서: Kubernetes 네트워크 개념
🔗 공식 문서: Kubernetes 네트워크 플러그인 목록

1.2 AWS VPC CNI란?

AWS에서는 기본적으로 Amazon VPC CNI를 사용하여 Kubernetes 네트워크를 구성합니다.
AWS VPC CNI는 VPC의 IP 주소를 직접 Pod에 할당하는 방식으로 동작하며, 이를 통해 Pod와 노드(EC2) 간 직접 통신이 가능해집니다.

🔗 AWS VPC CNI GitHub
🔗 AWS VPC CNI Proposal
🔗 AWS 공식 문서: Amazon VPC CNI

AWS VPC CNI의 주요 기능

  • Pod에게 VPC 내 IP 주소를 직접 할당하여 ENI(Elastic Network Interface)를 활용한 네트워크 구성
  • VPC 내 다른 리소스(EC2, RDS, ALB 등)와 원활한 통신 가능
  • VPC 보안 그룹, 라우팅 테이블, Flow Logs 활용 가능
  • Warm Pool을 사용하여 빠른 Pod 시작 가능

2. AWS VPC CNI의 주요 구성 요소

AWS VPC CNI는 Kubernetes에서 Pod 네트워크를 자동으로 설정하며, 다음 두 가지 주요 컴포넌트로 구성됩니다.

2.1 CNI Binary

  • Kubernetes에서 Pod가 생성될 때마다 실행되는 바이너리
  • Pod가 노드에 추가되거나 제거될 때 Pod 네트워크를 설정 및 관리
  • Pod 간 통신을 설정하여 Pod-to-Pod 연결을 자동 구성

2.2 ipamd(IP Address Management Daemon)

  • ENI(Elastic Network Interface)와 IP 주소 관리
  • 노드의 서브넷에서 미리 IP 주소를 할당(Warm Pool)하여 Pod의 빠른 시작 지원
  • EC2 인스턴스의 네트워크 인터페이스를 관리하고 필요한 경우 추가 ENI를 할당
  • Pod가 제거되면 할당된 IP 주소를 반환하여 다시 사용할 수 있도록 관리

ipamd가 하는 역할

  1. ENI 생성 및 관리
    • AWS EC2 인스턴스에 ENI를 동적으로 추가
    • 각 ENI에는 서브넷에서 IP 주소를 할당받음
  2. Warm Pool 사용
    • 미리 IP 주소를 할당하여 Pod가 빠르게 생성되도록 지원
    • WARM_ENI_TARGET, WARM_IP_TARGET 등의 설정을 통해 최적화 가능
  3. Pod의 IP 주소 할당
    • 새로 생성된 Pod에 사전 할당된 IP를 즉시 부여하여 빠르게 실행

3. AWS VPC CNI의 동작 방식

3.1 Pod의 IP 주소 할당 과정

1️⃣ EC2 인스턴스가 시작될 때 Primary ENI가 자동 생성
2️⃣ Pod가 생성되면 ipamd가 ENI의 서브넷에서 IP 주소를 할당
3️⃣ Pod는 해당 IP를 사용하여 VPC 내부 리소스와 직접 통신 가능
4️⃣ ENI가 부족하면 ipamd가 새로운 ENI를 추가하고, IP를 사전 할당(Warm Pool 활용)

ENI를 통한 Pod IP 관리 방식

  • Primary ENI → EC2 인스턴스가 기본적으로 가지는 ENI
  • Secondary ENI → 추가적인 Pod 네트워크를 위해 ipamd가 동적으로 할당
  • IP Slot → 각 ENI에 할당 가능한 IP 개수 (인스턴스 타입별 제한 존재)

📌 Warm Pool이란?

  • Pod가 빠르게 시작할 수 있도록 미리 IP 주소를 할당하여 대기하는 기능
  • WARM_ENI_TARGET 값 설정 시, 특정 개수의 ENI와 IP를 항상 유지

4. AWS VPC CNI와 일반 Kubernetes CNI 비교


→ 네트워크 통신의 최적화(성능, 지연)를 위해서 노드와 파드의 네트워크 대역을 동일하게 설정함


→ 파드간 통신 시 일반적으로 K8S CNI는 오버레이(VXLAN, IP-IP 등) 통신을 하고, AWS VPC CNI는 동일 대역으로 직접 통신함

구분Kubernetes 기본 CNI (예: Calico)AWS VPC CNI
IP 할당 방식Overlay Network 사용 (VXLAN/IP-IP)VPC 서브넷에서 직접 할당
Pod 간 통신Overlay 네트워크를 통해 패킷 전달동일 VPC 내 직접 통신
외부 통신NAT 또는 Egress 설정 필요VPC의 네트워크 정책 그대로 적용
네트워크 성능Overlay 네트워크로 인해 약간의 지연 발생VPC 네트워크 성능 그대로 사용 가능
보안Kubernetes 네트워크 정책 사용VPC 보안 그룹 및 네트워크 ACL 사용 가능

AWS VPC CNI의 장점

  • Overlay 네트워크를 사용하지 않기 때문에 네트워크 성능이 더 뛰어남
  • Pod가 VPC 내 리소스와 직접 통신 가능
  • VPC 보안 그룹 및 네트워크 정책을 그대로 적용할 수 있어 운영 관리가 용이

5. 노드당 생성 가능한 최대 Pod 수

AWS VPC CNI를 사용할 때, 노드당 생성 가능한 최대 Pod 수는 ENI와 할당 가능한 IP 개수에 따라 결정됩니다.

📌 최대 Pod 수를 결정하는 3가지 방식

  1. Secondary IPv4 주소 방식

    • 인스턴스 유형에 따라 최대 ENI 수 + ENI당 할당 가능 IP 수 조합으로 Pod 개수 제한
  2. IPv4 Prefix Delegation

    • ENI당 /28 서브넷(Prefix) 할당 → 더 많은 Pod 배치 가능
  3. Custom Networking 사용

    • Pod에 별도의 서브넷을 부여하여 노드와 네트워크 대역을 분리

🔗 공식 문서: 노드당 Pod 수 제한 늘리기
🔗 AWS VPC CNI 플러그인으로 노드당 Pod 수 제한 늘리기

6. AWS VPC CNI 실습: 네트워크 기본 정보 확인

EKS 클러스터에서 네트워크 인터페이스 설정, Pod 및 노드의 IP 주소 할당, iptables 및 라우팅 테이블 상태 등을 점검합니다.

6.1 CNI 및 네트워크 기본 정보 확인

AWS VPC CNI는 aws-node DaemonSet을 통해 네트워크 인터페이스 및 Pod IP를 관리합니다.
먼저, 현재 클러스터에서 실행 중인 CNI 플러그인과 kube-proxy 설정을 확인합니다.

# AWS VPC CNI 플러그인 버전 확인
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

📌 출력:

현재 실행 중인 CNI 플러그인 버전이 v1.19.2임을 확인할 수 있습니다.

6.2 kube-proxy 모드 확인

Kubernetes는 기본적으로 iptables 모드를 사용하지만, IPVS 모드로 변경할 수 있습니다.

# kube-proxy 설정 확인
kubectl describe cm -n kube-system kube-proxy-config

출력 예시는 다음과 같습니다.

mode: "iptables"

📌 출력:

현재 iptables 모드가 사용되고 있습니다.

6.3 노드 및 파드 네트워크 정보 확인

각 노드와 파드가 어떤 네트워크 IP를 가지고 있는지 확인합니다.

# 노드(EC2 인스턴스) IP 확인
aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,PrivateIPAdd:PrivateIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output table
# 파드(Pod) IP 확인
kubectl get pod -n kube-system -o=custom-columns=NAME:.metadata.name,IP:.status.podIP,STATUS:.status.phase

각 Pod가 VPC 서브넷의 IP 대역을 직접 사용하고 있는 것을 확인할 수 있습니다.

# 전체 파드 이름 확인
kubectl get pod -A -o name
# 전체 파드 개수 확인
kubectl get pod -A -o name | wc -l

📌 출력:

현재 10개의 Pod가 실행 중임을 확인할 수 있습니다.

6.4 노드에서 네트워크 설정 확인

각 노드(EC2 인스턴스)에서 네트워크 구성을 확인합니다.

6.4.1 AWS VPC CNI 관련 로그 확인

AWS VPC CNI는 /var/log/aws-routed-eni/ 디렉터리에 네트워크 로그를 저장합니다.
이를 통해 CNI 플러그인이 ENI를 어떻게 관리하는지 확인할 수 있습니다.

# 각 노드에서 AWS VPC CNI 관련 로그 파일 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i tree /var/log/aws-routed-eni; echo; done

출력 예시는 다음과 같습니다.

/var/log/aws-routed-eni/
├── plugin.log
├── ipamd.log
├── egress-v6-plugin.log
├── ebpf-sdk.log
└── network-policy-agent.log
# ipamd 로그 확인 (ENI 및 IP 관리 로그)
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/ipamd.log | jq
# eBPF 관련 로그 확인
ssh ec2-user@$N1 sudo cat /var/log/aws-routed-eni/ebpf-sdk.log | jq

출력 예시는 다음과 같습니다.

{
  "log_level": "info",
  "message": "Allocating new ENI",
  "eni_id": "eni-0a1b2c3d4e5f67890",
  "instance_id": "i-0abcd1234ef567890"
}

ipamd가 새로운 ENI를 할당하는 과정이 기록되었습니다.

6.4.2 네트워크 인터페이스 및 라우팅 테이블 확인

# 각 노드에서 네트워크 인터페이스 확인 (IP 할당 상태 확인)
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -br -c addr; echo; done

출력 예시는 다음과 같습니다.

lo               UNKNOWN        127.0.0.1/8 ::1/128 
eth0             UP             192.168.1.186/24 
eni0             UP             192.168.2.42/24 
eni1             UP             192.168.3.21/24 

Pod가 ENI를 통해 직접 IP를 할당받고 있음을 확인할 수 있습니다.

# 각 노드의 라우팅 테이블 확인
for i in $N1 $N2 $N3; do echo ">> node $i <<"; ssh ec2-user@$i sudo ip -c route; echo; done

출력 예시는 다음과 같습니다.

default via 192.168.1.1 dev eth0 
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.186 
192.168.2.0/24 dev eni0 proto kernel scope link src 192.168.2.42 
192.168.3.0/24 dev eni1 proto kernel scope link src 192.168.3.21 

Pod 네트워크가 ENI를 통해 직접 라우팅되는 방식임을 확인할 수 있습니다.

# iptables NAT 테이블 확인
ssh ec2-user@$N1 sudo iptables -t nat -S
# NAT 테이블의 상세 정보 확인
ssh ec2-user@$N1 sudo iptables -t nat -L -n -v

출력 예시는 다음과 같습니다.

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  123  1024 MASQUERADE  all  --  *      eth0    192.168.2.0/24       0.0.0.0/0

Pod의 네트워크 트래픽이 ENI를 통해 외부로 라우팅됨을 확인할 수 있습니다.

0개의 댓글