Overview
Choosing how to install Cilium on EKS effectively means deciding who assigns Pod IPs and how (VPC ENI vs overlay), whether the VPC can route Pod IPs directly (Direct routing vs Encapsulation), and to what extent to retain the default AWS add-ons (AWS VPC CNI, kube-proxy).
This post reviews the following 3 sources: what each covers, how each setup works, and the differences, advantages, and disadvantages of the configurations.
| Source | Type | Main Topic |
|---|---|---|
| https://cilium.io/blog/2025/06/19/eks-eni-install/ | Blog (tutorial) | Install Cilium on EKS in ENI mode (= replace AWS VPC CNI + kube-proxy replacement) |
| https://cilium.io/blog/2025/07/08/byonci-overlay-install/ | Blog (tutorial, part 2 of a series) | Install Cilium on EKS in CNI chaining mode and BYOCNI(overlay) mode |
| https://docs.cilium.io/en/stable/installation/cni-chaining-aws-cni/ | Official documentation (reference) | Prerequisites, precautions, and validation steps for AWS VPC CNI + Cilium chaining (hybrid) |
Writing/validation criteria: Compare the documents and blogs from the perspectives of "Can the instructions be reproduced as written?" and "What operational constraints arise?" (Versions/defaults can change over time, so always check the latest documented Helm values and EKS add-on status before applying a configuration.)
TL;DR (Conclusion)
- ENI mode (recommended/direct approach): Remove AWS VPC CNI and let Cilium handle ENI/IPAM. It is a good path to VPC-native routing + kube-proxy-free operation in one step, but requires substantial changes to AWS permissions and operations.
- CNI chaining mode (practical compromise): Retain AWS VPC CNI and chain Cilium as a "second CNI" to add eBPF policies/LB/encryption and other features. It is relatively easy to apply to existing clusters, but introduces the operational complexity of two coexisting CNIs.
- BYOCNI(Overlay) mode (avoiding ENI IP limits): Without AWS VPC CNI, Cilium builds the Pod network using an overlay (VXLAN/Geneve). It removes ENI-based IP constraints, but increases encapsulation overhead, MTU concerns, and troubleshooting difficulty.
ENI 모드
- AWS VPC CNI(aws-node) 제거/비활성화
- 블로그 예시는 kube-proxy 대체(kubeProxyReplacement=true) 사용
CNI chaining 모드
- 기존 Pod 재시작 필요(공식 문서에 명시)
- L7 Policy·IPsec Transparent Encryption 등 일부 기능 제한 가능
BYOCNI(Overlay) 모드
- MTU·캡슐레이션 오버헤드·트러블슈팅 부담
- kube-proxy 대체는 설계에 따라 가능
Read the diagram as text
- CNI 호출: 세 모드 모두 Kubelet이 CNI를 호출한다. 체이닝은 AWS VPC CNI가 첫 CNI, Cilium이 다음 CNI다.
- Pod IP 할당: ENI는 Cilium ENI IPAM, 체이닝은 AWS VPC CNI(ENI IPAM), Overlay는 Cilium 클러스터 IP 풀이 맡는다.
- Cilium 역할: ENI는 ENI/IPAM까지 담당, 체이닝은 AWS VPC CNI가 만든 디바이스에 eBPF 부착, Overlay는 오버레이로 Pod 네트워크를 구성한다.
- 라우팅: ENI와 체이닝은 VPC가 Pod IP를 직접 라우팅하고 캡슐레이션이 필요 없다. Overlay는 VXLAN 또는 Geneve로 캡슐레이션하고 VPC는 노드 IP를 라우팅한다.
- AWS VPC CNI: ENI는 제거/비활성화, 체이닝은 유지, Overlay는 제거/미사용이다.
1) What Does Each Source Cover?
(1) eks-eni-install: A Tutorial on Installing Cilium in ENI Mode on EKS
This post walks through installing Cilium in ENI mode on EKS.
- Main approach
- Create the cluster with
addonsConfig.disableDefaultAddons: true, disabling the default networking add-ons (AWS VPC CNI, kube-proxy) - When installing Cilium with Helm, enable
eni.enabled=true,ipam.mode=eni,routingMode=native,kubeProxyReplacement=true, and other options.
- Create the cluster with
- Overall workflow
- Create the EKS cluster (default add-ons disabled) → 2) Install Cilium (ENI/IPAM + kube-proxy replacement) → 3) Create the node group → 4) Validate with
cilium statusandcilium connectivity test
- Create the EKS cluster (default add-ons disabled) → 2) Install Cilium (ENI/IPAM + kube-proxy replacement) → 3) Create the node group → 4) Validate with
The post notes a limitation: the cluster and node group cannot be created together when default add-ons are disabled. Since this depends on the evolving support in
eksctl/EKS, checking theeksctldocumentation at the time of implementation is prudent.
(2) byonci-overlay-install: A Comparison/Installation Tutorial for Chaining vs Overlay(BYOCNI)
Part 2 of the series covers 2 additional installation modes.
- CNI chaining mode
- Disable default add-ons when creating the cluster, but in
addons:explicitly includevpc-cnito install AWS VPC CNI. - Install Cilium with
cni.chainingMode=aws-cni,cni.exclusive=false,routingMode=native, and other options.
- BYOCNI(Overlay) mode
- Without including AWS VPC CNI (= effectively BYOCNI), Cilium builds an overlay network.
- The key point is escaping AWS ENI-based Pod IP limits, such as the number of IPs assignable per node.
(3) cni-chaining-aws-cni: The Official Reference for Chaining Mode
The official documentation defines clear responsibilities for the AWS VPC CNI + Cilium combination.
- AWS VPC CNI: ENI-based device configuration + IPAM
- Cilium: Attach eBPF to those devices (policies/LB/encryption, etc.)
It also highlights operational details that are easy to miss.
- AWS VPC CNI plugin version requirements (for example,
v1.11.2or later) - Existing Pods must be restarted (chaining is not applied automatically to running Pods)
- (Advanced) How to integrate EKS Security Groups for Pods (Pod ENI)
2) How Do the Components and Workflow Differ?
The key is which CNI runs first when a Pod is created, and which component is responsible for its IP.
(A) ENI Mode: Cilium Handles ENI/IPAM Too
- AWS VPC CNI (
aws-node) is removed/disabled. - Pod IPs come from ENIs (= directly routable in the VPC), so overlay encapsulation is unnecessary.
- The blog example also disables kube-proxy and enables
kubeProxyReplacement=true.
(B) CNI Chaining Mode: AWS VPC CNI Handles IPAM, Cilium Handles eBPF
- Pod IPs are still ENI-based and use VPC-native routing.
- The key operational difference is that there are 2 CNIs (aws-node + cilium).
- This also explains why the official documentation requires restarting existing Pods: the chaining step has not been applied to already-created network devices.
(C) BYOCNI(Overlay) Mode: Cilium Builds the Pod Network with an Overlay
- Rather than making Pod IPs directly routable in the VPC, traffic between nodes is encapsulated.
- The aim is to escape VPC-native constraints such as ENI IP limits and address planning.
- In return, operations must handle MTU, overhead, and network visibility issues.
3) Configuration Differences (Decision Points)
Comparison at a Glance
| Category | ENI Mode | CNI Chaining Mode | BYOCNI(Overlay) Mode |
|---|---|---|---|
| IPAM provider | Cilium (ENI IPAM) | AWS VPC CNI (ENI IPAM) | Cilium (cluster IP pool) |
| Pod IPs directly routable in the VPC? | Yes | Yes | No (usually encapsulated) |
AWS VPC CNI (aws-node) |
Removed/disabled | Retained | Removed/unused |
| Encapsulation | Not needed | Not needed | Required (usually VXLAN/Geneve) |
| kube-proxy-free (replacement) | Yes (used in the blog) | Possible, depending on design | Possible (depending on design) |
| Importance of restarting existing Pods | Medium | High (explicitly stated in official docs) | Medium |
| Operational complexity | Medium (replacement) | Medium–high (2 coexisting CNIs) | High (MTU/tunnels/debugging) |
4) Advantages and Disadvantages (Operational Perspective)
ENI Mode
Advantages
- VPC-native Pod IPs (no overlay/encapsulation needed) → Benefits for performance/simplicity
- A natural path to kube-proxy-free operation with
kubeProxyReplacement=true - Works well with EKS's ability to create clusters without default add-ons (the workflow used in the blog)
Disadvantages/precautions
- Replacing AWS VPC CNI means substantial operational changes (existing standards, runbooks, and troubleshooting processes change)
- Correct Helm values are important:
- When setting
k8sServiceHost, the blog explicitly warns to removehttps://(an incorrect value crashes the agent) - Before copying the blog's
egressMasqueradeInterfaces=eth+example, check the node interface names (for example,eth0orens5)
- When setting
CNI Chaining Mode
Advantages
- Makes it easier to introduce Cilium policies/observability/features gradually while retaining AWS VPC CNI
- Official documentation gives relatively clear prerequisites, validation steps, and upgrade considerations
- (Advanced) A guide is available for integrating EKS Security Groups for Pods
Disadvantages/precautions
- Having 2 CNIs means 2 times as many failure/debugging paths (it becomes harder to trace which component changed packets and where)
- As the official documentation states, restarting existing Pods is effectively required to apply chaining
- aws-node has version requirements (the documentation recommends
v1.11.2+) - The official documentation mentions the label
vps.amazonaws.com/has-trunk-attached, but its command example usesvpc.amazonaws.com/has-trunk-attached. In practice,vpc.amazonaws.com/has-trunk-attachedis common, so check the actual label key in your cluster when applying this.
BYOCNI(Overlay) Mode
Advantages
- Relatively free from ENI-based Pod IP limits, including assignable IPs per node and address planning
- Network design may become simpler because the VPC does not need to route Pod IPs directly (but tunnels are introduced instead)
Disadvantages/precautions
- Encapsulation overhead + MTU issues increase performance concerns and potential failure points
- Security group, network policy, and observability (Flow) issues shift from VPC routing problems to tunnel/MTU/path problems, broadening the problem space
5) Which Should I Choose? (A Practical Guide)
- A new EKS cluster, a desire for standardization, and consideration of kube-proxy-free operation → ENI mode is the 1st candidate
- An existing EKS cluster where you want to retain AWS VPC CNI and first introduce Cilium policies/observability → CNI chaining mode is practical
- Many Pods per node (ENI IPs are the bottleneck), with VPC address planning/ENI limits repeatedly causing problems → Consider BYOCNI(Overlay), while preparing to handle MTU and overlay operating costs
5.1) If Pod IP Exhaustion Is the Starting Point (Avoiding Misunderstandings)
Many teams consider Cilium because available Pod IPs run out quickly. First, clarify the following.
- What is causing the IP shortage?
- (1) Are Pods per node limited by the node instance type's ENI/IP limits?
- (2) Is the subnet CIDR itself too small, exhausting addresses across the VPC?
The conclusion is fairly simple.
- Even if you replace the CNI with Cilium in ENI mode or chain it with AWS VPC CNI, VPC IP exhaustion may not be fundamentally resolved if Pods still use VPC-routable IPs (ENI-based IPs).
- If the issue is the per-node ENI/IP limit, AWS-native tuning such as changing instance types, adding nodes, or Prefix Delegation is often a more direct solution.
- Options that truly move away from VPC IP exhaustion generally use Pod IPs outside the VPC (an overlay IP pool), such as Overlay(BYOCNI), but introduce trade-offs with AWS-native integration.
5.2) Trade-offs for AWS-Native Integration
When changing networking to resolve Pod IP exhaustion, whether the VPC can route/observe Pod IPs directly has a major impact on the usability of AWS-native features.
CNI Chaining (Retain AWS VPC CNI)
- Advantage: AWS VPC CNI continues to handle ENI/IPAM, offering the strongest continuity with existing EKS operations/integrations.
- Disadvantage: Pods continue consuming VPC IPs, so the IP exhaustion problem is likely to remain.
Cilium ENI Mode (Replace AWS VPC CNI)
- Advantage: Uses a model where Pod IPs are directly routable in the VPC (ENI-based), making the network model relatively simple compared with an overlay.
- Disadvantage: Operational/tuning practices that depend on aws-node (AWS VPC CNI), such as aws-node parameters and runbooks, may need to be redefined. Before adoption, list and review the features your organization expects from aws-node.
Overlay(BYOCNI)
- Advantage: The most direct option for escaping VPC IP exhaustion, depending on the design.
- Disadvantage: Because Pod IPs are not directly routable in the VPC, configurations assuming VPC-reachable/routable Pod IPs may be constrained, such as:
- AWS Load Balancer Controller designs based on
target-type: ip(requiring direct VPC access to Pod IPs) - Approaches that provided straightforward Pod-level network visibility/troubleshooting through VPC Flow Logs/security groups/NACLs
- More failure points caused by MTU/encapsulation issues
- AWS Load Balancer Controller designs based on
5.3) AWS-Native Solutions to Check First for IP Shortages (Checklist)
Before moving to an overlay, these are among the most commonly used solutions on EKS.
(1) AWS VPC CNI Prefix Delegation
If the Pod count per node is restricted by ENI/IP limits, Prefix Delegation often makes a noticeable difference. However, if the subnet CIDR is too small, the overall address space will still run out first.
Conceptual example: Set Prefix Delegation environment variables on aws-node
kubectl -n kube-system set env ds/aws-node \
ENABLE_PREFIX_DELEGATION=true \
WARM_PREFIX_TARGET=1
(2) Expand/Add Subnet CIDRs (Address Planning)
If the entire VPC is running short of addresses, changing the CNI eventually reaches the same limit, so expanding/adding subnet CIDRs is the more direct approach.
(3) Node Instance Type/Node Count Strategy
Since ENI/IP limits vary by instance type, changing instance types or adding nodes is often the simplest solution when the IP bottleneck is per node.
(4) Consider IPv6/Dual Stack (If Feasible)
If organizational/service constraints allow it, IPv6 can structurally alleviate address exhaustion. However, ecosystem and integration requirements need review.
6) Reproducible Checklist (Common Steps)
(1) Check Cluster Add-on Status
kubectl get ds -n kube-system
kubectl get pods -n kube-system
(2) Check API Server Host/Port (Common Blog Workflow)
kubectl cluster-info
When setting
k8sServiceHost, the ENI mode blog explicitly says to removehttps://.
(3) Validate the Installation
cilium status --wait
cilium connectivity test
(4) For Chaining Mode, Plan to Restart Existing Pods
According to the official documentation, chaining is not applied automatically to running Pods. Include a maintenance window (rolling restart plan).
Closing Notes
The three sources cover essentially the same topic at different depths.
- The 2 blogs focus on the steps needed to complete an EKS installation (a series)
- The official documentation focuses on operational constraints and validation points for chaining mode (a reference)
Choose ENI for performance/simplicity/a conventional approach, chaining for gradual adoption, and overlay(BYOCNI) for avoiding ENI IP limits. Whatever you choose, planning for the cluster's add-on state at creation (aws-node/kube-proxy), Pod restarts, and validation routines greatly improves the chances of operational success.