AWS Promo Code AWS Kubernetes and EKS Management
So You’ve Decided to Run Kubernetes on AWS. Congrats — You’re Now Officially in Charge of 47 Moving Parts
Let’s get one thing straight: AWS Elastic Kubernetes Service (EKS) isn’t Kubernetes-as-a-Service — it’s Kubernetes-as-a-very-polite-but-firmly-unhelpful-roommate. AWS manages the control plane (API server, etcd, scheduler, controller manager), sure. But you? You’re still on call for everything else: node lifecycle, security patching, network policies, ingress chaos, autoscaling misfires, and that one DaemonSet that insists on running curl http://169.254.169.254/latest/meta-data/ every 3 seconds like it’s auditioning for a spy thriller.
Why EKS? (And Why You’ll Question That Decision at 2:17 a.m.)
EKS offers managed control planes (no more kubeadm wrestling matches), deep AWS integration (IAM roles for service accounts, ALB Ingress Controller, FSx for Lustre support), and compliance badges that make auditors smile like they just found extra dessert. But here’s the kicker: it doesn’t abstract away complexity — it relocates it. Your cluster won’t crash if the API server fails (AWS handles that), but your application will melt if you forget to tag your subnets with kubernetes.io/cluster/<your-cluster-name>=owned. Yes — that tiny tag is the difference between ‘working’ and ‘pod stuck in Pending forever while you frantically check kubectl describe node for the 14th time.’
The Cluster Setup Ritual: Less ‘Wizard’, More ‘Ancient Incantation’
Forget eksctl create cluster --name=prod-unicorn --version=1.29 and calling it a day. Real-world EKS starts with infrastructure-as-code (Terraform or CDK), not CLI shortcuts. You’ll need:
- A dedicated VPC (not default — seriously, don’t. Default VPCs come with pre-installed regret);
- At least two private subnets across AZs (public subnets are fine for NAT, but nodes belong behind glass, not in the DMZ);
- An IAM role for the EKS control plane (with
AmazonEKSClusterPolicy,AmazonEKSVPCResourceController— yes, that last one is new and easy to miss); - And a separate IAM role for your node group — because mixing control-plane and worker permissions is like letting your barista also handle your tax returns.
Pro tip: Use aws eks update-kubeconfig --name my-cluster only after verifying the cluster status is ACTIVE — not CREATING. That 10-minute wait? It’s not downtime. It’s AWS quietly forging your TLS certificates, provisioning highly available etcd clusters across three AZs, and whispering incantations into CloudFormation stacks. Respect the wait.
IAM Roles for Service Accounts (IRSA): The Magic Trick That Feels Like Black Magic
Before IRSA, we mounted IAM credentials as secrets. Then someone leaked an access key in a GitHub repo. Then someone else rotated it manually at 3 a.m. Then everyone cried. IRSA fixes that — by binding IAM roles directly to Kubernetes ServiceAccount objects using OIDC tokens.
Setup steps (non-negotiable order):
- Enable OIDC provider on your cluster (
aws eks associate-identity-provider --cluster-name...); - Create an IAM OIDC provider in IAM console (or via CLI — yes, it’s fussy about thumbprint matching);
- Create an IAM role with your desired policies (
AmazonS3ReadOnlyAccess, etc.), trust policy referencing your cluster’s OIDC issuer URL and the specific service account namespace/name; - Annotate your
ServiceAccount:eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role.
If your pod still gets AccessDenied, check: (a) the annotation spelling (yes, hyphens matter), (b) whether the IAM role’s trust policy allows the exact sub claim (e.g., system:serviceaccount:default:my-app), and (c) whether you remembered to install the aws-iam-authenticator binary (it’s deprecated now, but some legacy Helm charts still expect it).
Networking: Where Subnet Tags Go to Die (and Be Resurrected)
VPC CNI plugin isn’t optional — it’s your cluster’s circulatory system. It assigns ENIs and IPs to pods. And it has opinions. Strong ones.
Tag your subnets correctly — not just for EKS, but for CNI:
kubernetes.io/cluster/<cluster-name> = owned(orshared) — tells EKS which subnets to use for node auto-discovery;alpha.eksctl.io/cluster-name = <cluster-name>— eksctl users, this is your breadcrumb trail;aws-cni:— no, really. Some versions require1aws-cnitag with value1to find subnets. Not documented clearly. Not a joke.
Run out of IPs? Don’t blame CNI — blame your subnet CIDR size. A /24 gives you 251 usable IPs. Each m5.large node reserves 11 IPs by default (for ENIs + secondary IPs). So 20 nodes × 11 = 220 IPs — leaving 31 for future growth and existential dread. Solution? Use smaller instance types, increase subnet size, or enable WARM_IP_TARGET tuning. Or just accept that ‘IP exhaustion’ is your new spirit animal.
Add-Ons: Because ‘Just Kubernetes’ Is a Myth
EKS doesn’t ship with CoreDNS, kube-proxy, or VPC CNI pre-installed — you must manage them. Yes, even CoreDNS. Yes, even though it’s critical. Here’s how not to break DNS:
- Install via
eksctl utils install-coredns(or Helm — but avoid mixing installation methods); - Never edit
corednsConfigMap directly — usekubectl rollout restart deployment coredns -n kube-systemafter changes; - If
nslookup kubernetes.default.svc.cluster.localfails inside a pod, first checkkubectl get pods -n kube-system | grep coredns. If it’s crashing, check logs:kubectl logs -n kube-system deployment/coredns. 90% of the time, it’s a misconfigured upstream nameserver or a missingforward . /etc/resolv.confdirective.
Cost Control: Because ‘Infinite Scaling’ Is Just ‘Infinite Billing’ With Extra Steps
EKS control plane costs $0.10/hour — per cluster. Sounds cheap until you realize you’ve spun up dev/staging/prod/test-canary-2024 clusters ‘just in case’. Node costs? That’s where the real pain lives. Enable Cluster Autoscaler (CA) — but configure it properly:
- Set
--balance-similar-node-groups=trueso CA doesn’t hoard capacity in one AZ; - Use
nodeSelector+ taints/tolerations to separate spot vs. on-demand workloads; - Label your nodes with
lifecycle=spotorlifecycle=on-demand— then match in your deployments; - And please — set resource requests/limits. A pod with no CPU request can starve others. A pod with no memory limit can OOM-kill its node. Both are preventable tragedies.
Troubleshooting: A Field Guide to Panic, Then Clarity
When kubectl get pods shows Pending:
kubectl describe pod <name>→ look forEvents:section → is itFailedScheduling? Check node labels, taints, resource availability.- No nodes listed?
kubectl get nodes— if empty, check node group status in EKS console, then EC2 instances (are they running? tagged correctly? Security Group allowing port 10250?) - Nodes show
NotReady? Checksystemctl status kubeleton the instance (if you can SSH), or look atkubectl get events --sort-by=.lastTimestamp. - Still stuck? Run
aws eks describe-cluster --name my-cluster --query 'cluster.status'. If it’sFAILED, AWS already knows something’s wrong — check CloudTrail forCreateClusterfailure reasons.
Remember: Kubernetes rarely fails silently. It fails verbosely — in YAML, logs, and cryptic event messages. Your job isn’t to guess — it’s to read what it’s screaming.
AWS Promo Code Final Wisdom (Earned the Hard Way)
- Version skew matters. Don’t run 1.29 control plane with 1.27 nodes. EKS supports only N-2 minor versions — meaning 1.29 control plane officially supports 1.27–1.29 worker versions. Going outside that range? You’re in ‘best-effort’ land — and best-effort means ‘we won’t help you when CoreDNS stops resolving’.
- Backups aren’t optional. Use Velero with S3 + DynamoDB backend. Test restores. Not ‘someday’. This week.
- Logging? Ship stdout/stderr to CloudWatch Logs via Fluent Bit (not FluentD — it’s heavier and less stable on EKS). Set retention policies. Rotate. Prune.
- And finally: automate everything — including your disaster recovery runbook. Because when your cluster goes down at midnight, you won’t want to remember whether the OIDC provider ARN ends in /oidc or /oidc/. You’ll want Terraform to spin up a new one while you sip lukewarm coffee and whisper apologies to your dog.

