技术分享 | 在EKS环境中部署Cluster Autoscaler(CA)

2026-04-24 10:07

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


云代理伙伴
扫描关注微信公众号
获取更多云端资讯
联系我们
——
  • 姓名*

  • 电话*

  • 邮箱*

  • 职称*

  • 公司*

  • 地址*

  • 需求*

  • * 点击提交,即表示您同意我们存储和处理您提交的个人信息,以向您提供所请求的内容,该信息仅供公司提供服务使用。您的信息受到相关法律的安全保护。