AWS EKS 集群自动扩容 Cluster Autoscaler

这篇具有很好参考价值的文章主要介绍了AWS EKS 集群自动扩容 Cluster Autoscaler。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一,需求

工作需求

Amazon EKS 是托管的 Kubernetes 服务,可以使用 HPA 和 Cluster Autoscaler 来在集群中实现弹性伸缩,以满足应用程序的需求并节省资源成本。

说明

Kubernetes(K8s)提供了自动伸缩机制,旨在根据应用程序负载和资源需求的变化自动调整应用的副本数量或节点数量,以满足性能需求和优化资源利用。K8s 中的两个关键自动伸缩机制是 Horizontal Pod Autoscaler (HPA) 和 Cluster Autoscaler。。

方法 定义 工作原理 范围 目标 对象 自动化程度
Horizontal Pod Autoscaler HPA 用于自动调整一个 Deployment、ReplicaSet 或者 StatefulSet 中 Pod 的副本数量,以保持某个指标(例如 CPU 使用率或内存使用率)的目标值。当定义的指标超过或低于阈值时,HPA 将增加或减少 Pod 的副本数量。 1,监控 Metrics Server 或自定义指标服务收集的数据.
2,根据定义的目标值,计算出需要的副本数量。
3,更新 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量。
HPA 负责调整一个 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量 HPA 关注 Pod 的资源使用率 Pod HPA 需要你设置目标值,然后根据这些值自动调整 Pod 数量
Cluster Autoscaler Cluster Autoscaler 是一种自动伸缩机制,它负责在 Kubernetes 集群中自动扩展或收缩节点的数量。当集群中的 Pod 数量增加或减少,Cluster Autoscaler 会根据条件自动扩展或缩减节点数量。 1,监控未满足资源需求的 Pod,并找到它们所在的节点。
2,如果没有足够的节点提供资源,Cluster Autoscaler 会请求云提供商(例如 AWS、GCP)来添加新节点。
当节点上的 Pod 数量减少,如果节点的资源利用率过低,Cluster Autoscaler 可能会将节点缩减。
Cluster Autoscaler 负责调整整个集群中节点的数量 Cluster Autoscaler 关注节点的资源利用率 Node Cluster Autoscaler 可以在需要的时候自动增加或减少节点

二,部署

精简命令执行

执行命令

##创建sa策略
aws iam create-policy \
    --policy-name AmazonEKSClusterAutoscalerPolicy \
    --policy-document file://cluster-autoscaler-policy.json
##创建Role角色
aws iam create-role \
  --role-name AmazonEKSClusterAutoscalerRole \
  --assume-role-policy-document file://"trust-policy.json"
##下载Autoscaler yaml文件
wget https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
## 修改yaml文件
1,修改镜像tag为对应EKS版本号
打开以下 Cluster Autoscaler 的 github 的网面,查看与 EKS 版本匹配的最新 Autoscaler 镜像版本 https://link.zhihu.com/?target=https%3A//github.com/kubernetes/autoscaler/releases
2,修改<YOUR CLUSTER NAME>
3, 在<YOUR CLUSTER NAME>下追加两行:
- --balance-similar-node-groups
- --skip-nodes-with-system-pods=false
##部署Cluster Autoscaler
kubectl apply -f cluster-autoscaler-autodiscover.yaml
## 绑定服务帐户和IAM角色
kubectl annotate serviceaccount cluster-autoscaler -n kube-system  eks.amazonaws.com/role-arn=arn:aws:iam::<Account_ID>:role/<Role-name>

1,要求

  • 版本 Cluster Autoscaler需要Kubernetes v1.3.0或更高版本
  • 权限 Cluster Autoscaler 需要能够检查和修改 EC2 Auto Scaling 组。建议使用服务帐户的IAM角色
  • 身份管理 全集群自动缩放器功能策略或者最低IAM策略
  • OIDC OIDC 联合身份验证允许您的服务承担 IAM 角色并与 AWS 服务交互,而无需将凭证存储为环境变量
  • AWS凭证 服务帐户的IAM角色

2,查看EC2 Auto Scaling groups Tag

Cluster Autoscaler 使用 EC2 Auto Scaling groups 服务对 node 进行扩容,我们需要确保 EKS 对应的 Auto Scaling groups 有适合的 Tag。

Cluster Autoscaler 通过 Tag 来识别哪些 Auto Scaling groups 属于其管辖范围。

如果我们使用 eksctl 命令或者 AWS 网页控制台来创建 node group,则所需 Tag 已经自动设置了,如果用其它方式创建的 node group 则需要确保其对应用的 Auto Scaling groups 中有以下两个 Tag
AWS EKS 集群自动扩容 Cluster Autoscaler,eks

3,创建Serviceaccount需要的Policy,Role

通过 service account(sa)来给 Cluster Autoscaler 的 Pod 提供访问 AWS 的 EC2 Auto Scaling groups 的权限。先创建 sa 需要的 Policy 和 Role。
创建Policy

vim  cluster-autoscaler-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeAutoScalingInstances",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:DescribeTags",
                "autoscaling:SetDesiredCapacity",
                "autoscaling:TerminateInstanceInAutoScalingGroup",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeLaunchTemplateVersions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
参考:https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/CA_with_AWS_IAM_OIDC.md

Tips: 这个Policy 提供访问EC2 autoscaling group的相关权限
创建策略

aws iam create-policy \
    --policy-name AmazonEKSClusterAutoscalerPolicy \
    --policy-document file://cluster-autoscaler-policy.json

创建IAM Role

vim trues-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AccountID>:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/<OICD_ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.us-east-1.amazonaws.com/id/<OICD_ID>:sub": "system:serviceaccount:kube-system:cluster-autoscaler"
        }
      }
    }
  ]
}

###更新角色信任关系aws iam update-assume-role-policy --role-name <role-name> --policy-document file://trust-policy.json

更新角色信任关系 
aws iam update-assume-role-policy --role-name AmazonEKSClusterAutoscalerRole --policy-document file://"trust-policy.json"

说明:IAM Role 中包括 IAM policy 和 trust relationship 两部分,我们先用 json 文件来定义 trust relationship 的内容。

trust-policy.json 在创建 Role 时,指定“Trust relationships”中的内容

  • 修改“252557384592”为自己的 AWS Account
  • 修改“us-east-1”为自己的 Region
  • 修改“OpenID Connect provider URL”为自己 EKS 的 OpenID Connect provider URL 中最后的字符串,如下所示
  • AWS EKS 集群自动扩容 Cluster Autoscaler,eks

创建角色

aws iam create-role \
  --role-name AmazonEKSClusterAutoscalerRole \
  --assume-role-policy-document file://"trust-policy.json"
 
###更新角色信任关系aws iam update-assume-role-policy --role-name <role-name> --policy-document file://trust-policy.json

更新角色信任关系 
aws iam update-assume-role-policy --role-name AmazonEKSClusterAutoscalerRole --policy-document file://"trust-policy.json"

说明:

role-name:自定义 Role 的名称
assume-role-policy-document:指定本地 trust-policy 文件

为角色附加策略

aws iam attach-role-policy \
  --policy-arn arn:aws:iam::<AccountID>:policy/AmazonEKSClusterAutoscalerPolicy \
  --role-name AmazonEKSClusterAutoscalerRole

4,部署Cluster Autoscaler

下载Autoscaler yaml文件

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

部署Cluster Autoscaler

kubectl apply -f cluster-autoscaler-autodiscover.yaml

绑定服务帐户和IAM角色

#命令行
kubectl annotate serviceaccount cluster-autoscaler -n kube-system eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNTID>:role/<Role-name>(建议使用AmazonEKSClusterAutoscalerRole)
#文件
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-addon: cluster-autoscaler.addons.k8s.io
    k8s-app: cluster-autoscaler
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::xxxxx:role/<Role-name>  # Add the IAM role created in the above C section.
  name: cluster-autoscaler
  namespace: kube-system

5,验证

#默认扩大节点组节点数量
扩大规模如何运作?
纵向扩展在 API 服务器上创建一个监视来查找所有 Pod。它每 10 秒检查一次任何不可调度的 pod(可通过--scan-interval标志配置)。当 Kubernetes 调度程序无法找到可以容纳 pod 的节点时,该 pod 就无法调度。例如,Pod 可以请求任何集群节点上可用的更多 CPU。不可调度的 pod 通过其 PodCondition 进行识别。每当 Kubernetes 调度程序无法找到运行 pod 的位置时,它就会将“schedulable”PodCondition 设置为 false,并将 Reason 设置为“unschedulable”。如果不可调度的 Pod 列表中有任何项目,Cluster Autoscaler 会尝试找到新的位置来运行它们。

#默认缩减节点组节点数量
每 10 秒(可通过--scan-interval标志配置),如果不需要扩展,Cluster Autoscaler 会检查哪些节点是不需要的。当满足以下所有条件时,将考虑删除节点:
1,该节点上运行的所有 Pod 的 CPU 和内存请求总和(默认情况下包括DaemonSet Pod和Mirror Pod--ignore-daemonsets-utilization ,但可以使用和--ignore-mirror-pods-utilization标志进行配置)小于该节点可分配的 50%。(在 1.1.0 之前,使用节点容量而不是可分配的容量。)可以使用 --scale-down-utilization-threshold标志配置利用率阈值。
2,节点上运行的所有 pod(默认情况下在所有节点上运行的 pod 除外,例如清单运行 pod 或 daemonset 创建的 pod)都可以移动到其他节点。请参阅 哪些类型的 Pod 可以阻止 CA 删除节点?部分了解有关哪些 pod 不满足此条件的更多详细信息,即使其他地方有空间容纳它们。在检查此情况时,所有可移动吊舱的新位置都会被记住。这样,Cluster Autoscaler 就知道每个 Pod 可以移动到哪里,以及哪些节点在 Pod 迁移方面依赖于哪些其他节点。当然,最终调度程序可能会将 Pod 放置在其他位置。
3,它没有缩小禁用注释(请参阅如[何防止 Cluster Autoscaler 缩小特定节点?](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-can-i-prevent-cluster-autoscaler-from-scaling-down-a-particular-node))

#测试集群自动绽放程序是否启动及角色是否已附加
$ kubectl get pods -n kube-system
$ kubectl exec -n kube-system cluster-autoscaler-xxxxxx-xxxxx  env | grep AWS

#测试命令
kubectl scale deployment autoscaler-demo --replicas=50

#扩展日志
I1025 13:48:42.975037       1 scale_up.go:529] Final scale-up plan: [{eksctl-xxx-xxx-xxx-nodegroup-ng-xxxxx-NodeGroup-xxxxxxxxxx 2->3 (max: 8)}]

#获取节点组信息
eksctl get nodegroup --cluster <cluster-name>
#调整节点组现有节点数
eksctl scale nodegroup --cluster <cluster-name> --name <nodegroup-name> --nodes <number>
#调整节点组最小节点数
eksctl scale nodegroup --cluster <cluster-name> --name <nodegroup-name> --nodes-min <number>
#调整节点组最大节点数
eksctl scale nodegroup --cluster <cluster-name> --name <nodegroup-name> --nodes-max <number>

6,常见问题

报错一:
caused by: InvalidIdentityToken: No OpenIDConnect provider found in your account for https://oidc.eks.us-east-1.amazonaws.com/id/274A18041DB4CF680FA22A5EF99FDFE3
解决:
使用 eksctl 为集群创建 IAM OIDC 身份提供商
eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve

确定集群是否拥有现有 IAM OIDC 提供商。
检索集群的 OIDC 提供商 ID 并将其存储在变量中。
oidc_id=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
确定您的账户中是否已存在具有您的集群 ID 的 IAM OIDC 提供商。

报错二:
0617 07:29:49.853336       1 aws_manager.go:262] Failed to regenerate ASG cache: WebIdentityErr: failed to retrieve credentials
caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity
	status code: 403, request id: ff336b02-e997-47f2-8551-8e00efa05049
F0617 07:29:49.853387       1 aws_cloud_provider.go:430] Failed to create AWS Manager: WebIdentityErr: failed to retrieve credentials
caused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity
	status code: 403, request id: ff336b02-e997-47f2-8551-8e00efa05049
解决:
修改OICD供应商ID,更新角色信任策略
aws iam update-assume-role-policy --role-name AmazonEKSClusterAutoscalerRole --policy-document file://"trust-policy.json"

aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
如果返回了输出,则表示您的集群已经有 IAM OIDC 提供商,您可以跳过下一步。如果没有返回输出,则您必须为集群创建 IAM OIDC 提供商。
使用以下命令为您的集群创建 IAM OIDC 身份提供商。将 my-cluster 替换为您自己的值。
eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

三,参考文档

AWS EKS 集群自动扩容 Cluster Autoscaler
github
CutoscalerFAQ
AWS EKS 集群自动扩容 Cluster Autoscaler,eks文章来源地址https://www.toymoban.com/news/detail-650373.html

到了这里,关于AWS EKS 集群自动扩容 Cluster Autoscaler的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AWS eks 用户授权

    背景: 国内使用阿里云惯了,点点就可以完成大部分的工作,国外的AWS 大都是命令行操作,且权限设置的特别细,在创建集群后,给用户授权的工作中走了很多弯路,特记录一下。 前置条件: 1. 安装aws cli 、eksctl 命令行工具 1. 把用户与k8s 中的Group组做映射 2.生成kubeconfig

    2024年02月07日
    浏览(18)
  • AWS CLI创建Amazon EKS服务

    Amazon EKS文档 前言: 创建ClusterRole需要选择一下的角色 AmazonEKSClusterPolicy 创建NodeRole需要选择一下的角色 AmazonEC2ContainerRegistryReadOnly AmazonEKSWorkerNodePolicy AmazonEKS_CNI_Policy 1、创建 Amazon EKS 集群 IAM 角色 1)创建json 2)创建 Amazon EKS 集群 IAM 角色 3)将名为 GamefiAmazonEKSClusterRole的 Am

    2024年02月11日
    浏览(28)
  • aws的eks平滑删除work节点实现降配

    背景 我们的EKS的Master是托管的,Work节点是EC2,目前EC2的配置为c5.4large,现在需要降配成m5.2xlarge。 官网 基础背景知识 k8s命令对node调度 有三个命令,分别是: cordon,drain,delete 。 (1)cordon 停止调度 影响最小,只会将node调为SchedulingDisabled 之后再发创建pod,不会被调度到该

    2024年02月03日
    浏览(22)
  • AWS alb eks traefik realip后端真实IP

    亚马逊 eks 集群代理用了traefik alb绑定 traefik 在node 上面暴露的端口,对外提供服务。一直也没有在意是否能正常获取客户端IP(腾讯云 阿里云的traefik 后端应用都能正常获取客户端IP),后端php服务基础镜像基于https://github.com/richarvey/nginx-php-fpm构建,对日志进行了json格式化,

    2024年02月11日
    浏览(26)
  • AWS 专题学习 P8 (ECS、EKS、Lambda、CloudFront、DynamoDB)

    专题内容总览和系列博客目录 https://blog.csdn.net/weixin_40815218/article/details/135590291 辅助资料( PDF ) https://download.csdn.net/download/weixin_40815218/88741566 Docker 是一个用于部署应用程序的软件开发平台 Docker 容器可以在任何操作系统上运行,应用程序运行在容器中 应用程序运行过程相同,

    2024年01月21日
    浏览(27)
  • 玩转aws之(二)eks 设置efs(nfs)存储卷pvc

    目录 1. 前言 2. 配置步骤 3. 安装csi驱动 3.1 创建iam policy 3.2 安装CFS csi驱动 4. 创建EFS 4.1 创建EFS访问安全组及放通EKS访问 4.2 根据EKS集群创建对应的EFS文件系统 4.3 创建挂载目标 5. 创建存储类 5.1 获取efs id 5.2 创建存储类 6. 创建pvc 7. pod挂载pvc使用 8. 总结   EKS支持两种持久性存

    2024年02月01日
    浏览(63)
  • 【云原生】aws平台使用eks发布load balancer暴露服务到外网

    区域:中国北京区 网络负载均衡: 搭建ingress一定要参考aws官网教程文档:https://docs.amazonaws.cn/eks/latest/userguide/network-load-balancing.html 开启外网在svc 上添加注释:

    2024年02月11日
    浏览(31)
  • 【云原生】AWS EKS1.25配置StorageClass-EFS存储类

    简介 StorageClass在kubernetes中定义为一种存储“类”,我们使用此类型的资源能帮助我们减少人工手动创建PV、PVC,了解更多信息可参考:存储类 | Kubernetes 卷插件支持AWS EBS、NFS等,我们需要改用EFS产品,在Github有人创建了EFS的插件 工作目录 cd /dwz/yaml/storageclass/ 工具及版本 区域

    2024年02月13日
    浏览(27)
  • 【云原生】在AWS平台EKS1.25,Helm安装Nexus3.20.1

    使用helm方式安装 工作目录: /opt/eks/yaml/nexus3 添加helm chart源 helm repo add azure http://mirror.azure.cn/kubernetes/charts/ 查询版本 chart的版本和nexus的版本有些差异,准备安装的版本是3.20.1,对应的是chart版本是1.23.1、1.23.0、1.22.0、1.21.4等,这里就安装chart最新的1.23.1版本 拉取chart包 helm

    2024年02月15日
    浏览(28)
  • 【aws】| 04 | AWS EC2 实例磁盘空间扩容

    进入控制台,选择 EBS - Volumes -Action - Modify Volume 首先使用lsblk可以查看附加到实例上的所有存储卷的真实size以及分区情况 注: 挂载在根目录上的是EBS存储卷上的分区而不是这个卷,而且卷被扩容但是分区大小不变依旧不能扩容。 xvda是一个存储卷,xvda1是存储卷上的一个分区

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包