Skip to main content

Why Kubernetes Fundamentals Still Matter on EKS

·717 words·4 mins ✨ AI-Assisted
FTC Disclosure: As an Amazon Associate, I earn from qualifying purchases. Some links on this site are affiliate links.
Ben Piper
Author
Ben Piper
Wiley bestselling author — 100k+ copies, AWS Solutions Architect Associate (SAA) & Cloud Practitioner (CLF) bestsellers, 7+ books. 45 Pluralsight courses (4.7-star, 3,003 ratings). 10+ yrs 100% remote, solo CCNP ENCOR.

AWS manages the EKS control plane: the etcd cluster, API server, scheduler, and controller manager. It patches and replaces unhealthy control-plane nodes, scales the control plane, and runs it for high availability across Availability Zones. None of that stops a Deployment from getting stuck at 3 of 5 replicas at 2 a.m. while an on-call engineer stares at a dashboard with no idea what to do next.

EKS removes one category of operational toil: operating the Kubernetes control plane. It does not remove the need to understand how Kubernetes schedules workloads, routes traffic, or applies resource requests and limits.

What EKS manages—and what it doesn’t
#

AWS runs and secures the EKS control plane. You do not SSH into control-plane nodes, operate etcd yourself, or debug a split-brain failure in the cluster’s key-value store.

Your workloads still run on the data plane. In a conventional EKS setup, that includes your worker nodes, Pods, workload configuration, node groups, VPC and CNI configuration, and IAM setup for workloads. AWS supplies and operates underlying cloud infrastructure, but you remain responsible for defining, configuring, observing, and troubleshooting your applications and their Kubernetes resources. The precise boundary changes if you use options such as EKS Auto Mode, Fargate, or AWS-managed add-ons.

A stuck Deployment still needs Kubernetes knowledge
#

Suppose a Deployment update stalls at 3 of 5 replicas. The first move is the same on EKS, GKE, or a self-managed cluster:

kubectl describe pod <pod-name> -n <namespace>

The Events section might show:

0/5 nodes are available: 5 Insufficient cpu.

That means the scheduler cannot find a node with enough requested CPU for the Pod. Kubernetes schedules based on declared resource requests, not on whether a dashboard suggests that current CPU usage is low. AWS cannot infer your intended capacity or rewrite your Pod specifications for you.

A rollout can also stall because replacement Pods never become Ready, images cannot be pulled, an admission policy rejects a Pod, a quota is exhausted, or the Deployment’s maxUnavailable and maxSurge settings constrain progress.

A PodDisruptionBudget is different: it primarily limits voluntary evictions, such as those used when draining a node. It does not ordinarily govern the Deployment controller’s own rolling-update behavior.

CrashLoopBackOff is not the cause
#

CrashLoopBackOff describes Kubernetes backing off after a container repeatedly terminates. It tells you the container is failing; it does not explain why.

Start with the logs from the previous container instance:

kubectl logs <pod-name> -n <namespace> --previous

The --previous flag matters because the newly restarted container may not yet have emitted useful logs. Then inspect the container’s termination reason and exit code in kubectl describe pod.

Exit code 137 often appears when a container was OOM-killed, but the code alone only indicates a SIGKILL. Confirm that the termination reason is OOMKilled before treating it as a memory-limit problem. Exit codes such as 1 and 2 commonly signal application-level errors, but their exact meaning depends on the application.

The EKS-specific networking trap
#

EKS adds AWS-specific networking constraints that make Kubernetes fundamentals more—not less—important. With the Amazon VPC CNI’s typical IPv4 configuration, Pods receive IP addresses from VPC networking resources associated with worker-node ENIs. Node instance types have limits on ENIs and addresses per ENI, while subnets have finite available IP space.

If capacity is exhausted, Pods can remain in ContainerCreating and report an error such as:

Failed to assign an IP address to container

The underlying constraint might be node-level ENI/IP capacity, depleted subnet addresses, or a CNI configuration issue. The response is not simply “restart the Pod.” Check the affected Pod’s events, VPC CNI (aws-node) logs and metrics, and available addresses in the relevant subnets.

Depending on the cause, the fix may include choosing node types with greater network capacity, adding or enlarging subnets, tuning the CNI warm-IP settings, or enabling prefix delegation. Prefix delegation can substantially increase per-node address capacity, but it requires suitable contiguous address space in the subnet.

EKS does not eliminate networking concepts you need to understand. It applies them through AWS’s VPC, ENI, subnet, and IAM model.

Recommended Reading#

Featured image by Juno Jo on Unsplash