ACK為Kubernetes原生的工作負載提供了資源畫像的能力,通過對資源使用量歷史資料的分析,實現了容器粒度的資源規格推薦,可以有效簡化為容器配置Request和Limit的複雜度。本文介紹如何通過控制台和命令列使用資源畫像功能。
前提條件及注意事項
僅支援ACK叢集Pro版,且滿足以下條件:
已安裝ack-koordinator組件(原ack-slo-manager),且組件版本為v0.7.1及以上,請參見ack-koordinator。
已安裝metrics-server組件,且組件版本為v0.3.8及以上。
如果節點的容器運行時為containerd,且加入叢集的時間早於2022年01月19日14:00,請重新加入節點或升級叢集至到最新版本。具體操作,請參見添加已有節點、手動升級叢集。
目前資源畫像控制台已在成本套件中開放公測,可直接存取使用。
為了確保畫像結果的準確性,建議您在開啟工作負載的資源畫像後最少觀察等待1天以上,以便累積充足的資料。
費用說明
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
資源畫像介紹
Kubernetes為容器資源管理提供了資源請求(Request)的資源語義描述。當容器指定Request時,調度器會將其與節點的資源容量(Allocatable)進行匹配,決定Pod應該分配到哪個節點。容器的Request一般基於人工經驗填寫,管理員會參考容器的歷史利用率情況、應用的壓測表現,並根據線上運行情況的反饋持續調整。
但基於人工經驗的資源規格配置模式存在以下局限性:
為了保障線上應用的穩定性,管理員通常會預留相當數量的資源Buffer來應對上下遊鏈路的負載波動,容器的Request配置會遠高於其實際的資源使用率,導致叢集資源使用率過低,造成大量資源浪費。
當叢集分配率較高時,為了提升叢集資源使用率,管理員會主動縮小Request配置,協調更多的資源容量。該操作會提升容器的部署密度,當應用流量上漲時會影響叢集的穩定性。
針對以上述問題,ack-koordinator提供資源畫像能力,實現容器粒度的資源規格推薦,降低容器配置的複雜性。ACK通過控制台提供了相應功能,便於應用管理員快速分析應用資源規格的合理性,按需進行資源規格配置的變更。同時,ACK還提供命令列的訪問方式,支援通過CRD直接對應用資源畫像進行管理。
通過控制台使用資源畫像
步驟一:安裝資源畫像
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在成本最佳化頁面,單擊資源畫像頁簽,然後在資源畫像地區,按照頁面提示開啟功能。
組件安裝或升級:按照頁面提示安裝或升級ack-koordinator組件。首次使用時,需要安裝ack-koordinator組件。
說明當前的ack-koordinator版本<0.7.0時,需進行遷移和升級。具體操作,請參見將ack-koordinator從應用市場遷移至組件中心。
畫像配置:首次使用時,在安裝或升級完成後,您可以勾選啟用預設配置控制資源畫像的開啟範圍(推薦使用),也可後續在控制台中單擊畫像配置進行調整。
單擊開啟畫像,進入資源畫像頁面。
步驟二:資源畫像策略管理
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在成本最佳化頁面,單擊資源畫像頁簽,然後單擊畫像配置。
畫像配置分為全量配置和自訂配置兩種模式,資源畫像組件安裝過程中推薦的預設配置為全量配置模式。您可以在此對配置模式和配置參數進行修改,並單擊確定生效。
全量配置模式(推薦)
全量配置模式將為所有工作負載開啟資源畫像,預設排除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(畫像值-請求值) / 請求值。 | 支援,預設篩選條件包括升配和降配。 |
建立時間 | 畫像結果的建立時間。 | - | 不支援。 |
資源變更配置 | 評估畫像結果和改配建議後,單擊資源變更配置進行資源的升降配置。更多資訊,請參見下文的步驟五:變更應用資源規格。 | - | 不支援。 |
ACK資源畫像會為工作負載的每個容器資源規格產生畫像值,通過對比畫像值(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資源的限制需要配置為整數。
配置完成後,單擊提交,將執行資源規格更新操作並自動跳轉到工作負載詳情頁。
資源規格更新後,控制器會對工作負載進行變換並重新建立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.name
String
對象的名稱。若RecommendationProfile為nonNamespaced類型,則無需指定命名空間。
spec.controllerKind
String
開啟資源畫像的工作負載類型。支援的工作負載類型包括Deployment 、StatefulSet和DaemonSet。
spec.enabledNamespaces
String
開啟資源畫像的命名空間範圍。
執行以下命令,為目標應用開啟資源畫像。
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.yaml部署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.yaml
的工作負載資源規格畫像結果樣本如下。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.yaml
)中聲明的資源規格和本步驟畫像檢測結果,以CPU為例,可以發現該容器的Request申請過大。您可以通過調小Request來節省叢集資源容量。類別
原始資源規格
資源畫像規格
CPU
8核
4.742核
步驟二:(可選)通過Prometheus查看結果
ack-koordinator組件為資源畫像結果提供了Prometheus查詢介面,您可以通過ACK提供的Prometheus監控直接查看。
如果您首次使用該功能的大盤,請確保資源畫像大盤已經升級到最新版本。關於升級的具體操作,請參見相關操作。
通過ACK控制台Prometheus監控查看資源畫像結果的具體操作如下:
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在Prometheus監控頁面,選擇
。在資源畫像頁簽,查看詳細資料,包括容器的規格(Request)、容器實際的資源使用量(Usage)以及容器的資源規格畫像值(Recommend)。更多資訊,請參見使用阿里雲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"}
重要ack-koordinator組件提供的資源畫像監控指標已於v1.5.0-ack1.14版本中更名為
koord_manager_recommender_recommendation_workload_target
,但同時對於更早版本中提供的資源畫像監控指標slo_manager_recommender_recommendation_workload_target
也仍然相容。如果您自建了Prometheus監控,建議您在升級ack-koordinator組件至v1.5.0-ack1.14版本後將監控指標切換至koord_manager_recommender_recommendation_workload_target
。
FAQ
資源畫像的演算法原理是什嗎?
資源畫像演算法涉及一套多維度資料模型,演算法原理可以總結為以下幾點:
資源畫像演算法會持續不斷地收集容器的資源使用資料,取CPU和記憶體的彙總統計值生產畫像結果。
針對時間這一因素進行了最佳化,在彙總統計時,較新的資料採樣點會擁有更高的權重。
演算法參考了容器出現OOM等運行狀態資訊,可以進一步提高畫像值的準確性。
資源畫像對應用的類型有什麼要求?
適合於線上服務類應用使用。
目前資源畫像的結果優先考慮滿足容器的資源需求,確保可以覆蓋絕大部分資料樣本。不過對於離線應用來說,這種批處理類型的任務更加關注整體的吞吐,可以接受一定程度的資源競爭,以提高叢集資源的整體利用率,畫像結果對於離線應用來說會顯得有些保守。此外,對於關鍵的系統組件,通常以“主備”的形式部署多個副本,處於“備份”角色的副本長期處於閑置狀態,這些副本的資源用量樣本也會對畫像演算法產生一定程度的幹擾。針對以上情境,請對畫像結果按需加工後再使用,後續您可持續關注資源畫像的產品動態。
是否可以直接使用畫像值來設定容器的Request和Limit?
需要結合業務自身特點來判斷,資源畫像提供的結果是對應用當前資源需求情況的總結,管理員應結合應用自身特性,在畫像值的基礎之上加工後使用,例如考慮留有一定的容量來應對流量高峰,或是做“同城雙活”的無縫切換,都需要留有一定數量的資源冗餘;或者應用對資源較為敏感,無法在宿主機負載較高時平穩運行,也需要在畫像值的基礎上調高規格。
自建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 slo_manager_recommender_recommendation_workload_target
# 預期輸出(具體以實際情況為準)
# HELP slo_manager_recommender_recommendation_workload_target Recommendation of workload resource request.
# TYPE slo_manager_recommender_recommendation_workload_target gauge
slo_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
slo_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+09
ack-koordinator組件安裝後,會自動建立Service和Service Monitor對象,關聯對應的Pod。如果您正在使用阿里雲Promethus,那麼這些指標會被自動採集,並展示在對應的Grafana大盤上。
由於Prometheus有多種採集方式,如果您使用的是自建Prometheus,請自行參見Prometheus官方文檔進行配置,並在配置過程中參考以上過程進行調試。調試完成後,您可參見步驟二:(可選)通過Prometheus查看結果,在環境中配置對應的Grafana監控大盤。
如何清理資源畫像結果和規則?
資源畫像結果和規則分別儲存在Recommendation和RecommendationProfile兩個CRD中,執行以下命令刪除所有資源畫像結果和規則。
# 刪除所有資源畫像結果。
kubectl delete recommendation -A --all
# 刪除所有資源畫像規則。
kubectl delete recommendationprofile -A --all
如何為子帳號使用資源畫像進行授權?
ACK的授權體系包含對基礎資源層的RAM授權和對ACK叢集層的RBAC(Role-Based Access Control)授權兩部分,有關ACK的授權體系介紹,請參見授權最佳實務。若您希望為某一子帳號授權使用叢集的資源畫像功能,推薦您參考以下最佳實務進行授權:
RAM授權
您可以使用主帳號登入Resource Access Management控制台,為該子帳號授予系統內建的AliyunCSFullAccess許可權。具體操作,請參見授權概述。
RBAC授權
完成RAM授權後,您還需要為該子帳號授予目的地組群中開發人員或以上的RBAC許可權。具體操作,請參見叢集資源許可權(RBAC授權)。
系統預置的開發人員或以上的RBAC許可權擁有對叢集中所有Kubernetes資源的讀寫權限。若您希望對子帳號授予更精細化的許可權,可以參考自訂RBAC授權策略建立或編輯自訂ClusterRole執行個體。資源畫像功能需要為ClusterRole添加如下內容:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: recommendation-clusterrole
- apiGroups:
- autoscaling.alibabacloud.com
resources:
- '*'
verbs:
- '*'