The VPC CNI gives each Pod a real address from its node's ENIs
The Amazon VPC CNI runs as a DaemonSet (aws-node) on every node. It attaches elastic network interfaces to the instance and keeps a pool of warm secondary IP addresses on them. When the kubelet starts a Pod, the CNI assigns one of those addresses to the Pod's network namespace. The Pod therefore has a real, routable VPC address, with no overlay or NAT in the way. Reveal the steps with the right arrow.
The number of ENIs and the number of IPs per ENI depend on the instance type, which is why Pod capacity differs. The formula shown (ENIs times IPs per ENI minus one, plus two) gives 29 Pods for an m5.large. In practice you often hit this limit before CPU or memory on small instance types, and EKS sets maxPods accordingly.
The upside of real VPC IPs is operational simplicity: security groups, flow logs, routing tables and AWS services can all see Pods directly, and on-premises systems connected over Direct Connect or VPN can reach them. The downside is that your subnets must be large enough, and that IP consumption scales with Pods rather than nodes. The next slide covers the standard fixes.
Comparison note: GKE VPC-native clusters assign Pod IPs from a secondary alias range that you size per cluster. Overlay CNIs can hide Pod IPs inside the cluster, trading VPC visibility for simplicity of IP planning.