AWS EKS 集群自动扩容 Cluster Autoscaler

文章目录

  • 一,需求
    • 工作需求
    • 说明
  • 二,部署
    • 精简命令执行
    • 1,要求
    • 2,查看EC2 Auto Scaling groups Tag
    • 3,创建Serviceaccount需要的Policy,Role
    • 4,部署Cluster Autoscaler
    • 5,验证
    • 6,常见问题
  • 三,参考文档

一,需求

工作需求

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

说明

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

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

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 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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/80983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务系列文章之 Springboot+Vue实现登录注册

一、springBoot 创建springBoot项目 分为三个包&#xff0c;分别为controller&#xff0c;service&#xff0c; dao以及resource目录下的xml文件。 添加pom.xml 依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mave…

macOS - 安装使用 libvirt、virsh

文章目录 关于 libvirt使用安装启动服务virsh 交互模式virsh 帮助命令 关于 libvirt libvirt 官网&#xff1a; https://libvirt.org/gitlab : https://gitlab.com/libvirt/libvirtgithub : https://github.com/libvirt/libvirt 只读&#xff0c;gitlab 的镜像 libvirt是一套…

学习笔记:Opencv实现图像特征提取算法SIFT

2023.8.19 为了在暑假内实现深度学习的进阶学习&#xff0c;特意学习一下传统算法&#xff0c;分享学习心得&#xff0c;记录学习日常 SIFT的百科&#xff1a; SIFT Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客…

hive高频使用的拼接函数及“避坑”

hive高频使用的拼接函数及“避坑” 说到拼接函数应用场景和使用频次还是非常高&#xff0c;比如一个员工在公司充当多个角色&#xff0c;我们在底层存数的时候往往是多行&#xff0c;但是应用的时候我们通常会只需要一行&#xff0c;角色字段进行拼接&#xff0c;这样join其他…

Mariadb高可用MHA

目录 前言 一、概述 &#xff08;一&#xff09;、概念 &#xff08;二&#xff09;、组成 &#xff08;三&#xff09;、特点 &#xff08;四&#xff09;、工作原理 二、案例 &#xff08;一&#xff09;、构建MHA 1.所有节点ssh免密登录 2、MySQL主从复制 &#x…

【计算机设计大赛】国赛一等奖项目分享——基于多端融合的化工安全生产监管可视化系统

文章目录 一、计算机设计大赛国赛一等奖二、项目背景三、项目简介四、系统架构五、系统功能结构六、项目特色&#xff08;1&#xff09;多端融合&#xff08;2&#xff09;数据可视化&#xff08;3&#xff09;计算机视觉&#xff08;目标检测&#xff09; 七、系统界面设计&am…

【ESP系列】ESP01S官方MQTT案例实验

前言 偶然发现安信可官网有ESP01S和STM32连接TCP和MQTT的案例。弄了一两天&#xff0c;把我使用的流程在这里记录下。MQTT的固件一定要烧录进去&#xff0c;默认固件是没有MQTT相关的AT指令的。 环境 Keli5&#xff0c;STM32F103C8T6 官方Keil工程链接&#xff1a;ESP8266的S…

回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现BES-SVM秃鹰搜索优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效…

换过3个工作,我却得出10年测试人的血泪经验

我跟大多数IT职场的测试新人起点差不多&#xff0c;在测试的这条路上&#xff0c;没有天生的聪明天资&#xff0c;也没有一个耀眼的学历。在北京这样一个随便一个同事不是清华的本硕&#xff0c;就是北邮北航的硕士下&#xff0c;自己也常常感到惭愧。 自己从事测试多年&#…

【SLAM】ORBSLAM34macOS: ORBSLAM3 Project 4(for) macOS Platform

文章目录 配置ORBSLAM34macOS 版本运行步骤&#xff1a;版本修复问题记录&#xff1a;编译 fix运行 fix 配置 硬件&#xff1a;MacBook Pro Intel CPU 系统&#xff1a;macOS Ventura 13.4.1 ORBSLAM34macOS 版本 https://github.com/phdsky/ORB_SLAM3/tree/macOS 运行步骤&…

【模拟集成电路】反馈系统——基础到进阶(一)

【模拟集成电路】反馈系统——基础到进阶 前言1 概述2 反馈电路特性2.1增益灵敏度降低2.2 终端阻抗变化2.3 带宽拓展2.4 非线性减小 3 放大器分类4 反馈检测和返回机制4.1 按照检测物理量分类4.2 按照检测拓扑连接分类 5 反馈结构分析6 二端口方法7 波特方法6 麦德布鲁克方法 前…

归并排序:从二路到多路

前言 我们所熟知的快速排序和归并排序都是非常优秀的排序算法。 但是快速排序和归并排序的一个区别就是&#xff1a;快速排序是一种内部排序&#xff0c;而归并排序是一种外部排序。 简单理解归并排序&#xff1a;递归地拆分&#xff0c;回溯过程中&#xff0c;将排序结果进…

Android12之com.android.media.swcodec无法生成apex问题(一百六十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

源于传承,擎领未来,新架构、新工艺下的“换心工程”——金融电子化访中电金信副总经理、研究院院长况文川

当前&#xff0c;商业银行的经营环境正在发生着深刻而复杂的变化&#xff0c;在深化改革主旋律的指引下&#xff0c;数字化转型已成为我国商业银行普遍认同、广泛采用的战略性举措。核心系统作为承载银行业务的关键支柱系统&#xff0c;一直是各银行在金融科技建设中重点关注和…

多种方法实现 Nginx 隐藏式跳转(隐式URL,即浏览器 URL 跳转后保持不变)

多种方法实现 Nginx 隐藏式跳转(隐式URL,即浏览器 URL 跳转后保持不变)。 一个新项目,后端使用 PHP 实现,前端不做路由,提供一个模板,由后端路由控制。 Route::get(pages/{name}, [\App\Http\Controllers\ResourceController::class, getResourceVersion])

Redis数据结构——快速列表quicklist、快表

定义 Redis中的数据结构&#xff0c;链表和压缩列表这两种数据结构是列表对象的底层实现方式。 当时考虑到链表的附加空间太大&#xff0c;节点的内存都是单独分配的&#xff0c;还会导致内存碎片化问题严重。 因此从Redis3.2开始&#xff0c;对列表的底层数据结构进行了改造&…

css学习1

1、样式定义如何显示元素。 2、样式通常保存至外部的css文件中。 3、样式可以使内容与表现分离。 4、css主要有两部分组成&#xff1a;选择器与一条或多条声明。 选择器通常为要改变的html元素&#xff0c;每条声明由一个属性和一个值组成。每个属性有一个值&#xff0c;属性…

C语言编程:最小二乘法拟合直线

本文研究通过C语言实现最小二乘法拟合直线。 文章目录 1 引入2 公式推导3 C语言代码实现4 测试验证5 总结 1 引入 最小二乘法&#xff0c;简单来说就是根据一组观测得到的数值&#xff0c;寻找一个函数&#xff0c;使得函数与观测点的误差的平方和达到最小。在工程实践中&…

leetcode15. 三数之和

这里保证1.元素a不会重复。2.所有解都是有序的。3.b和c元素不重复。所以解不会重复。 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {std::vector<std::vector<int>> result;if (nums.size() < 3) return …

提升大数据技能,不再颓废!这6家学习网站是你的利器!

随着国家数字化转型&#xff0c;大数据领域对人才的需求越来越多。大数据主要研究计算机科学和大数据处理技术等相关的知识和技能&#xff0c;从大数据应用的三个主要层面&#xff08;即数据管理、系统开发、海量数据分析与挖掘&#xff09;出发&#xff0c;对实际问题进行分析…
最新文章