Amazon EKS — Day-2 Operations Checklist
Day-2 covers everything after the cluster is running — observability, cost management, CI/CD, and operational processes.
Observability
Logging
- Container logs collected — Fluent Bit or Fluentd DaemonSet shipping to CloudWatch / OpenSearch
- Control plane logs enabled — all 5 log types to CloudWatch
- Log retention policy — 30-90 days in CloudWatch, archive to S3
- Structured logging — JSON format for easy parsing and querying
- Log-based alerts — CloudWatch Alarms or Prometheus alerting on error patterns
Metrics
- Prometheus or CloudWatch Container Insights — cluster and pod metrics
- Grafana dashboards — for cluster health, pod health, node utilization
- Custom metrics — application-specific metrics exposed via ServiceMonitor
- Kube-state-metrics installed — for Kubernetes object metrics (deployments, pods, etc.)
- Node exporter installed — for OS-level node metrics
Tracing (if applicable)
- AWS X-Ray or OpenTelemetry — distributed tracing for microservices
- ADOT Collector deployed — as DaemonSet or sidecar
Alerting
- PagerDuty / Opsgenie / SNS integration — for on-call notification
- Alert rules defined:
- Pod CrashLoopBackOff > 5 minutes
- Node NotReady > 5 minutes
- PVC usage > 80%
- High pod restart count
- HPA at max replicas
- Certificate expiring within 14 days
Cost Management
- Cost allocation tags —
Environment,Team,Serviceon all resources - Kubecost or OpenCost — per-namespace and per-workload cost visibility
- Spot instances — for non-critical workloads (with Node Termination Handler)
- Reserved Instances / Savings Plans — for baseline On-Demand capacity
- Karpenter consolidation — enabled for automatic bin-packing
- AWS Budgets — alerts at 80% and 100% of monthly budget
- Monthly cost review — compare actual vs budget, identify waste
CI/CD & Deployment
- GitOps — ArgoCD or Flux for declarative deployments
- CI pipeline — build, test, scan, push to ECR
- Progressive delivery — canary or blue/green for critical services
- Rollback strategy — documented and tested
- Environment promotion — dev → staging → production with approval gates
- Secret management — External Secrets Operator or Sealed Secrets (never plain Secrets in Git)
Operational Processes
Runbooks
- Cluster upgrade runbook — step-by-step with rollback
- Incident response runbook — escalation paths and initial triage
- Node replacement runbook — cordon, drain, terminate
- Disaster recovery runbook — tested quarterly
On-Call
- On-call rotation defined — with clear escalation
- Runbook links in alerts — every alert includes a link to the relevant runbook
- Post-incident review process — blameless retrospectives
Compliance
- CIS EKS Benchmark — run with kube-bench
- Audit logging — Kubernetes audit logs preserved
- Access reviews — quarterly review of who has cluster access
- Namespace isolation — teams can only access their own namespaces
Validation Script
#!/bin/bash
echo "=== EKS Day-2 Readiness Check ==="
echo "--- Logging ---"
kubectl get ds -n amazon-cloudwatch 2>/dev/null || echo "⚠ No CloudWatch agent/Fluent Bit DaemonSet"
kubectl get ds -n logging 2>/dev/null || echo "⚠ No logging DaemonSet in logging namespace"
echo "--- Metrics ---"
kubectl get pods -n monitoring -l app=prometheus 2>/dev/null || echo "⚠ No Prometheus"
kubectl get pods -n monitoring -l app.kubernetes.io/name=grafana 2>/dev/null || echo "⚠ No Grafana"
echo "--- Cost ---"
kubectl get pods -n kubecost 2>/dev/null || echo "⚠ No Kubecost"
echo "--- GitOps ---"
kubectl get pods -n argocd 2>/dev/null || echo "⚠ No ArgoCD"
kubectl get pods -n flux-system 2>/dev/null || echo "⚠ No Flux"
echo "--- PDBs ---"
PDB_COUNT=$(kubectl get pdb -A --no-headers 2>/dev/null | wc -l)
echo "PDB count: $PDB_COUNT"
echo "--- HPA ---"
HPA_COUNT=$(kubectl get hpa -A --no-headers 2>/dev/null | wc -l)
echo "HPA count: $HPA_COUNT"
echo "=== Check Complete ==="