Container Compute Service (ACS)為Kubernetes原生的工作負載提供了資源畫像的能力,通過對資源使用量歷史資料的分析,實現了容器粒度的資源規格推薦,可以有效降低配置容器資源請求(Request)和限制(Limit)的複雜度。本文介紹如何在ACS叢集中通過命令列方式使用資源畫像功能。
前提條件及注意事項
已安裝ack-koordinator組件。具體操作,請參見ack-koordinator。
為了確保畫像結果的準確性,建議您在開啟工作負載的資源畫像後觀察等待1天以上,以便累積充足的資料。
費用說明
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
使用限制
組件 | 版本要求 |
≥v0.3.9.7 | |
≥v1.5.0-ack1.14 |
資源畫像介紹
Kubernetes為容器資源管理提供了資源請求(Request)的資源語義描述。當容器指定resources.requests時,調度器會將其與節點的資源容量(Allocatable)進行匹配,決定Pod應該分配到哪個節點。容器的資源請求一般基於人工經驗填寫,管理員會參考容器的歷史利用率情況、應用的壓測表現,並根據線上運行情況的反饋持續調整。但基於人工經驗的資源規格配置模式存在以下局限性:
為了保障線上應用的穩定性,管理員通常會預留超量的資源Buffer來應對上下遊鏈路的負載波動,容器的Request配置會遠高於其實際的資源使用率,導致叢集資源使用率過低,造成大量資源浪費。
當叢集分配率較高時,為了提升叢集資源使用率,管理員會主動縮小Request配置,協調更多的資源容量。該操作會提升容器的部署密度,當應用流量上漲時會影響叢集的穩定性。
針對以上述問題,ack-koordinator提供資源畫像能力,實現容器粒度的資源規格推薦,降低配置容器資源的複雜性。ACS提供通過命令列訪問資源畫像的方式,支援通過CRD直接對應用資源畫像進行管理。
通過控制台使用資源畫像
步驟一:開啟資源畫像
登入容器計算服務控制台,在左側導覽列選擇叢集。
在叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇。
在成本最佳化頁面,單擊資源畫像頁簽,然後在資源畫像地區,按照頁面提示開啟功能。
安裝或升級組件:按照頁面提示安裝或升級ack-koordinator組件。首次使用時,需要安裝ack-koordinator組件。
畫像配置:首次使用時,在安裝或升級組件完成後,您可以勾選啟用預設配置控制資源畫像的開啟範圍(推薦使用),也可後續在控制台中單擊畫像配置進行調整。
單擊開啟畫像,進入資源畫像頁面。
步驟二:資源畫像配置
在成本最佳化頁面,單擊資源畫像頁簽,然後單擊畫像配置。
畫像配置分為全量配置和自訂配置兩種模式,資源畫像組件安裝過程中推薦的預設配置為全量配置模式。您可以在此對配置模式和配置參數進行修改,完成後單擊確定生效。
全量配置模式(推薦)
全量配置模式將為所有工作負載開啟資源畫像,預設排除arms-prom和kube-system兩個系統命名空間。

配置項
說明
取值範圍
排除的命名空間
不開啟資源畫像的命名空間,一般為系統組件對應的命名空間。最終開啟範圍為命名空間和負載類型的交集。
當前叢集內已經存在的命名空間,支援多選,預設值為kube-system和arms-prom。
開啟的負載類型
開啟資源畫像的負載類型範圍。最終開啟範圍為命名空間和負載類型的交集。
支援K8s原生的工作負載,包括Deployment、StatefulSet和DaemonsSet,支援多選。
CPU/記憶體資源消耗冗餘
產生資源畫像參考的安全冗餘水位,詳見下文描述。
要求為非負數,提供三檔常用的冗餘度70%、50%、30%。
自訂配置模式
自訂配置模式僅開啟一部分命名空間的工作負載,若您的叢集規模較大(例如1000節點以上),或僅需試用開啟一部分工作負載,可以通過自訂配置模式按需指定。

配置項
說明
取值範圍
開啟的命名空間
開啟資源畫像的命名空間,最終開啟範圍為命名空間和負載類型的交集。
當前叢集內已經存在的命名空間,支援多選。
負載類型
開啟資源畫像的負載類型範圍,最終開啟範圍為命名空間和負載類型的交集。
支援K8s原生的三類工作負載,包括Deployment、StatefulSet和DaemonsSet,支援多選。
CPU/記憶體資源消耗冗餘
產生資源畫像參考的安全冗餘水位,詳見下文描述。
要求為非負數,提供三檔常用的冗餘度(70%、50%、30%)。
說明資源消耗冗餘:管理員在評估應用業務容量時(例如QPS),通常不會將實體資源使用到100%。這既包括超執行緒等實體資源的局限性,也包括應用自身需要保留部分資源以應對高峰時段的負載請求。當畫像值與原始資源請求的差距超過安全冗餘時,會提示降配建議,具體演算法參見應用畫像概覽部分中有關畫像建議的說明。

步驟三:查看應用畫像概覽
資源畫像的策略配置完成後,您可以在資源畫像頁面查看各工作負載的資源畫像情況。
為提高畫像結果準確性,首次使用時系統將提示需要至少累積24小時的資料。

畫像總體概覽以及各列的詳細說明如下表所示。
說明下表中的“-”代表不涉及。
列名
含義
取值說明
是否支援欄位篩選
工作負載名稱
對應工作負載的名字(Name)。
-
支援。可在功能表列頂部按名稱進行精確尋找。
命名空間
對應工作負載的名字(Namespace)
-
支援。預設篩選條件中不包括kube-system命名空間。
工作負載類型
對應工作負載的類型。
包括Deployment、DaemonSet和StatefulSet三種類型。
支援。預設篩選條件為全部。
CPU請求
工作負載Pod的CPU資源申請量(Request)。
-
不支援。
記憶體請求
工作負載Pod的記憶體資源申請量。
-
不支援。
畫像資料狀態
工作負載資源畫像。
收集中:資源畫像剛建立,累積的資料較少,首次使用時建議至少等待一天以上,確保工作負載穩定運行一段時間,完整覆蓋了流量的波峰波穀之後再使用。
正常:資源畫像結果已經產生。
工作負載已刪除:對應的工作負載已經刪除,畫像結果將在保留一段時間後自動刪除。
不支援。
CPU畫像、記憶體畫像
資源畫像針對工作負載原始的資源請求量給出的規格(Request)調整建議,建議參考了資源畫像值、原始資源請求量(Request)以及畫像策略配置的資源消耗冗餘。
包括升配、降配以及保持三種。對應的百分比為偏差幅度。計算公式為:Abs(畫像值 - 原始請求量) / 原始請求量。
支援,預設篩選條件包括升配和降配。
建立時間
畫像結果的建立時間。
-
不支援。
資源變更配置
評估畫像結果和改配建議後,單擊資源變更配置進行資源的升降配置。更多資訊,請參見下文的步驟五:變更應用資源規格。
-
不支援。
說明ACS資源畫像會為工作負載的每個容器資源規格產生畫像值,通過對比畫像值(Recommend)、原始資源請求量(Request),以及畫像配置的資源消耗冗餘(Buffer)。資源畫像控制台會為工作負載產生操作的提示,例如對資源請求提高或降低(即升配或降配)。若工作負載有多個容器,則會提示偏差幅度最大的容器,具體計算原理如下。
畫像值(Recommend)大於原始資源請求量(Request):表示容器長期處於資源超用狀態(使用量大於申請量),存在穩定性風險,應及時提高資源規格,控制台提示“建議升配”。
畫像值(Recommend)小於原始資源請求量(Request):表示容器可能有一定程度的資源浪費,可以降低資源規格,需要結合畫像配置的資源消耗冗餘進行判斷,詳情如下:
根據畫像值和配置的資源消耗冗餘,計算目標資源規格(Target):
Target = Recommend * (1 + Buffer)計算目標資源規格(Target)與原始資源請求量(Request)的偏離程度(Degree):
Degree = 1 - Request / Target根據畫像值以及偏離程度(Degree)的水位,產生CPU和記憶體建議的提示操作,若偏離程度(Degree)的絕對值大於0.1,則提示建議降配資訊
針對其他情況,資源畫像為應用資源規格建議的提示為保持,表示可以暫時不調整。
步驟四:查看應用畫像詳情
在資源畫像頁面,單擊工作負載名稱,進入對應的畫像詳情頁面。
詳情頁包括三部分功能:工作負載基本資料、各容器的畫像詳情資源曲線、針對應用進行資源規格變更視窗。
如上圖所示,以CPU為例,畫像詳情資源曲線中各項指標的含義如下。曲線名稱
含義
cpu limit
容器的CPU資源限制值。
cpu request
容器的CPU資源請求值。
cpu recommend
容器的CPU資源畫像值。
cpu usage(average)
對應工作負載內,各容器副本CPU使用量的平均值。
cpu usage(max)
對應工作負載內,各容器副本CPU使用量的最大值。
步驟五:變更應用資源規格
在應用畫像詳情頁面底部的資源變更配置地區,根據畫像產生的畫像值修改各容器的資源規格。
各列含義如下:

配置項
含義
當前所需資源
容器當前填寫的資源請求量(Request)。
當前限制資源
容器當前填寫的資源限制量(Limit)。
畫像值
資源畫像為容器產生的畫像值,可作為資源請求量(Request)的參考值。
安全冗餘
資源畫像策略管理中配置的安全冗餘,可作為目標所需資源的參考值,例如在畫像值的基礎上累加冗餘係數(如上圖4.28 * 1.3 = 5.6)。
目標所需資源
容器資源請求量(Request)計劃調整的目標值。
目標限制資源
容器資源限制量(Limit)計劃調整的目標值。注意,若工作負載使用了CPU拓撲感知調度,CPU資源的限制需要配置為整數。
重要資源畫像產生的畫像值為演算法計算出來的實際推薦值。若您點擊應用按鈕執行資源變更配置,ACS會針對不同的計算類型規整應用的資源規格,請參見資源規格。
配置完成後,單擊應用並確定對工作負載變換,將執行資源規格更新操作並自動跳轉到工作負載詳情頁。
重要資源規格更新後,控制器會對工作負載進行變換並重新建立Pod,請謹慎操作。
通過命令列使用資源畫像
步驟一:啟用資源畫像
使用以下YAML內容,建立
recommendation-profile.yaml檔案,開啟工作負載的資源畫像。建立RecommendationProfile CRD,可以開啟工作負載的資源畫像,並擷取容器的資源規格畫像資料。RecommendationProfile CRD支援通過命名空間(Namespace)以及工作負載類型控制開啟範圍,開啟範圍為二者的交集。
apiVersion: autoscaling.alibabacloud.com/v1alpha1 kind: RecommendationProfile metadata: # 對象名稱,nonNamespaced類型不需指定命名空間。 name: profile-demo spec: # 開啟資源畫像的工作負載類型。 controllerKind: - Deployment # 開啟資源畫像的命名空間範圍。 enabledNamespaces: - default各項配置欄位含義如下:
參數
類型
說明
metadata.nameString
對象的名稱。若RecommendationProfile為nonNamespaced類型,則無需指定命名空間。
spec.controllerKindString
開啟資源畫像的工作負載類型。支援的工作負載類型包括Deployment 、StatefulSet和DaemonSet。
spec.enabledNamespacesString
開啟資源畫像的命名空間範圍。
執行以下命令,為目標應用開啟資源畫像。
kubectl apply -f recommender-profile.yaml使用以下YAML內容,建立
cpu-load-gen.yaml檔案。apiVersion: apps/v1 kind: Deployment metadata: name: cpu-load-gen labels: app: cpu-load-gen spec: replicas: 2 selector: matchLabels: app: cpu-load-gen-selector template: metadata: labels: app: cpu-load-gen-selector spec: containers: - name: cpu-load-gen image: registry.cn-zhangjiakou.aliyuncs.com/acs/slo-test-cpu-load-gen:v0.1 command: ["cpu_load_gen.sh"] imagePullPolicy: Always resources: requests: cpu: 8 # 該應用的CPU請求資源為8核。 memory: "1Gi" limits: cpu: 12 memory: "2Gi"執行以下命令,安裝部署cpu-load-gen應用。
kubectl apply -f cpu-load-gen.yaml執行以下命令,擷取資源規格畫像結果。
kubectl get recommendations -l \ "alpha.alibabacloud.com/recommendation-workload-apiVersion=apps-v1, \ alpha.alibabacloud.com/recommendation-workload-kind=Deployment, \ alpha.alibabacloud.com/recommendation-workload-name=cpu-load-gen" -o yaml說明為了確保畫像結果的準確性,建議您觀察等待1天以上,以便累積充足的資料。
ack-koordinator為每個開啟資源畫像的工作負載產生對應的資源規格畫像,並將結果儲存在Recommendation CRD中。名為
cpu-load-gen的工作負載資源規格畫像結果樣本如下。apiVersion: autoscaling.alibabacloud.com/v1alpha1 kind: Recommendation metadata: labels: alpha.alibabacloud.com/recommendation-workload-apiVersion: app-v1 alpha.alibabacloud.com/recommendation-workload-kind: Deployment alpha.alibabacloud.com/recommendation-workload-name: cpu-load-gen name: f20ac0b3-dc7f-4f47-b3d9-bd91f906**** namespace: recommender-demo spec: workloadRef: apiVersion: apps/v1 kind: Deployment name: cpu-load-gen status: recommendResources: containerRecommendations: - containerName: cpu-load-gen target: cpu: 4742m memory: 262144k originalTarget: # 表示資源畫像演算法的中間結果,不建議直接使用。 # ...為了便於檢索,Recommendation和工作負載的Namespace一致,同時在Label中儲存了工作負載的API Version、類型以及名稱,格式如下表所示。
Label Key
說明
樣本
alpha.alibabacloud.com/recommendation-workload-apiVersion工作負載的API Version,由Kubernetes的Label規範約束,正斜線(/)將被替換為短劃線(-)。
app-v1(替換前為app/v1)
alpha.alibabacloud.com/recommendation-workload-kind對應的工作負載類型,例如Deployment、StatefulSet等。
Deployment
alpha.alibabacloud.com/recommendation-workload-name工作負載名稱,由Kubernetes的Label規範約束,長度不能超過63個字元。
cpu-load-gen
各容器的資源規格畫像結果儲存在
status.recommendResources.containerRecommendations中,各欄位含義如下表所示。欄位名稱
含義
格式
樣本
containerName表示容器名稱。
string
cpu-load-gen
target表示資源規格畫像結果,包括CPU和Memory兩個維度。
map[ResourceName]resource.Quantity
cpu: 4742mmemory: 262144k
originalTarget表示資源規格畫像演算法的中間結果,不建議直接使用。
-
-
說明單個Pod畫像的CPU最小值為0.025核,記憶體的最小值為250 MB。
通過對比目標應用
cpu-load-gen中聲明的資源規格和本步驟畫像檢測結果,以CPU為例,可以發現該容器的Request申請過大。您可以通過調小Request來節省叢集資源容量。類別
原始資源規格
資源畫像規格
CPU
8核
4.742核
步驟二:(可選)通過Prometheus查看結果
ack-koordinator組件為資源畫像結果提供了Prometheus查詢介面。如果您使用了自建Prometheus監控,請參考以下監控項來配置大盤。
#指定工作負載中容器的CPU資源規格畫像。
koord_manager_recommender_recommendation_workload_target{exported_namespace="$namespace", workload_name="$workload", container_name="$container", resource="cpu"}
#指定工作負載中容器的Memory資源規格畫像。
koord_manager_recommender_recommendation_workload_target{exported_namespace="$namespace", workload_name="$workload", container_name="$container", resource="memory"}FAQ
資源畫像的演算法原理是什嗎?
資源畫像演算法涉及一套多維度資料模型,演算法原理可以總結為以下幾點:
資源畫像演算法會持續不斷地收集容器的資源使用資料,計算CPU和記憶體使用量量的採樣峰值、加權平均、分位值等彙總統計值。
最終給出的畫像結果中,將CPU的推薦值設定為P95分位值,將記憶體的推薦值設定為P99分位值,並為二者再加上一定的安全邊際,以確保工作負載的可靠性。
針對時間這一因素進行了最佳化。通過半衰期滑動視窗模型進行彙總統計,較新的資料採樣點會擁有更高的權重。
演算法參考了容器出現OOM等運行狀態資訊,可以進一步提高畫像值的準確性。
更多資訊,請參見資源畫像技術原理介紹和資源畫像原理介紹及使用建議。
資源畫像對應用的類型有什麼要求?
適合於線上服務類應用使用。
目前資源畫像的結果優先考慮滿足容器的資源需求,確保可以覆蓋絕大部分資料樣本。不過對於離線應用來說,這種批處理類型的任務更加關注整體的吞吐,可以接受一定程度的資源競爭,以提高叢集資源的整體利用率,畫像結果對於離線應用來說會顯得有些保守。此外,對於關鍵的系統組件,通常以“主備”的形式部署多個副本,處於“備份”角色的副本長期處於閑置狀態,這些副本的資源用量樣本也會對畫像演算法產生一定程度的幹擾。針對以上情境,請對畫像結果按需加工後再使用,後續您可持續關注資源畫像的產品動態。
是否可以直接使用畫像值來設定容器的Request和Limit?
需要結合業務自身特點來判斷,資源畫像提供的結果是對應用當前資源需求情況的總結,管理員應結合應用自身特性,在畫像值的基礎之上加工後使用,例如考慮留有一定的容量來應對流量高峰,或是做“同城雙活”的無縫切換,都需要留有一定數量的資源冗餘;或者應用對資源較為敏感,無法在宿主機負載較高時平穩運行,也需要在畫像值的基礎上調高規格。
為什麼參考畫像值設定規格後,仍然提示需要升配或降配?
資源畫像產生的畫像值為演算法計算出來的實際推薦值。若您點擊應用按鈕執行資源變更配置,ACS會針對不同的計算類型規整應用的資源規格,詳見資源規格。規整後的應用規格與您設定的規格可能會有一定差異。
自建Prometheus如何查看資源畫像監控指標?
資源畫像的相關監控指標會在ack-koordinator組件的Koordinator Manager模組以Promethus的格式提供HTTP介面。您可以執行以下命令擷取Pod IP,訪問並查看指標資料。
# 執行以下命令擷取Pod IP地址
$ kubectl get pod -A -o wide | grep koord-manager
# 預期輸出,具體以實際情況為準
kube-system ack-koord-manager-5479f85d5f-7xd5k 1/1 Running 0 19d 192.168.12.242 cn-beijing.192.168.xx.xxx <none> <none>
kube-system ack-koord-manager-5479f85d5f-ftblj 1/1 Running 0 19d 192.168.12.244 cn-beijing.192.168.xx.xxx <none> <none>
# 執行以下命令查看指標資料(注意Koordinator Manager是雙副本主備模式,資料只會在主副本Pod中提供)
# 其中IP地址和連接埠請參考Koordinator Manager模組對應的Deployment配置
# 訪問前請確保當前執行命令的宿主機能與叢集的容器網路互連。
$ curl -s http://192.168.12.244:9326/metrics | grep koord_manager_recommender_recommendation_workload_target
# 預期輸出(具體以實際情況為準)
# HELP koord_manager_recommender_recommendation_workload_target Recommendation of workload resource request.
# TYPE koord_manager_recommender_recommendation_workload_target gauge
koord_manager_recommender_recommendation_workload_target{container_name="xxx",namespace="xxx",recommendation_name="xxx",resource="cpu",workload_api_version="apps/v1",workload_kind="Deployment",workload_name="xxx"} 2.406
koord_manager_recommender_recommendation_workload_target{container_name="xxx",namespace="xxx",recommendation_name="xxx",resource="memory",workload_api_version="apps/v1",workload_kind="Deployment",workload_name="xxx"} 3.861631195e+09ack-koordinator組件安裝後,會自動建立Service和Service Monitor對象,關聯對應的Pod。
由於Prometheus有多種採集方式,如果您使用的是自建Prometheus,請自行參見Prometheus官方文檔進行配置,並在配置過程中參考以上過程進行調試。調試完成後,您可參見步驟二:(可選)通過Prometheus查看結果,在環境中配置對應的Grafana監控大盤。
如何清理資源畫像結果和規則?
資源畫像結果和規則分別儲存在Recommendation和RecommendationProfile兩個CRD中,執行以下命令刪除所有資源畫像結果和規則。
# 刪除所有資源畫像結果。
kubectl delete recommendation -A --all
# 刪除所有資源畫像規則。
kubectl delete recommendationprofile -A --all如何為子帳號使用資源畫像進行授權?
Container Compute Service (ACS)的授權體系包含對基礎資源層的RAM授權和對ACS叢集層的RBAC(Role-Based Access Control)授權兩部分,有關容器計算服務的授權體系介紹,請參見授權最佳實務。若您希望為某一子帳號授權使用叢集的資源畫像功能,推薦您參考以下最佳實務進行授權:
RAM授權
您可以使用主帳號登入Resource Access Management控制台,為該子帳號授予系統內建的AliyunAccReadOnlyAccess唯讀許可權。具體操作,請參見系統策略授權。
RBAC授權
完成RAM授權後,您還需要為該子帳號授予目的地組群中開發人員或以上的RBAC許可權。具體操作,請參見配置RAM使用者或RAM角色RBAC許可權。
系統預置的開發人員或以上的RBAC許可權擁有對叢集中所有Kubernetes資源的讀寫權限。若您希望對子帳號授予更精細化的許可權,可以參考自訂RBAC授權策略建立或編輯自訂ClusterRole執行個體。資源畫像功能需要為ClusterRole添加如下內容:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: recommendation-clusterrole
- apiGroups:
- autoscaling.alibabacloud.com
resources:
- '*'
verbs:
- '*'