Common EKS Issues

These are the failures that come from the AWS integration rather than from Kubernetes itself. For the method, see EKS troubleshooting; for generic Kubernetes symptoms, the troubleshooting playbooks.

Access to the cluster

SymptomCauseFix
error: You must be logged in to the server (Unauthorized)The IAM principal is not known to the clusterAdd an access entry; check aws sts get-caller-identity shows the role you expect
Forbidden: User "…" cannot list resource …Authenticated, but no permissionAssociate an access policy or bind the entry’s group with RBAC
dial tcp … i/o timeoutPrivate API endpoint and you are outside the VPC, or your IP is not in the public allow-listEndpoint access
Worked yesterday, Unauthorized todayExpired SSO session, or the kubeconfig references a profile that no longer existsaws sso login, then aws eks update-kubeconfig again

Nodes do not join or go NotReady

Confirm with aws eks describe-nodegroup … --query nodegroup.health and, on the instance, journalctl -u kubelet.

SymptomCauseFix
Instance runs, never appears in kubectl get nodesNode role has no access entry (self-managed, Karpenter) or lacks the worker policiesCreate an EC2_LINUX access entry; attach the three managed node policies
Same, in a private subnetNo route to the API endpoint or to ECR/S3/STSNAT gateway, or VPC endpoints — private clusters
Same, after switching to AL2023Old bootstrap.sh user data; AL2023 needs a NodeConfigRewrite user data — node group basics
Node NotReady, cni plugin not initializedaws-node pod not running on that nodeCheck the DaemonSet, its IAM permissions and tolerations
Node NotReady under loadkubelet starved: no system reservations, disk pressure, or PID exhaustionSet kubeReserved/systemReserved; larger root volume; Node NotReady
Nodes vanish and are replaced repeatedlySpot reclaim, Karpenter drift from an unpinned AMI, or node auto repair reacting to a real faultKarpenter, Spot

Pods stuck Pending or ContainerCreating

Event textCauseFix
failed to assign an IP address to containerSubnet has no free IPs, or the node hit its ENI/IP limitPrefix delegation, more subnets via custom networking, tune warm targets
Too many podsThe node’s maxPods is reached (derived from ENI limits)Larger instance type or prefix delegation with a recalculated maxPods
0/N nodes are available: … Insufficient cpuNo capacity and nothing is adding nodesCheck the autoscaler’s logs; account vCPU quota; NodePool limits
volume node affinity conflictThe pod’s EBS volume is in a zone with no roomCapacity in that zone; one node group per zone
had untolerated taintTainted node group without a matching tolerationAdd the toleration, or a node group without the taint
FailedCreatePodSandBox … context deadline exceededCNI slow or failing, often EC2 API throttling during a scale-up burstWarm IP targets, prefix delegation; check ipamd.log

More: Pod Pending and VPC CNI troubleshooting.

Image pulls

SymptomCauseFix
ImagePullBackOff, no basic auth credentials / 403 from ECRNode role lacks ECR pull permissions, or the repository is in another account without a repository policyAttach AmazonEC2ContainerRegistryPullOnly; add a cross-account repository policy
Timeout pulling from ECR in a private subnetMissing ecr.api, ecr.dkr or the S3 gateway endpointAdd all three; layers are served from S3
toomanyrequests from Docker HubAnonymous pull rate limit, shared by every node behind one NAT IPECR pull-through cache, or mirror the images
exec format error at startx86 image on a Graviton node, or the reverseBuild multi-arch images; add a kubernetes.io/arch node selector
Very slow pulls, pods take minutes to startMulti-gigabyte imagesSmaller images — images and layers; pre-pull or use a faster root volume

Load balancers and ingress

SymptomCauseFix
Ingress has no ADDRESSAWS Load Balancer Controller not installed, no IngressClass, or controller lacks IAMkubectl describe ingress; controller logs
couldn't auto-discover subnetsSubnets not tagged kubernetes.io/role/elb or internal-elbTag the subnets
Targets unhealthyWrong health-check path or port; a network policy or security group blocks the load balancerFix the annotation; allow the load balancer’s source
502/504 during deploymentsPods are killed while still registered as targetspreStop sleep longer than the deregistration delay; pod readiness gates
A Classic Load Balancer appearedPlain type: LoadBalancer handled by the legacy in-tree controllerSet loadBalancerClass: service.k8s.aws/nlb
VPC cannot be deleted after the clusterLoad balancers and ENIs were orphaned because the cluster was deleted firstDelete Services and Ingresses before the cluster

Storage

SymptomCauseFix
PVC Pending, no eventsNo default StorageClass, or the CSI driver is not installedInstall the add-on; create a default class
PVC Pending, UnauthorizedOperationCSI controller has no IAM role or lacks KMS permissionsFix the Pod Identity association and key policy
Multi-Attach errorVolume still attached to a dead nodeWait for force-detach or delete the stale VolumeAttachment
EFS mount times outNo mount target in the zone, or port 2049 closedEFS CSI

DNS

SymptomCauseFix
Intermittent 5-second lookups or SERVFAILCoreDNS overloaded, or all replicas on one nodeScale CoreDNS (the add-on supports autoscaling), spread replicas, add NodeLocal DNSCache
Intermittent failures under high query volumeThe per-ENI limit of 1,024 packets per second to the VPC resolverSpread CoreDNS across nodes; cache; check the linklocal_allowance_exceeded ENA metric
External names slow, many NXDOMAIN in logsndots:5 makes each lookup try several search suffixes firstUse fully qualified names with a trailing dot, or lower ndots in dnsConfig
CoreDNS Pending on a Fargate-only clusterNo Fargate profile matches itFargate

Details: DNS resolution and Linux DNS resolution.

Pod IAM

SymptomCauseFix
AccessDenied, and the error names the node roleThe pod is not using its own roleCheck serviceAccountName; check the association or the IRSA annotation
IRSA: InvalidIdentityToken or AccessDenied on AssumeRoleWithWebIdentityTrust policy has the wrong OIDC provider, namespace or service accountFix the sub condition — IRSA
Pod Identity: SDK cannot find credentialsAgent add-on missing, pod created before the association, or an old SDKInstall eks-pod-identity-agent; restart the pod — Pod Identity
Works in one cluster, not in anotherIRSA trust policies are per cluster OIDC providerAdd the second provider, or move to Pod Identity

Admission webhooks

Internal error occurred: failed calling webhook … context deadline exceeded on every apply means the control plane cannot reach a webhook pod: a closed security group port, or the webhook pods are down. See the failure table in policy management.

Upgrades

SymptomCauseFix
Upgrade blocked by cluster insightsDeprecated APIs still in use, or add-on/kubelet version skewResolve each finding; query audit logs for the calling client
Node group update fails with PodEvictionFailureA PDB allows zero disruptionsFix the PDB, or force
Workloads break after the upgradeRemoved API versions in manifests or Helm chartsDeprecations
Add-on DEGRADED after the upgradeAdd-on version incompatible with the new Kubernetes versionUpdate add-ons as part of the upgrade process