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.iok8s-app: cluster-autoscalerannotations:eks.amazonaws.com/role-arn: arn:aws:iam::xxxxx:role/<Role-name>  # Add the IAM role created in the above C section.name: cluster-autoscalernamespace: 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:AssumeRoleWithWebIdentitystatus 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:AssumeRoleWithWebIdentitystatus 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.pswp.cn/news/43400.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43400.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43400.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

zotero在不同系統的安裝(win/linux)

1 window系統安裝 zotero 官網&#xff1a; https://www.zotero.org/ 官方文檔 &#xff1a;https://www.zotero.org/support/ (官方)推薦常用的插件: https://www.zotero.org/support/plugins 入門視頻推薦&#xff1a; Zotero 文獻管理與知識整理最佳實踐 點擊 exe文件自…

【環境配置】Windows 10 安裝 PyTorch 開發環境,以及驗證 YOLOv8

Windows 10 安裝 PyTorch 開發環境&#xff0c;以及驗證 YOLOv8 最近搞了一臺Windows機器&#xff0c;準備在上面安裝深度學習的開發環境&#xff0c;并搭建部署YOLOv8做訓練和測試使用&#xff1b; 環境&#xff1a; OS&#xff1a; Windows 10 顯卡&#xff1a; RTX 3090 安…

Bug日記-webstorm運行yarn 命令報錯

在windows中輸入yarn -v正確輸出&#xff0c;在webstrom終端中運行yarn命令輸出錯誤 問題&#xff1a;可能是由于 WebStorm 配置問題導致的。 解決方案&#xff1a; 檢查 WebStorm 的終端配置&#xff1a;在 WebStorm 中&#xff0c;點擊菜單欄的 “File”&#xff08;文件&am…

DeepSort:基于檢測的目標跟蹤的經典

本文來自公眾號“AI大道理” DeepSORT在SORT的基礎上引入了深度學習的特征表示和更強大的目標關聯方式&#xff0c;有效地減少了身份切換的數量&#xff0c;緩解了重識別問題。 ? 1、DeepSORT簡介 DeepSORT的主要思想是將目標檢測和目標跟蹤兩個任務相結合。 首先使用目標檢…

排序算法分析——什么時候 用 什么排序

排序算法 & 分析 排序算法歷史排序算法分析很快的排序較快的排序中等的排序很慢的排序 分析的結果0.沒有要求1.對速度有要求2.邊排序邊操作3.條件1&條件24.在有序數中操作5.條件1&條件4 了解各種排序&#xff0c;詳見排序專欄 排序算法歷史 縱觀排序算法的歷史&a…

硬件產品經理:從入門到精通(新書發布)

目錄 簡介 新書 框架內容 相關課程 簡介 在完成多款硬件產品從設計到推向市場的過程后。 筆者于2020年開始在產品領域平臺輸出硬件相關的內容。 在這個過程中經常會收到很多讀者的留言&#xff0c;希望能推薦一些硬件相關的書籍或資料。 其實&#xff0c;筆者剛開始做硬…

10. 實現業務功能--退出登錄

目錄 1. 實現 Controller 2. 單體測試 3. 實現前端界面 退出的具體實現邏輯如下&#xff1a; 1. 用戶訪問退出接口 2. 服務器注銷 Session( 在 Controller 中可以直接進行處理 &#xff09; 3. 返回成功或失敗 4. 如果返回成功瀏覽器跳轉到相應頁面 5. 結束 一般來說&#…

使用VS2015打開.pro文件后,編譯報錯

編譯報錯內容&#xff1a; MSB8036 找不到 Windows SDK 版本10.0.18362.0。請安裝所需的版本的 Windows SDK 或者在項目屬性頁中或通過右鍵單擊解決方案并選擇“重定解決方案目標”來更改 SD 方法&#xff1a; 1.右鍵點擊 Solution上&#xff0c;在彈出的框中點擊“Retarget…

調整數組使奇數全部都位于偶數前面

題目內容&#xff1a; 輸入一個整數數組&#xff0c;實現一個函數&#xff0c; 來調整該數組中數字的順序使得數組中所有的奇數位于數組的前半部分&#xff0c; 所有偶數位于數組的后半部分。 題目思路&#xff1a; 將奇數部分放在前半部分&#xff0c;偶數部分放在后半部分&am…

學習筆記230804---restful風格的接口,delete的傳參方式問題

如果后端提供的刪除接口是restful風格&#xff0c;那么使用地址欄拼接的方式發送請求&#xff0c;數據放在主體中&#xff0c;后端接受不到&#xff0c;當然也還有一種可能&#xff0c;后端在這個接口的接參設置上是req.query接參。 問題描述 今天遇到的問題是&#xff0c;de…

新榜 | CityWalk本地生活商業價值洞察報告

如果說現在有人問&#xff0c;最新的網絡熱詞是什么? “CityWalk”&#xff0c;這可能是大多數人的答案。 近段時間&#xff0c;“CityWalk”刷屏了各種社交媒體&#xff0c;給網友們帶來了一場“城市漫步”之旅。 脫離群體狂歡&#xff0c;這個在社交媒體引發熱議的詞匯背后又…

首發 | FOSS分布式全閃對象存儲系統白皮書

一、 產品概述 1. 當前存儲的挑戰 隨著云計算、物聯網、5G、大數據、人工智能等新技術的飛速發展&#xff0c;數據呈現爆發式增長&#xff0c;預計到2025年中國數據量將增長到48.6ZB&#xff0c;超過80%為非結構化數據。 同時&#xff0c;數字經濟正在成為我國經濟發展的新…

RabbitMQ安裝配置,筆記整理 RabbitMQ3.12.2版本安裝配置

官網下載 RabbitMQ 官方地址&#xff1a;RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ 下載時需注意Erlang Versions的版本 這里下載的是3.12.2 2.安裝依賴環境 在線安裝依賴環境&#xff1a; yum install build-essential openssl openssl-dev…

銳捷無線產品運維(Web登錄、 命令行登錄)

目錄 登錄AP產品 Console登錄&#xff08;只可以現場登錄&#xff09; Web/Telnet/SSH登錄&#xff08;可以現場、遠程登錄&#xff09; 配置AP的管理地址 通過Web界面遠程登錄 通過Telnet、SSH等命令行的方式登錄 登錄AC產品 Console登錄&#xff08;只可以現場登錄&a…

[bug] 記錄version `GLIBCXX_3.4.29‘ not found 解決方法

在使用mediapipe 這個庫的時候&#xff0c;首次使用出現 GLIBCXX_3.4.29’ not found 錯誤&#xff0c; 看起來是安裝mediapipe 的時候自動升級了 matplotlib 這個庫&#xff0c;導致依賴的 libstd.so 版本不滿足了&#xff0c;GLIBCXX_3.4.29 is an object from libstdc.so.…

【c語言】字符函數與字符串函數(上)

大家好呀&#xff0c;今天給大家分享一下字符函數和字符串函數&#xff0c;說起字符函數和字符串函數大家會想到哪些呢&#xff1f;&#xff1f;我想到的只有求字符串長度的strlen,拷貝字符串的strcpy,字符串比較相同的strcmp,今天&#xff0c;我要分享給大家的是我們一些其他的…

Photoshop制作漂亮光澤感3D按鈕

原文鏈接(https://img-blog.csdnimg.cn/45472c07f29944458570b59fe1f9a0e0.png)

CentOS gcc介紹及快速升級

1.gcc介紹 GCC&#xff08;GNU Compiler Collection&#xff09;是一個開源的編譯器套件&#xff0c;由 GNU(GNUs Not Unix!的遞歸縮寫) 項目開發和維護。它是一個功能強大且廣泛使用的編譯器&#xff0c;支持多種編程語言&#xff0c;包括 C、C、Objective-C、Fortran、Ada 和…

性能測試技術之基礎篇(精華)

目錄 一、什么是性能&#xff1f; 二、什么是性能測試&#xff1f; 三、性能測試結果需要記錄哪些參數&#xff1f; 四、如何做性能測試&#xff08;性能測試流程&#xff09;&#xff1f; 1、指標建模 2、診斷調優 五、常見性能測試工具 一、什么是性能&#xff1f; …