이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.
K8S CNI(Container Network Interface)는 Kubernetes에서 네트워크 환경을 구성하는 플러그인 시스템입니다.
이를 통해 Kubernetes 클러스터 내에서 Pod 간 통신을 처리하고, IP 주소를 할당할 수 있습니다.
🔗 공식 문서: Kubernetes 네트워크 개념
🔗 공식 문서: Kubernetes 네트워크 플러그인 목록
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의 주요 기능
AWS VPC CNI는 Kubernetes에서 Pod 네트워크를 자동으로 설정하며, 다음 두 가지 주요 컴포넌트로 구성됩니다.
✅ ipamd가 하는 역할
1️⃣ EC2 인스턴스가 시작될 때 Primary ENI가 자동 생성
2️⃣ Pod가 생성되면 ipamd가 ENI의 서브넷에서 IP 주소를 할당
3️⃣ Pod는 해당 IP를 사용하여 VPC 내부 리소스와 직접 통신 가능
4️⃣ ENI가 부족하면 ipamd가 새로운 ENI를 추가하고, IP를 사전 할당(Warm Pool 활용)
✅ ENI를 통한 Pod IP 관리 방식
📌 Warm Pool이란?

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

→ 파드간 통신 시 일반적으로 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의 장점
AWS VPC CNI를 사용할 때, 노드당 생성 가능한 최대 Pod 수는 ENI와 할당 가능한 IP 개수에 따라 결정됩니다.
📌 최대 Pod 수를 결정하는 3가지 방식
Secondary IPv4 주소 방식
IPv4 Prefix Delegation

Custom Networking 사용

🔗 공식 문서: 노드당 Pod 수 제한 늘리기
🔗 AWS VPC CNI 플러그인으로 노드당 Pod 수 제한 늘리기
EKS 클러스터에서 네트워크 인터페이스 설정, Pod 및 노드의 IP 주소 할당, iptables 및 라우팅 테이블 상태 등을 점검합니다.
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임을 확인할 수 있습니다.
Kubernetes는 기본적으로 iptables 모드를 사용하지만, IPVS 모드로 변경할 수 있습니다.
# kube-proxy 설정 확인
kubectl describe cm -n kube-system kube-proxy-config
출력 예시는 다음과 같습니다.
mode: "iptables"
📌 출력:

현재 iptables 모드가 사용되고 있습니다.
각 노드와 파드가 어떤 네트워크 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가 실행 중임을 확인할 수 있습니다.
각 노드(EC2 인스턴스)에서 네트워크 구성을 확인합니다.
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를 할당하는 과정이 기록되었습니다.
# 각 노드에서 네트워크 인터페이스 확인 (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를 통해 외부로 라우팅됨을 확인할 수 있습니다.