Cluster Autoscaler(CA)介绍
Cluster Autoscaler (CA)是 Kubernetes 官方提供的自动伸缩组件,用于动态调整集群节点数量以适应负载变化。
工作原理
CA 通过监控未调度的 Pod 和节点资源使用情况,自动扩展或缩减节点数量:
• 扩容:当集群中出现因资源不足无法调度的 Pod 时,CA 会新增节点以满足需求
• 缩容:当节点资源利用率低于阈值时,CA 会删除空闲节点以节省资源
核心模块
• autoscaler:负责整体扩缩容逻辑
• estimator:评估扩容节点需求
• simulator:模拟调度过程以确定缩容节点
适用场景
适用于需要动态调整计算资源的场景,例如:
• 批量处理作业节点需求波动
• 高并发服务场景(如电商大促)
• 微服务架构下的资源弹性管理

具体步骤
本 SOP 介绍了如何在 Amazon EKS 上利用 Cluster Autoscaler(CA)实现 Pod 的自动扩缩。
1. 创建一个管理 eks 节点 ca 的实例,用最小的型号就行
2. iam 创建一个策略 EKSDescribeCluster,赋予 ec2 描述 eks 节点访问的权限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"eks:DescribeCluster",
"eks:DescribeClusterVersions",
"eks:ListClusters",
"eks:ListNodegroups",
"eks:DescribeNodegroup",
"cloudformation:ListStacks",
"cloudformation:DescribeStacks"
],
"Resource": "*"
}
]
}
3. 创建一个角色 EKSDescribeCluster,附上上面这个策略


4. 把这个角色附加到刚刚创建的实例上


5. 授权该 EC2 能访问我们 eks 集群的节点,到 eks 集群授予访问条目

6. 选择刚刚创建的角色 ARN

7. 添加两个 eks admin 策略

8. ssh 连接刚刚一开始创建的 ec2,检查里面是否安装了 kubectl 的命令,如果没安装,就按照这个文档里面命令全装 kubectl 软件https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/install-kubectl.html
记得看你的集群的版本对应哪条命令,以及你建的这台服务器是什么系统,这里示例环境用的是 linux amd64,集群1.33版本
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.33.0/2025-05-01/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export
PATH=$HOME/bin:$PATH
9. 测试 kubectl version –client 是否能看到版本号,有的话即安装成功

10. 创用命令 aws eks update-kubeconfig --region 你的区域 --name 你的集群名字,来连接这台 ec2 和你的集群,用 kubectl get nodes 命令查看是否成功显示集群节点组的节点

11. 在 iam 创建一个身份提供者,填入集群的 OPENID 的 url,受众填入 sts.amazonaws.com,参考文档
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/enable-iam-roles-for-service-accounts.html



12. 再创建一个策略,是给 eks ca 的权限,命名为 EKS-CA-policy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:DescribeAutoScaling-
Groups",
"autoscaling:DescribeAutoScalingI-
nstances",
"autoscaling:DescribeLaunchConfi-
gurations",
"autoscaling:DescribeScalingActiv-
ities",
"ec2:DescribeImages",
"ec2:DescribeInstanceTypes",
"ec2:DescribeLaunchTemplateVer-
sions",
"ec2:GetInstanceTypesFromInstanc-
eRequirements",
"eks:DescribeNodegroup"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"autoscaling:SetDesiredCapacity",
"autoscaling:TerminateInstanceIn-
AutoScalingGroup"
],
"Resource": [
"*"
]
}
]
}
13. 再创建一个角色,赋予身份提供者能够访问,选择自定义信任策略,贴入下方的 json

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated":"填入下面第14步身份提供者openid 的ARN"
},
"Action":"sts:AssumeRoleWithWebId-
entity",
"Condition":{
"StringEquals":{
"填入下面第14步身份提供者openid 的ARN:sub":"system:serviceaccou-
nt:kube-system:cluster-autoscaler(填下面第15步知道的yaml文件开头处的namespace name)",
"填入下面第14步身份提供者openid 的ARN:aud":"sts.amazonaws.com"
}
}
}
]
}
14. 点击创建好的身份提供者,复制右上角的 ARN


15. 查阅刚刚 yaml 文档里开头部分的 name和namespace,一般都是图里这两个

16. 点击下一步,附加上一步创建的 eks-ca-policy,点下一步,取名 EKS-CA-role,这样可以让该 sevice account 可以使用它

17. 点击刚刚创建的 EKS-CA-role 角色,复制他的 ARN 准备好,
eks.amazonaws.com/role-arn: 复制的角色ARN
18. 在该网址下载这个 yaml 文件,上传至 ec2
https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-one-asg.yaml
19. 把刚刚第17步复制好的这一段写入 yaml 文件里的开头 metadata 下的 annotations 下,annotations 字段需要自己添加在 matadata 的下一行

20. 往下拉 yaml 文件,再修改 command 处,--nodes=后面的数据,我这里最小节点数是2,最大节点数是5,节点组自动创建的 autoscaling 名字是 eks-nv-us-kc-prod-EKS-nodegroup-a4cbe061-9302-a15e-95da-379f4a7b0f41,所以这样更改,最小和最大节点数看你当时在创建集群节点组的时候是如何设置的,可以回去控制台节点组信息查看,后面如果需要改最小最大节点也是重新来这个地方改数据,重新 apply 这个 yaml 文档就好

21. 保存退出,运行 kubectl apply -f cluster-autoscaler-one-asg.yaml,会有服务名字被创建的信息

22. 运行命令 kubectl get pod -n kube-system,会看到 pod 正在运行中

23. 运行查日志命令,kubectl -n kube-system logs -l app=cluster-autoscaler

后续测试
--kubectl create deployment nginx --image=nginx --replicas=100,让他去关停 pod,ca 会不会自动重启新的节点上来
--kubectl get pod,可以看到大量 nginx 被 pending 中
--刷新 autoscaling 控制台可以看到增加了节点
--测试完就删掉 nginx,别让它继续跑 kubectl delete deployment nginx