如果您對於縮容哪些執行個體有一定要求(例如需要優先縮容CPU負載最小的執行個體),您可以通過Function Compute來自訂設定執行個體移出策略。在Auto Scaling執行縮容活動時,系統可以根據設定的執行個體移出策略,自動選擇某些特定的執行個體進行縮容。
背景資訊
Auto Scaling支援多種執行個體移出策略,伸縮組觸發縮容活動時,系統可以根據執行個體建立的時間、執行個體對應的伸縮配置版本等篩選條件設定優先權來縮容執行個體。更多資訊,請參見設定伸縮組的執行個體終止策略。
如果您對於縮容的執行個體有更多要求,可以結合自身業務特性,利用Function Compute來自訂設定執行個體移出策略。樣本情境:
-
情境一:優先縮容CPU負載最小的執行個體,以減少對業務本身的影響。
-
情境二:基於業務自身調度系統,優先縮容空閑執行個體,保證業務的同時降低使用成本。
前提條件
-
已開通阿里雲Function Compute服務,並完成相關授權。更多資訊,請參見步驟一:開通Function Compute服務。
-
已開通Log Service,並完成相關授權。更多資訊,請參見使用LoongCollector採集並分析ECS文本日誌。
操作步驟
步驟一:建立函數
阿里雲Function Compute控制台目前存在兩個版本(即Function ComputeFC 2.0和Function ComputeFC 3.0),本操作使用Function Compute2.0版本。
-
如果您已進入Function ComputeFC 3.0的控制台,請單擊返回Function Compute2.0進入Function Compute2.0版本的控制台。
-
在左側導覽列,單擊服务及函数。
-
在頂部功能表列,選擇地區。
-
建立服務。
-
在服务列表頁面,單擊创建服务。
-
在彈出面板中,完成服務配置,然後單擊确定。
本文採用以下配置作為樣本,未提及的參數保持預設即可。更多資訊,請參見建立服務。
參數
樣本
說明
服务名称
test-service
輸入阿里雲Function Compute服務的名稱。格式要求請參考介面提示。
描述
test
輸入Function Compute服務的描述。
日志功能
啟用
是否啟用阿里雲Log Service。啟用後,可以通過Log Service查詢函數的執行日誌,便於您進行代碼調試、故障分析和資料分析等。
-
-
建立函數。
-
單擊服務名稱,單擊左側的函数管理進入函數管理頁面。
-
單擊创建函数。
-
在创建函数頁面,完成函數配置,然後單擊创建。
本文選擇使用内置运行时创建方式來建立函數,採用以下配置作為樣本,未提及的參數保持預設即可。更多資訊,請參見建立函數。
參數
樣本
說明
基本设置
函数名称
test-fc
輸入函數名稱。格式要求請參考介面提示。
请求处理程序类型
處理事件請求
支援以下兩種請求方式:
-
处理事件请求:用於處理事件請求的函數。
-
處理HTTP請求:用於處理HTTP請求或WebSocket請求的函數。
函数代码
运行环境
Python 3.9
選擇代碼的運行環境。
代码上传方式
使用範例程式碼
Hello, world! 樣本
選擇上傳函數代碼到Function Compute的方式。
-
-
-
編寫並部署函數代碼。
-
單擊函數名稱,進入函數詳情頁面。
-
在函数代码頁簽下,在代碼編輯器中編輯index.py,然後單擊部署代码。
您可以基於自身業務特性引入特定篩選策略,例如:擷取各執行個體的CPU使用率或者查詢自身業務調度系統等。
本文採用以下代碼作為樣本,可以實現基於傳入的縮容執行個體數量(
Capacity)、執行個體ID列表(InstanceId)等篩選縮容的執行個體。# -*- coding: utf-8 -*- import logging import json def handler(event, context): evt = json.loads(event) logger = logging.getLogger() logger.info(evt) removeCount = 0 if "CapacityToRemove" in evt: for cp in evt["CapacityToRemove"]: logger.info(cp["Capacity"]) removeCount += int(cp["Capacity"]) instances_to_terminate = [] if "Instances" in evt: for i in evt["Instances"]: instances_to_terminate.append(i["InstanceId"]) response = { 'InstanceIds': instances_to_terminate[:removeCount] } logger.info(response) return response
-
-
(可選)測試函數。
-
在函数代码頁簽下,單擊测试函数右側的
表徵圖,從下拉式清單中選擇配置测试参数。 -
輸入測試代碼,然後單擊确定。
本文採用以下代碼作為測試樣本,其中
ScalingGroupId表示要操作的伸縮組,CapacityToRemove表示從cn-beijing-g可用性區域移出1台ECS執行個體,Instances表示當前可移出的執行個體列表。{ "ScalingGroupARN": "acs:ess:cn-beijing:160998252992****.scalinggroup/asg-2zei8mzn72rb115k****", "ScalingGroupId": "asg-2zei8mzn72rb115k****", "CapacityToRemove": [{ "ZoneId": "cn-beijing-g", "Capacity": 1 }], "Instances": [{ "InstanceId": "i-2zeinb37ovdsx6l0****", "ZoneId": "cn-beijing-g", "InstanceType": "ecs.g7.xlarge", "ChargeType": "PostPaid" }, { "InstanceId": "i-2zeinb37ovdsx6l0****", "ZoneId": "cn-beijing-g", "InstanceType": "ecs.g7.xlarge", "ChargeType": "PostPaid" }, { "InstanceId": "i-2zeinb37ovdsx6l0****", "ZoneId": "cn-beijing-g", "InstanceType": "ecs.g7.xlarge", "ChargeType": "PostPaid" } ], "AdjustmentType": "SystemScaleIn" } -
單擊测试函数。
-
在返回结果頁簽,查看測試結果。
基於測試代碼執行函數的預期返回如下,表示伸縮組縮容時會移出1台執行個體ID排在第一位的執行個體。
{ "InstanceIds": [ "i-2zeinb37ovdsx6l0****" ] }
-
-
在頁面頂部位置,單擊发布版本,然後單擊确定。
步驟二:配置伸縮組的執行個體移出策略
以下步驟以建立伸縮組為例,介紹如何自訂配置伸縮組的執行個體移出策略。如果您已有伸縮組,可直接修改伸縮組的執行個體移出策略。
-
建立伸縮組。
-
在伸縮組管理頁面,單擊建立伸縮組。
-
完成伸縮組配置,單擊创建。
本文使用以下參數配置作為樣本,未提及的參數可保持預設。更多資訊,請參見配置伸縮組。
參數
樣本
說明
伸縮組名稱
test
輸入伸縮組名稱。格式要求請參考介面提示。
伸縮群組類型
ECS
指定伸縮組內的執行個體類型。
本文以ECS為例,表示伸縮組內的執行個體類型為ECS執行個體。
組內執行個體配置資訊來源
從零開始建立
選擇建立執行個體的配置模板。
本文以從零開始建立為例,表示先不指定自動建立執行個體的模板。伸縮組建立完成後,您需要繼續建立伸縮配置。
執行個體移出策略
自訂策略
-
服務:test-service
-
版本:LATEST
-
函數:test-fc
配置縮容活動時,從伸縮組中移出執行個體的策略。
請選擇自定义策略,然後選擇步驟一建立的函數。
組內最小執行個體數
0
設定伸縮組內執行個體數量的下限。當前執行個體數量低於下限時,伸縮組會自動添加執行個體,使得伸縮組內的執行個體數量等於下限。
組內最大執行個體數
5
設定伸縮組內執行個體數量的上限。當前執行個體數量超過上限時,伸縮組會自動移出執行個體,使得伸縮組內的執行個體數量等於上限。
開啟期望執行個體數、組內期望執行個體數
開啟,3
開啟期望執行個體數功能,並配置期望執行個體數。伸縮組會自動將執行個體數量維持在期望執行個體數。
-
-
-
建立伸縮配置。具體操作,請參見建立伸縮配置(ECS執行個體)。
-
啟用伸縮組。具體操作,請參見啟用或停用伸縮組。
由於樣本的伸縮組的期望執行個體數配置為3,因此啟用伸縮組後,會自動建立3台ECS執行個體。
步驟三:驗證縮容效果
-
觸發縮容活動,並確認縮容執行個體的資訊。
-
修改伸縮組的期望執行個體數,觸發縮容活動。具體操作,請參見查看或修改伸縮組。
重要您也可以通過定時任務、警示任務或者手動執行伸縮規則等方式觸發縮容活動。但通過修改伸縮組最大、最小執行個體數而觸發的縮容活動,無法應用通過Function Compute自訂設定的執行個體移出策略。
本文以將期望執行個體數修改為2作為驗證樣本。由於之前伸縮組內已有3台ECS執行個體,因此會自動觸發縮容活動,移出1台ECS執行個體,使得執行個體數與修改後的期望執行個體數一致。
-
查看伸縮活動詳情,確認縮容執行個體的資訊。具體操作,請參見查看伸縮活動詳情。
樣本如下,縮容的執行個體ID為
i-2ze2qdthrkpf****tldq。伸縮活動詳情中,活動起因顯示使用者將期望容量從 3 修改為 2,詳細資料顯示對應執行個體已被刪除,狀態資訊為 1 台 ECS 執行個體被移除,活動狀態為成功。
-
-
查看函數的調用日誌,確認縮容活動觸發函數調用的記錄資訊。
-
在Function ComputeFC控制台的服务列表頁面,單擊服務名稱。
-
在函數管理頁面,單擊函數名稱。
-
在函數詳情頁面,單擊调用日志頁簽。
-
在请求列表頁簽的调用请求列表中,找到縮容啟用時間點對應的請求,單擊請求ID。
-
在彈出的請求詳情頁面,單擊日志详情,查看縮容活動觸發函數調用的日誌記錄。
樣本如下,從日誌中可以看出觸發縮容活動時,Auto Scaling向Function Compute傳入了需要縮容的執行個體數和當前伸縮組內的執行個體ID列表,經過函數篩選後要縮容的執行個體ID為
i-2ze2qdthrkpf****tldq,這與實際縮容的執行個體ID一致。FC Invoke Start RequestId: 000BFA95-CAA4-5D83-B643-BC51C42402CD 2024-06-13 11:28:22 000BFA95-CAA4-5D83-B643-BC51C42402CD [INFO] {'ScalingGroupARN': 'acs:ess:cn-beijing:16099825xxx:scalinggroup/asg-2e6ny5x9dtxxx', 'ScalingGroupId': 'asg-2e6ny5x9dtiaxxxg', 'CapacityToRemove': [{'ZoneId': 'cn-beijing-g', 'Capacity': 1}], 'Instances': [{'InstanceId': 'i-2ze2qdthrxxxxtldq', 'ZoneId': 'cn-beijing-g', 'InstanceType': 'ecs.c6e.large', 'ChargeType': 'SpotAsPriceGo'}, {'InstanceId': 'i-2ze2qdtxxxxtldr', 'ZoneId': 'cn-beijing-g', 'InstanceType': 'ecs.c6e.large', 'ChargeType': 'SpotAsPriceGo'}, {'InstanceId': 'i-2ze2qdthxxxxtlds', 'ZoneId': 'cn-beijing-g', 'InstanceType': 'ecs.c6e.large', 'ChargeType': 'SpotAsPriceGo'}], 'AdjustmentType': 'SystemScaleIn'} 2024-06-13 11:28:22 000BFA95-CAA4-5D83-B643-BC51C42402CD [INFO] 1 2024-06-13 11:28:22 000BFA95-CAA4-5D83-B643-BC51C42402CD [INFO] {'InstanceIds': ['i-2ze2qdtxxxxtldq']} FC Invoke End RequestId: 000BFA95-CAA4-5D83-B643-BC51C42402CD
-