AVPA(ack-advanced-vertical-pod-autoscaler)是阿里雲推出的柔性資源變更配置組件,在基於指標的垂直伸縮能力以外,還提供了應用啟動加速能力。本文主要介紹基於CPU指標的垂直伸縮能力,從使用情境、具體的使用和配置方式以及使用限制進行介紹。
背景資訊
AVPA提供啟動加速和基於指標的垂直伸縮能力,結合ACS柔性變更配置能力,可以在不中斷服務的前提下進行原地的資源垂直伸縮,並且支援按Pod粒度處理,滿足業務的局部負載熱點產生的變更配置需求。
AVPA和社區VPA對比
|
VPA |
AVPA |
|
|
變更配置方式 |
滾動重建Pod。 |
原地熱變更配置。 |
|
變更配置範圍 |
整體同升同降。 |
執行個體獨立升降。 |
|
適用負載 |
|
|
|
適用情境 |
長期、均衡的業務負載變化。 |
周期性負載變化、突發的或不均衡的負載變化。 |
適用情境
-
遊戲業務:適用於周期性CPU負載變化,支援熱升配和熱降配。
-
線上業務:針對局部負載熱點,支援對熱點Pod進行垂直擴縮容。
使用限制
-
暫不支援和社區VPA/HPA同時使用。
-
指標彈性提供針對CPU的按指標垂直伸縮,如果CPU擴容後不再符合ACS的規格要求,會被拒絕變更配置,如
2vCpu2Gi無法繼續升配至3vCpu2Gi。同時,目標變更配置的容器需要聲明requests資源。 -
垂直擴縮容會同時調整Pod的CPU Request和Limit,在ACK和ACK Serverless情境中,彈性可能受限於節點的資源餘量情況。
-
在 ACK 和 ACK Serverless 情境下,組件
ack-virtual-node版本至少為v2.14.0。 -
當前AVPA不會生產畫像,只對存量的Pod生效, 因此增量建立的Pod會使用Workload 裡定義的原始規格進行建立。
-
當前ACS產品支援對通用型和效能型中算力品質為
ComputeQoS=default的ACS Pod 的CPU資源的柔性變更配置:-
支援柔性變更配置的資源規格上限為
16vCpu16Gi。 -
支援的變更配置範圍是原始CPU規格的100%擴容,以及原始CPU規格的50%縮容。例如,一個
2vCpu4Gi的ACS Pod擴縮容範圍是1vCpu4Gi至4vCpu4Gi。 -
柔性變更配置功能同樣會受到ACS資源規整的約束。如果變更配置後的配置規格超出了所支援的範圍,會被自動規整至最接近的資源規格。例如,一個
0.75vCpu1.5Gi的ACS Pod會被自動規整為1vCpu2Gi。
-
操作流程
本文採用一個範例工作負載和一個影子工作負載來進行示範,您可以自行決定是否部署影子工作負載。其中,範例工作負載配置AVPA,影子工作負載與範例工作負載規格相同,但不配置AVPA。通過類比真實的業務負載來進行基於CPU負載的垂直擴縮。具體流程如下:
樣本應用通過一同建立的服務作為流量入口,包括一個類比工具,可以通過介面觸發的方式來消耗指定的CPU,如在6000秒內持續消耗500毫核(0.5核)。
操作步驟
步驟一:開啟原地變更配置的特性門控
-
登入容器計算服務控制台,在左側導覽列選擇叢集列表。
-
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理。
-
在核心組件地區選取項目Kube API Server > 配置。在featureGates配置項中填入
InPlacePodVerticalScaling=true,開啟原地變更配置的特性門控。說明配置過程中Kube API Server卡片會顯示狀態為操作執行中,當狀態重新變為已安裝時,說明原地變更配置的特性門控開啟成功。
步驟二:安裝AVPA
在左側導覽列,選擇應用 > Helm,搜尋並安裝ack-advanced-vertical-pod-autoscaler組件。具體操作,請參見使用Helm管理ACS應用。
步驟三:部署應用並建立本地串連
-
建立應用YAML。您可以選擇同步建立shadow-hello-avpa.yaml,用於後續的壓測對比。
建立hello-avpa.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: hello-avpa namespace: default spec: replicas: 1 selector: matchLabels: name: hello-avpa template: metadata: annotations: scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' labels: name: hello-avpa vpa: enabled spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/simulation-resource-consumer:1.13' name: hello-avpa resources: limits: cpu: '2' memory: '4Gi' requests: cpu: '2' memory: '4Gi' --- apiVersion: v1 kind: Service metadata: name: hello-avpa-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: name: hello-avpa type: ClusterIP(可選)建立shadow-hello-avpa.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: shadow-hello-avpa namespace: default spec: replicas: 1 selector: matchLabels: name: shadow-hello-avpa template: metadata: annotations: scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' labels: vpa: enabled name: shadow-hello-avpa spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/simulation-resource-consumer:1.13' name: shadow-hello-avpa resources: limits: cpu: '2' memory: '4Gi' requests: cpu: '2' memory: '4Gi' --- apiVersion: v1 kind: Service metadata: name: shadow-avpa-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: name: shadow-hello-avpa type: ClusterIP -
部署應用。
kubectl apply -f hello-avpa.yaml kubectl apply -f shadow-hello-avpa.yaml -
通過
kubectl port-forward建立本地串連。重要請注意
kubectl port-forward建立的連接埠轉寄不具備生產層級的可靠性、安全性和擴充性,因此僅適用於開發和調試目的,不適合在生產環境使用。更多關於Kubernetes叢集內生產可用的網路方案的資訊,請參見Ingress管理。kubectl port-forward svc/hello-avpa-svc -n default 28080:80 kubectl port-forward svc/shadow-avpa-svc -n default 28081:80
步驟四:建立AVPA配置
您可以通過建立AdvancedVerticalPodAutoscaler資源配置彈性策略。
-
建立avpa.yaml。
TargetRef模式
以下為AVPA的TargetRef模式的樣本配置,旨在根據CPU使用率調整
default命名空間下名為hello-avpa的Deployment建立的Pod的資源設定。apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedVerticalPodAutoscaler metadata: name: hello-avpa namespace: default spec: metrics: - containerResource: container: hello-avpa name: cpu target: averageUtilization: 30 type: Utilization type: ContainerResource watermark: low - containerResource: container: hello-avpa name: cpu target: averageUtilization: 50 type: Utilization type: ContainerResource watermark: high scaleResourceLimit: maximum: cpu: '4' minimum: cpu: '1' scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hello-avpa部分配置項說明如下:
配置項
是否必選
說明
scaleTargetRef
是
指定目標工作負載。目前支援原生Deployment、StatefulSet、Job和OpenKruise的AdvancedStatefulSet、CloneSet。
metrics.containerResource
是
用於設定指標採集的目標資源類型,利用率閾值等:
-
container:聲明需要採集指標的目標容器名稱。 -
name:聲明要採集的指標名稱(當前支援cpu)。 -
target:聲明閾值資訊。-
type:取值為Utilization。 -
averageUtilization:平均利用率閾值。
-
說明指標計算對於ACS Pod優先基於容器的Limits資源,Limits不存在時基於Requests資源,對於Limits&Requests均未聲明的Pod暫不支援。
metrics.watermark
是
用於設定監控指標的閾實值型別:
-
low:低水位閾值,當指標計算結果低於此閾值時,在滿足時間視窗後進行縮容。 -
high:高水位閾值,當指標計算結果高於此閾值時,在滿足時間視窗後進行擴容。
metrics.type
是
用於設定指標採集的粒度,按容器粒度進行匯聚,或Pod粒度進行匯聚,預設值為
ContainerResource。說明目前支援按容器粒度進行採集和匯聚計算。
scaleResourceLimit.minimum
否
垂直伸縮時的下限(目前僅支援設定
cpu):-
cpu: 預設值為250m(毫核)。
scaleResourceLimit.maximum
否
垂直伸縮時的上限(目前僅支援設定
cpu):-
cpu: 預設值為64(核)。
Selector模式
以下為0.2.0版本引入的Selector模式配置,可以更靈活的Selector選擇目標Pod,從而簡化AVPA針對一類Pod的配置流程。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedVerticalPodAutoscaler metadata: name: hello-avpa namespace: default spec: metrics: - containerResource: container: "*" name: cpu target: averageUtilization: 30 type: Utilization type: ContainerResource watermark: low - containerResource: container: "*" name: cpu target: averageUtilization: 50 type: Utilization type: ContainerResource watermark: high scaleResourceLimit: maximum: cpu: '4' minimum: cpu: '1' # 以下為樣本的 selector 配置,可根據需求自行修改 selector: matchLabels: vpa: enabled matchExpressions: # acs pod 的通用 label,作用在所有使用 acs 算力的 pod 上 - key: alibabacloud.com/compute-class operator: Exists - key: name operator: In values: - hello-avpa # 預留一個開關,便於不希望作用的應用可以自行關閉 - key: alibabacloud.com/disable-avpa operator: DoesNotExistselector配置項區別於scaleTargetRef只能指向一個workload,可以更靈活選擇作用的Pod,滿足更多情境的指標變更配置需求。配置項
是否必選
說明
selector
否
selector和scaleTargetRef互斥,二者需擇一進行配置,以指定作用的Pod。selector模式可簡化AVPA的配置流程,從而便於對同類應用的Pod進行統一管理,無需為多個工作負載分別設定AVPA。metrics.containerResource
是
用於設定指標採集的目標資源類型,利用率閾值等:
-
container:聲明需要採集指標的目標容器名稱。
說明支援使用萬用字元
*來匹配所有容器名稱。若某一容器同時符合預設萬用字元規則以及針對單個容器的特定規則,則以針對單個容器的規則為準。
-
name:聲明要採集的指標名稱(當前支援cpu)。 -
target:聲明閾值資訊。-
type:取值為Utilization。 -
averageUtilization:平均利用率閾值。
-
metrics.watermark
是
用於設定監控指標的閾實值型別:
-
low:低水位閾值,當指標計算結果低於此閾值時,在滿足時間視窗後進行縮容。 -
high:高水位閾值,當指標計算結果高於此閾值時,在滿足時間視窗後進行擴容。
metrics.type
是
用於設定指標採集的粒度,按容器粒度進行匯聚,或Pod粒度進行匯聚,預設值為
ContainerResource。說明目前支援按容器粒度進行採集和匯聚計算。
scaleResourceLimit.minimum
否
垂直伸縮時的下限(目前僅支援設定
cpu):-
cpu: 預設值為250m(毫核)。
scaleResourceLimit.maximum
否
垂直伸縮時的上限(目前僅支援設定
cpu):-
cpu: 預設值為64(核)。
容器的資源使用率計算規則:
對於ACS Pod這類Serverless Pod情境,因其規格是基於limit資源進行生產,因此優先基於limit資源計算
,limit未設定時基於request資源計算 ,暫不支援request和limit均為設定的容器指標計算。 以下方容器聲明為例,ACS將建立出4vCpu4Gi的Pod,此時若PodMetrics指標採集CPU用量為1000m時,其CPU利用率為
... spec: containers: - resources: limits: cpu: '4' memory: '4Gi' requests: cpu: '1' memory: '4Gi' -
-
您可以通過細化控制變更配置的資源步長等資訊來建立AVPA配置。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedVerticalPodAutoscaler metadata: name: hello-avpa namespace: default spec: behavior: parallelism: 1 stabilizationWindowSeconds: 600 scaleDown: #詳細定義縮容的資源步長和策略,一般建議採用緩慢下降策略,但需要保證每次縮容的幅度能超過規整粒度 policies: - type: CpuPercent value: 10% periodSeconds: 60 - type: Cpus value: 500m periodSeconds: 60 selectPolicy: Max scaleUp: #詳細定義擴容的資源步長和策略,一般建議採用相對陡升的策略,以少量擴容次數滿足負載的增加 policies: - type: CpuPercent value: 60% periodSeconds: 60 - type: Cpus value: 500m periodSeconds: 60 selectPolicy: Max metricObserveWindowSeconds: 600 metrics: - containerResource: container: hello-avpa name: cpu target: averageUtilization: 30 type: Utilization type: ContainerResource watermark: low - containerResource: container: hello-avpa name: cpu target: averageUtilization: 50 type: Utilization type: ContainerResource watermark: high scaleResourceLimit: maximum: cpu: '4' minimum: cpu: '1' scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hello-avpaspec.behavior配置項中的scaleDown和scaleUp分別描述擴容和縮容的資源策略,包含的子配置項語義相同。配置項
是否必選
說明
policies[].type
否
-
Cpus:絕對值,變更配置的CPU資源步長絕對值。 -
CpuPercent:百分比,按當前規格的百分比計算CPU資源步長。
policies[].value
否
-
當
type配置為Cpus時使用此配置,取值可配置250m,1等。 -
當
type配置為CpuPercent時使用此配置,取值可配置為5%等百分比。
selectPolicy
否
計算策略,取值為:
-
Max:當設定多個策略時,按最大值作為目標步長。 -
Min:當設定多個策略時,按最小值作為目標步長。
metricObserveWindowSeconds
否
資料擷取的視窗時間,當指標採集點滿足此視窗時間的跨度後,開始進行指標的負載計算並判斷是否進行變更配置。單位是秒,預設值為
600秒,最小值為300秒。behavior.parallelism
否
用於配置變更配置的並行度,同時處於變更配置的Pod數量,預設值為
1。behavior.stabilizationWindowSeconds
否
變更配置的冷卻時間,單位是秒,預設值為
600秒,最小值為300秒。同時需要保證冷卻時間不比資料擷取的視窗時間metricObserveWindowSeconds小。AVPA在需要變更配置時會採用預設策略計算目標資源規格,即將
highWaterMark和lowWaterMark的平均值作為目標負載水位,計算出需要擴容或縮容的資源步長。例如,對於一個1vCpu的容器,高低閾值分別設定為60和40,當前利用率100%,則目標利用率為50%,預期擴容步長為1vCpu,擴容至2vCpu。按上述YAML中的配置,將按
和500m取最大值,即按600m步長進行擴容。 說明建議配置:陡升緩降,快速擴容滿足負載增加的需求,緩慢降配以提高穩定性。
scaleUp:採用相對大的步長進行擴容,以少量的擴容次數滿足負載訴求。如採用
type: Cpus,value: 1。scaleDown:緩慢下降,隨著負載下降小步長逐步降配,提升穩定性。如採用
type: Cpus,value: 250m。 -
-
部署配置。
kubectl apply -f avpa.yaml
步驟五:類比壓測
通過流量入口服務要求後端服務,進行CPU負載的加壓。採用相同的規格配置和施加相同的業務請求負載,觀察通過AVPA啟用了變更配置和未啟用變更配置的工作負載監控資料情況。
-
請求後端服務,進行加壓。
當前測試Pod的CPU規格為
2vCpu,我們將負載初始提高至50%左右,即消耗1000毫核,持續加壓2000s。並在之後每隔60s持續增加負載,每次多消耗100毫核,最終會在30分鐘後達到4000毫核的負載。# 初始加壓,單條命令最大加壓限制為1000毫核 curl --data "millicores=1000&durationSec=2000" http://localhost:28080/ConsumeCPU curl --data "millicores=1000&durationSec=2000" http://localhost:28081/ConsumeCPU # 持續小步長持續加壓 for i in {1..30} do sleep 60 curl --data "millicores=100&durationSec=2000" http://localhost:28080/ConsumeCPU curl --data "millicores=100&durationSec=2000" http://localhost:28081/ConsumeCPU done -
觀察監控指標。
在左側導覽列,單擊,在頁簽下查看監控資料。
-
可以看到在加壓後CPU負載不斷上升,在到達閾值10分鐘左右CPU開始升配到
2vCpu,且在30分鐘內逐步升配至4vCpu。升配完成後,CPU的整體負載明顯下降。
-
切換到影子負載的監控,可以看到CPU很快被打滿。

-
-
觀察Pod事件資訊。
通過Pod事件可以觀測到Pod在擴縮容前的模板變更配置資訊和結束事件。
在事件頁簽中選擇Pod子頁簽,可看到垂直擴縮容相關事件,包括
StartingVerticalScalingPod、InplaceResizing、InplaceResizedFinished、FinishedVerticalScalingPod。事件內容顯示 CPU request 從 2 逐步擴容至 3200m、3500m、4,整個原地調整過程耗時約 34~36 秒。 -
類比低負載縮容。
在加壓結束,CPU負載降低到閾值後,將進行逐步的縮容,將CPU加壓逐步撤除,類比低負載情況。
-
當負載逐步下降觸達到縮容閾值後,CPU將被逐步按小步長進行縮容,確保服務整體的穩定性,不會因為資源陡降而引起業務波動。
-
當負載長期處於低位後,容器的資源最終被縮容至AVPA中聲明的最小資源規格
1vCpu。

-
(可選)步驟六:清理資源
-
刪除測試工作負載、服務和AVPA資源。
kubectl delete -f hello-avpa.yaml kubectl delete -f shadow-hello-avpa.yaml -
在左側導覽列,選擇應用 > Helm,單擊ack-advanced-vertical-pod-autoscaler行操作列的刪除。
常見問題 FAQ
如何查看avpa的狀態資訊
使用kubectl命令來擷取avpa對象的即時狀態
# 樣本已經將叢集的串連資訊儲存到 ~/.kube/acs-test 檔案中,需自行準備
# export KUBECONFIG=~/.kube/acs-test
kubectl get avpa -n [namespace] [-oyaml]
可能的返回如下:
$ kubectl get avpa
NAME TARGETTYPE TARGETNAME REPLICAS UPDATING WAITING LASTSCALED AGE
hello-avpa 1 0 0 11d 11d
如何尋找正在變更配置中的執行個體資訊
v0.3.0以上版本的avpa控制器會對正在變更配置中的pod附加一個特有的標籤avpa.alibabacloud.com/resizing-lock以方便更好地定位變更配置狀態。
kubectl get po -n [ns] -lavpa.alibabacloud.com/resizing-lock
如何尋找變更配置失敗的執行個體資訊
v0.3.0以上版本的avpa控制器會記錄變更配置失敗的Kubernetes event,使用者可以在事件記錄庫中以InplaceResizedTimeoutFailed關鍵詞進行搜尋,同時增加對該失敗事件的警示配置。
對變更配置失敗事件增加警示配置可參考建立警示監控規則