如何在 Amazon EKS 上设置 Cluster Autoscaler?

上次更新时间:2020 年 8 月 13 日

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 上设置 Cluster Autoscaler。

简短描述

Kubernetes Cluster Autoscaler 可在满足下列任意一项条件时自动调整 Kubernetes 集群的大小:

  • 有 Pod 因为资源不足而无法在集群中运行。
  • 集群中有节点长时间利用率不足,并且其 Pod 可以放置到其他现有的节点。

Cluster Autoscaler 会扩展任何指定 Auto Scaling 组内的工作线程节点,并在您的集群中作为部署运行。

注意:以下解决方法假定您拥有一个活动的 Amazon EKS 集群,并且该集群与使用 AWS CloudFormation 模板创建的工作线程节点关联。该解决方法使用自动发现设置,但您可以通过指定一个或多个 Auto Scaling 组来配置 Cluster Autoscaler。

解决方法

设置自动发现

1.    打开 AWS CloudFormation 控制台,选择您的堆栈,然后选择资源选项卡。

2.    要查找您的堆栈创建的 Auto Scaling 组资源,请在 Logical ID(逻辑 ID)列查找 NodeGroup。有关更多信息,请参阅启动自我管理的 Amazon Linux 2 节点

3.    打开 Amazon Elastic Compute Cloud (Amazon EC2) 控制台,然后从导航窗格中选择 Auto Scaling 组

4.    选择标签选项卡,然后选择添加/编辑标签

5.    在 Add/Edit Auto Scaling Group Tags(添加/编辑 Auto Scaling 组标签)窗口中,将 awsExampleClusterName 替换为您的 Amazon EKS 集群的名称,从而输入以下标签。然后选择 Save(保存)

Key: k8s.io/cluster-autoscaler/enabled
Key: k8s.io/cluster-autoscaler/awsExampleClusterName

注意:您输入的标签键没有值。Cluster Autoscaler 会忽略为键设置的任何值。

创建一个 IAM 策略

1.    根据以下示例创建名为 ClusterAutoScalerAWS Identity and Access Management (IAM) 策略。这样,运行 Cluster Autoscaler 的工作线程节点就可以访问所需的资源和操作。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:DescribeTags",
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup",
                "ec2:DescribeLaunchTemplateVersions"
            ],
            "Resource": "*"
        }
    ]
}

注意:通过将上述策略添加到工作线程节点角色,您将允许在相关 EC2 实例上运行的所有 Pod 或应用程序使用额外的 IAM 权限。

2.    向附加到您的 Amazon EKS 工作线程节点的实例角色附加此新策略

部署 Cluster Autoscaler

1.    要在 GitHub 上下载 Cluster Autoscaler 项目提供的示例部署文件,请运行以下命令:

wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml

2.    打开已下载的 YAML 文件,并根据以下示例设置集群名称 (awsExampleClusterName)。然后保存更改。

...          
          command:
            - ./cluster-autoscaler
            - --v=4
            - --stderrthreshold=info
            - --cloud-provider=aws
            - --skip-nodes-with-local-storage=false
            - --expander=least-waste
            - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/awsExampleClusterName
...

3.    要创建 Cluster Autoscaler 部署,请运行以下命令:

kubectl apply -f cluster-autoscaler-autodiscover.yaml

4.    要检查 Cluster Autoscaler 部署日志以查看部署错误,请运行以下命令:

kubectl logs -f deployment/cluster-autoscaler -n kube-system

测试工作线程节点的扩展

1.    要查看当前的工作线程节点数量,请运行以下命令:

kubectl get nodes

2.    要增加工作线程节点的数量,请运行以下命令:

kubectl create deployment autoscaler-demo --image=nginx
kubectl scale deployment autoscaler-demo --replicas=50

注意:上述命令会使用 NGINX 映像直接在 Kubernetes 集群上创建一个名为 autoscaler-demo 的部署,然后启动 50 个 Pod。

3.    要检查部署的状态并看到 Pod 的数量在增加,请运行以下命令:

kubectl get deployment autoscaler-demo --watch

4.    当可用 Pod 的数量达到 50 时,请运行以下命令检查工作线程的数量:

kubectl get nodes

清理测试部署

1.    要通过删除之前创建的部署 autoscaler-demo 来收缩工作线程节点,请运行以下命令:

kubectl delete deployment autoscaler-demo

2.    要查看工作线程节点的数量,请等待大约 10 分钟,然后运行以下命令:

kubectl get nodes

这篇文章对您有帮助吗?


您是否需要账单或技术支持?