(2) Inspect the Deployment (confirm it’s enabled & configured)
% kubectl describe deployment cluster-autoscaler -n kube-system
Name: cluster-autoscaler-aws-cluster-autoscaler
Namespace: kube-system
CreationTimestamp: Wed, 16 Apr 2025 12:25:38 +0100
Labels: app.kubernetes.io/instance=cluster-autoscaler
app.kubernetes.io/managed-by=Helm
app.kubernetes.io/name=aws-cluster-autoscaler
helm.sh/chart=cluster-autoscaler-9.46.6
Annotations: deployment.kubernetes.io/revision: 1
meta.helm.sh/release-name: cluster-autoscaler
meta.helm.sh/release-namespace: kube-system
Selector: app.kubernetes.io/instance=cluster-autoscaler,app.kubernetes.io/name=aws-cluster-autoscaler
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app.kubernetes.io/instance=cluster-autoscaler
app.kubernetes.io/name=aws-cluster-autoscaler
Service Account: cluster-autoscaler-aws-cluster-autoscaler
Containers:
aws-cluster-autoscaler:
Image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.32.0
Port: 8085/TCP
Host Port: 0/TCP
Command:
./cluster-autoscaler
--cloud-provider=aws
--namespace=kube-system
--node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/mycorp-prod-mycluster
--logtostderr=true
--stderrthreshold=info
--v=4
Liveness: http-get http://:8085/health-check delay=0s timeout=1s period=10s #success=1 #failure=3
Environment:
POD_NAMESPACE: (v1:metadata.namespace)
SERVICE_ACCOUNT: (v1:spec.serviceAccountName)
AWS_REGION: us-east-1
Mounts: <none>
Volumes: <none>
Priority Class Name: system-cluster-critical
Node-Selectors: <none>
Tolerations: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: cluster-autoscaler-aws-cluster-autoscaler-7cbb844455 (2/2 replicas created)
Events: <none>
Key things to look for:
- Replicas ≥ 1
- No crash loops
- Command args like:
- --cloud-provider=aws
- --nodes=1:10:nodegroup-name
- --balance-similar-node-groups
If replicas are 0, it’s installed but effectively disabled.
(3) Check logs (is it actively scaling?)
This confirms it’s working, not just running.
% kubectl logs -n kube-system deployment/cluster-autoscaler
Healthy / active signs:
- scale up
- scale down
- Unschedulable pods
- Node group ... increase size
Red flags:
- AccessDenied
- no node groups found
- failed to get ASG
(4) Check for unschedulable pods trigger
If CA is working, it reacts to pods stuck in Pending.
% kubectl get pods -A | grep Pending
If pods are pending and CA logs mention them → CA is enabled and reacting.
(5) AWS EKS-specific checks (very common)
a) Check IAM permissions (classic failure mode)
Cluster Autoscaler must run with an IAM role that can talk to ASGs.
% kubectl -n kube-system get sa | grep autoscaler
cluster-autoscaler-aws-cluster-autoscaler 0 296d
horizontal-pod-autoscaler 0 296d
Let's inspect cluster-autoscaler-aws-cluster-autoscaler service accont:
% kubectl -n kube-system get sa cluster-autoscaler-aws-cluster-autoscaler -o yaml
apiVersion: v1
automountServiceAccountToken: true
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::xxxxx:role/mycorp-prod-mycluster-cluster-autoscaler
meta.helm.sh/release-name: cluster-autoscaler
meta.helm.sh/release-namespace: kube-system
creationTimestamp: "2026-04-16T11:25:37Z"
labels:
app.kubernetes.io/instance: cluster-autoscaler
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: aws-cluster-autoscaler
helm.sh/chart: cluster-autoscaler-9.46.6
name: cluster-autoscaler-aws-cluster-autoscaler
namespace: kube-system
resourceVersion: "15768"
uid: 0a7da521-1bf5-5a5f-a155-8801e876ea7b
Look for:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/ClusterAutoscalerRole
If missing → CA may exist but cannot scale.
b) Check Auto Scaling Group tags
Your node group ASGs must be tagged:
k8s.io/cluster-autoscaler/enabled = true
k8s.io/cluster-autoscaler/<cluster-name> = owned
Without these → CA runs but does nothing.
(6) Check Helm (if installed via Helm)
% helm list -A
NAME NAMESPACE REVISION UPDATED
cluster-autoscaler kube-system 1 2025-04-16 12:25:30.389073326 +0100BST
STATUS CHART APP VERSION
deployed cluster-autoscaler-9.46.6 1.32.0
Then:
helm status cluster-autoscaler -n kube-system
The command helm list -A (or its alias helm ls -A) is used to list all Helm releases across every namespace in a Kubernetes cluster. Helm identifies your cluster and authenticates through the same mechanism as kubectl: the kubeconfig file. It uses the standard Kubernetes configuration file, typically located at ~/.kube/config, to determine which cluster to target.
(7) Double-check it’s not replaced by Karpenter
Many newer EKS clusters don’t use Cluster Autoscaler anymore.
% kubectl get pods -A | grep -i karpenter
kube-system karpenter-6f67b8c97b-lbq8p 1/1 Running 0 206d
kube-system karpenter-6f67b8c97b-wmprj 1/1 Running 0 206d
If Karpenter is installed, Cluster Autoscaler usually isn’t (or shouldn’t be).
Quick decision table
-----------------------------------------------------------------
Symptom Meaning
-----------------------------------------------------------------
No CA pod Not installed
Pod running, replicas=0 Installed but disabled
Logs show AccessDenied Broken IAM
Pods Pending, no scale-up ASG tags / config issue
Karpenter present CA likely not used