EKS에서 Cilium 설치 모드 3가지 비교: ENI vs CNI Chaining vs BYOCNI(Overlay)

목차

개요

EKS에서 Cilium을 “어떤 방식으로” 설치할지는 사실상 Pod IP를 누가/어떻게 할당하고(VPC ENI vs 오버레이), VPC가 Pod IP를 직접 라우팅할 수 있는지(Direct routing vs Encapsulation), 그리고 AWS 기본 애드온(AWS VPC CNI, kube-proxy)을 얼마나 유지할지를 결정하는 문제입니다.

이 글에서는 아래 3개 자료가 각각 어떤 글인지, 어떤 구조로 작업하는지, 구성 차이와 장단점은 무엇인지 정리합니다.

출처 성격 핵심 주제
https://cilium.io/blog/2025/06/19/eks-eni-install/ 블로그(튜토리얼) EKS에 ENI 모드로 Cilium 설치(= AWS VPC CNI 대체 + kube-proxy replacement)
https://cilium.io/blog/2025/07/08/byonci-overlay-install/ 블로그(튜토리얼, 시리즈 2편) EKS에 CNI chaining 모드와 BYOCNI(overlay) 모드로 Cilium 설치
https://docs.cilium.io/en/stable/installation/cni-chaining-aws-cni/ 공식 문서(레퍼런스) AWS VPC CNI + Cilium 체이닝(하이브리드)의 전제/주의점/검증 절차

작성/검증 기준: 위 문서/블로그의 서술을 “그대로 재현 가능한가?”, “운영에서 어떤 제약이 생기는가?” 관점으로 비교합니다. (버전/기본값은 시간에 따라 바뀔 수 있으니, 실제 적용 전에는 반드시 최신 문서의 Helm 값과 EKS 애드온 상태를 확인하세요.)


TL;DR (결론)


선 설명

  • CNI 호출 순서
  • Pod IP 할당(IPAM) 책임. 체이닝은 ENI 디바이스 구성도 같은 선
  • eBPF 부착
  • 라우팅·캡슐레이션

ENI 모드

ENI 모드: 누가 무엇을 맡는가Kubelet이 Cilium CNI를 호출하고, Cilium ENI IPAM이 Pod에 ENI 기반 VPC IP를 할당한다. AWS VPC ENI로 VPC가 직접 라우팅하고 캡슐레이션은 필요 없다. AWS VPC CNI는 제거하거나 비활성화한다.CNI 호출Pod IP 할당Cilium 역할라우팅AWS VPC CNIKubeletCilium CNICilium agentCNI 호출CiliumENI IPAMPodENI 기반 VPC IPPod IP할당Cilium이 ENI/IPAM까지 담당AWS VPC ENIVPC 라우팅직접라우팅캡슐레이션 필요 없음제거/비활성화
  • AWS VPC CNI(aws-node) 제거/비활성화
  • 블로그 예시는 kube-proxy 대체(kubeProxyReplacement=true) 사용

CNI chaining 모드

CNI chaining 모드: 누가 무엇을 맡는가Kubelet이 첫 CNI로 AWS VPC CNI, 다음 CNI로 Cilium을 호출한다. AWS VPC CNI가 ENI 디바이스 구성과 IPAM을 맡고, Cilium agent는 그 Pod netdev에 eBPF를 부착한다. Pod IP는 ENI 기반이라 VPC 네이티브 라우팅이다. AWS VPC CNI는 유지한다.CNI 호출Pod IP 할당Cilium 역할라우팅AWS VPC CNIKubeletAWS VPC CNI첫 CNI(aws-node)Cilium CNI다음 CNI(agent)AWS VPC CNIENI IPAMPod netdevENI 기반 Pod IP디바이스구성·IPAMCilium agentPod netdeveBPF부착Pod IP는 ENI 기반VPC 네이티브 라우팅캡슐레이션 필요 없음유지
  • 기존 Pod 재시작 필요(공식 문서에 명시)
  • L7 Policy·IPsec Transparent Encryption 등 일부 기능 제한 가능

BYOCNI(Overlay) 모드

BYOCNI(Overlay) 모드: 누가 무엇을 맡는가Kubelet이 Cilium CNI를 호출하고, Cilium 클러스터 IP 풀이 overlay Pod IP를 할당한다. 노드 간 트래픽은 VXLAN 또는 Geneve 터널로 캡슐레이션되고 VPC는 노드 IP를 라우팅한다. AWS VPC CNI는 사용하지 않는다.CNI 호출Pod IP 할당Cilium 역할라우팅AWS VPC CNIKubeletCilium CNICilium agentCNI 호출Cilium클러스터 IP 풀Pod IPoverlayPod IP할당Cilium이 오버레이로 Pod 네트워크 구성VXLAN 또는Geneve 터널캡슐레이션VPC노드 IP 라우팅노드 IP라우팅Pod IP 직접 라우팅 아님제거/미사용
  • MTU·캡슐레이션 오버헤드·트러블슈팅 부담
  • kube-proxy 대체는 설계에 따라 가능
세 모드의 같은 행을 맞춰 Pod IP 할당, Cilium 역할, 라우팅, AWS VPC CNI의 처리를 비교한다. ENI와 체이닝은 Pod가 계속 VPC IP를 써서 주소 고갈이 남을 수 있고(Prefix Delegation도 서브넷 주소 부족을 없애지 않음), Overlay는 VXLAN/Geneve로 Pod 대역을 따로 쓴다.
그림 관계를 글로 읽기
  1. CNI 호출: 세 모드 모두 Kubelet이 CNI를 호출한다. 체이닝은 AWS VPC CNI가 첫 CNI, Cilium이 다음 CNI다.
  2. Pod IP 할당: ENI는 Cilium ENI IPAM, 체이닝은 AWS VPC CNI(ENI IPAM), Overlay는 Cilium 클러스터 IP 풀이 맡는다.
  3. Cilium 역할: ENI는 ENI/IPAM까지 담당, 체이닝은 AWS VPC CNI가 만든 디바이스에 eBPF 부착, Overlay는 오버레이로 Pod 네트워크를 구성한다.
  4. 라우팅: ENI와 체이닝은 VPC가 Pod IP를 직접 라우팅하고 캡슐레이션이 필요 없다. Overlay는 VXLAN 또는 Geneve로 캡슐레이션하고 VPC는 노드 IP를 라우팅한다.
  5. AWS VPC CNI: ENI는 제거/비활성화, 체이닝은 유지, Overlay는 제거/미사용이다.

1) 각 글은 “무슨 글”인가?

(1) eks-eni-install: “EKS에서 Cilium ENI 모드 설치” 튜토리얼

이 글은 EKS에서 Cilium을 ENI 모드로 설치하는 과정을 보여줍니다.

글에서 “기본 애드온 비활성화로 클러스터+노드그룹을 한 번에 만들 수 없다”는 제약을 언급합니다. 이는 eksctl/EKS의 지원 범위가 변할 수 있는 부분이므로, 실제 적용 시점의 eksctl 문서를 확인하는 것이 안전합니다.

(2) byonci-overlay-install: “chaining vs overlay(BYOCNI)” 비교/설치 튜토리얼

이 글은 시리즈 2편으로, 설치 모드를 2개 더 다룹니다.

  1. CNI chaining 모드
  1. BYOCNI(Overlay) 모드

(3) cni-chaining-aws-cni: “체이닝 모드”에 대한 공식 레퍼런스

공식 문서는 “AWS VPC CNI + Cilium” 조합을 명확한 책임 분리로 정의합니다.

또한 운영에서 놓치기 쉬운 포인트를 강조합니다.


2) 각 구성의 “작업 구조(구성요소/흐름)”는 어떻게 다른가?

핵심은 Pod 생성 시점에 어떤 CNI가 먼저 실행되고, 누가 IP를 책임지는지입니다.

(A) ENI 모드: “Cilium이 ENI/IPAM까지 담당”

도식 1ENI 모드: Kubelet이 부른 Cilium CNI와 Cilium agent가 Pod netdev를 만들고 AWS VPC ENI를 다뤄, Pod 트래픽이 VPC 라우팅으로 나간다.KubeletCilium CNICilium agentPod netdevPodAWS VPC ENIVPC routing
ENI 모드: Kubelet이 부른 Cilium CNI와 Cilium agent가 Pod netdev를 만들고 AWS VPC ENI를 다뤄, Pod 트래픽이 VPC 라우팅으로 나간다.

(B) CNI chaining 모드: “AWS VPC CNI가 IPAM, Cilium이 eBPF”

도식 2CNI Chaining: Kubelet이 AWS VPC CNI(aws-node)로 ENI를 받고, 이어서 Cilium CNI와 agent가 Pod netdev를 맡는다.KubeletAWS VPC CNI aws nodeAWS VPC ENICilium CNICilium agentPod netdevPod
CNI Chaining: Kubelet이 AWS VPC CNI(aws-node)로 ENI를 받고, 이어서 Cilium CNI와 agent가 Pod netdev를 맡는다.

(C) BYOCNI(Overlay) 모드: “Cilium이 오버레이로 Pod 네트워크 구성”

도식 3Overlay: Cilium이 Pod IP를 오버레이로 주고 vxlan 또는 geneve 터널로 감싸며, VPC는 노드 IP 경로만 안다.KubeletCilium CNICilium agentPod IP overlayTunnel vxlan or geneveVPC routes node IPs
Overlay: Cilium이 Pod IP를 오버레이로 주고 vxlan 또는 geneve 터널로 감싸며, VPC는 노드 IP 경로만 안다.

3) 구성별 차이점 요약(결정 포인트)

한눈에 비교표

구분 ENI 모드 CNI chaining 모드 BYOCNI(Overlay) 모드
IPAM 주체 Cilium(ENI IPAM) AWS VPC CNI(ENI IPAM) Cilium(클러스터 IP 풀)
Pod IP가 VPC에서 직접 라우팅? 예 예 아니오(대개 캡슐레이션)
AWS VPC CNI(aws-node) 제거/비활성화 유지 제거/미사용
캡슐레이션 필요 없음 필요 없음 필요(보통 VXLAN/Geneve)
kube-proxy-free(대체) 예(블로그는 사용) 가능하나 설계에 따라 다름 가능(설계에 따라)
“기존 Pod 재시작” 중요도 중 높음(공식 문서에 명시) 중
운영 복잡도 중(대체) 중~상(2개 CNI 공존) 상(MTU/터널/디버깅)

4) 장단점 분석(운영 관점)

ENI 모드

장점

단점/주의점

CNI chaining 모드

장점

단점/주의점

BYOCNI(Overlay) 모드

장점

단점/주의점


5) “나는 무엇을 선택해야 하나?” (실전 선택 가이드)


5.1) “Pod IP 부족”이 출발점이라면 (오해 방지)

많은 팀이 Cilium을 검토하는 계기가 “Pod가 사용할 수 있는 IP 수가 금방 찬다”인데, 이때는 먼저 아래를 정리하는 게 좋습니다.

그리고 결론은 꽤 단순합니다.


5.2) AWS 네이티브 연동 관점에서의 트레이드오프

Pod IP 부족을 해결하려고 네트워킹 구성을 바꾸면, “VPC가 Pod IP를 직접 라우팅/관찰할 수 있느냐”가 AWS 네이티브 기능 사용성에 큰 영향을 줍니다.

CNI chaining (AWS VPC CNI 유지)

Cilium ENI 모드 (AWS VPC CNI 대체)

Overlay(BYOCNI)


5.3) IP 부족일 때 “먼저” 보는 AWS 네이티브 해법(체크리스트)

Overlay로 가기 전에, 아래는 EKS에서 실제로 가장 자주 쓰는 해결책입니다.

(1) AWS VPC CNI Prefix Delegation

노드당 Pod 수가 “ENI/IP 한도”에 의해 막히는 경우, Prefix Delegation이 체감 효과가 큰 편입니다(단, 서브넷 CIDR이 너무 작으면 결국 전체 주소가 먼저 고갈됩니다).

예시(개념): aws-node에 Prefix Delegation 관련 env를 설정

bash
kubectl -n kube-system set env ds/aws-node \
  ENABLE_PREFIX_DELEGATION=true \
  WARM_PREFIX_TARGET=1

(2) 서브넷 CIDR 확장/추가(주소계획)

VPC 전체 주소가 부족해지는 형태라면, CNI를 바꿔도 결국 한계가 오기 때문에 서브넷 CIDR 확장/추가가 더 정공법입니다.

(3) 노드 인스턴스 타입/노드 수 전략

인스턴스 타입별 ENI/IP 한도가 다르므로, IP 병목이 “노드 단위”라면 인스턴스 타입 변경/노드 확장이 가장 간단하게 풀릴 때가 많습니다.

(4) (가능하다면) IPv6/듀얼스택 검토

조직/서비스 제약이 허용한다면 IPv6는 주소 고갈 문제를 구조적으로 완화할 수 있습니다(다만 생태계/연동 요구사항 검토가 필요).


6) 재현 가능한 체크리스트(공통)

(1) 클러스터 애드온 상태 확인

bash
kubectl get ds -n kube-system
kubectl get pods -n kube-system

(2) API Server Host/Port 확인 (블로그 공통 흐름)

bash
kubectl cluster-info

ENI 모드 블로그는 k8sServiceHost에 넣을 때 https://를 제거하라고 명시합니다.

(3) 설치 검증

bash
cilium status --wait
cilium connectivity test

(4) 체이닝 모드라면 “기존 Pod 재시작”을 계획에 포함

공식 문서에 따르면, 체이닝 구성은 이미 떠있는 Pod에 자동 적용되지 않습니다. 유지보수 윈도우(롤링 재시작 계획)를 반드시 포함하세요.


마무리

세 가지 문서는 사실상 같은 주제를 다른 “깊이”로 다룹니다.

정리하면 성능/단순성/정석을 원하면 ENI, 점진 도입이면 chaining, ENI IP 한계 회피가 목적이면 overlay(BYOCNI)입니다. 다만 어떤 선택이든, “클러스터 생성 단계의 애드온 상태(aws-node/kube-proxy)”와 “Pod 재시작/검증 루틴”을 계획에 넣는 것이 운영 성공률을 크게 올립니다.

도식

100%

끌어서 이동, 두 손가락이나 휠로 확대·축소. 키보드: 화살표 이동, + − 확대·축소, 0 맞춤, Esc 닫기. 같은 내용은 그림 아래 “그림 관계를 글로 읽기”에 있다.