容器柔性變配
本文介紹ACS Pod的柔性變配,以及使用柔性變配降低資源使用成本和加速應(yīng)用啟動(dòng)的實(shí)踐。
背景介紹
一般而言,Serverless Pod在生產(chǎn)階段即會(huì)以確定性的資源進(jìn)行裝箱,在整個(gè)生命周期階段其可用的CPU和內(nèi)存資源上限都是確定的。在面對(duì)復(fù)雜的生產(chǎn)環(huán)境場(chǎng)景時(shí),服務(wù)在不同的階段對(duì)算力資源的消耗可能是動(dòng)態(tài)波動(dòng)的,初期對(duì)Pod的容量規(guī)劃時(shí)可能面臨一些挑戰(zhàn),如部分應(yīng)用啟動(dòng)期間消耗大量CPU資源,長(zhǎng)時(shí)間維持在較低水位;比如部分有狀態(tài)或游戲業(yè)務(wù),在維持狀態(tài)或維持Session鏈接的情況下滿足業(yè)務(wù)上的波峰波谷。
面對(duì)這種場(chǎng)景,Serverless Pod一方面需要具有更細(xì)粒度、更靈活的規(guī)格聲明,以貼合業(yè)務(wù)的真實(shí)資源使用,另一方面如果具備動(dòng)態(tài)變更規(guī)格,在業(yè)務(wù)需要時(shí)進(jìn)行按需擴(kuò)縮容,將可以極大地降低容量規(guī)劃的難度和產(chǎn)生更貼合真實(shí)資源使用的成本支出。
ACS Pod的柔性變配可以提供一種以10秒級(jí)的低延遲完成容器的CPU資源熱變更的產(chǎn)品能力,結(jié)合ACS中提供的AVPA組件(acs-advanced-vertical-pod-autoscaler),提供多種自動(dòng)變配的能力滿足業(yè)務(wù)的規(guī)格變化場(chǎng)景。
當(dāng)前柔性變配在邀測(cè)階段,您可以提交工單申請(qǐng)進(jìn)行試用。
當(dāng)前ACS產(chǎn)品支持對(duì)
ComputeClass=general-purpose
和ComputeQoS=default
的ACS Pod CPU資源的柔性變配,最大支持原始規(guī)格的100%擴(kuò)容,最小支持原始規(guī)格的50%縮容。如一個(gè)4vCpu8Gi
的ACS Pod擴(kuò)縮容范圍是2vCpu8Gi
至8vCpu8Gi
。
適用場(chǎng)景
柔性變配目前支持變配過程不發(fā)生容器重啟,對(duì)于算力使用有一定波峰波谷的情況,都可以使用此特性來滿足,比如應(yīng)用啟動(dòng)加速、有狀態(tài)應(yīng)用原地變配、應(yīng)用的局部算力熱點(diǎn)等。
具體適用場(chǎng)景說明:
對(duì)于啟動(dòng)期間需要進(jìn)行一些編譯或預(yù)加載,使用較多算力資源,常態(tài)運(yùn)行資源回落至平穩(wěn)狀態(tài),可以通過啟動(dòng)期間分配更多CPU資源,在啟動(dòng)完成后降配至較低資源長(zhǎng)穩(wěn)運(yùn)行。
有狀態(tài)應(yīng)用,如Redis在負(fù)載增加時(shí)可以通過柔性變配進(jìn)行縱向擴(kuò)容。
在線應(yīng)用如存在部分大請(qǐng)求或長(zhǎng)連接Session導(dǎo)致的局部熱點(diǎn)壓力可以通過柔性變配進(jìn)行縱向擴(kuò)容。
前提條件
已創(chuàng)建ACS集群,且版本為1.28及以上。具體操作,請(qǐng)參見創(chuàng)建ACS集群。
已使用kubectl連接Kubernetes集群。具體操作,請(qǐng)參見獲取集群KubeConfig并通過kubectl工具連接集群。
單Pod手動(dòng)規(guī)格變配操作示例
步驟一:開啟原地變配的特性門控
登錄容器計(jì)算服務(wù)控制臺(tái),在左側(cè)導(dǎo)航欄選擇集群。
在集群頁(yè)面,單擊目標(biāo)集群ID,然后在左側(cè)導(dǎo)航欄,選擇運(yùn)維管理 > 組件管理。
在核心組件區(qū)域選擇Kube API Server > 配置。在featureGates配置項(xiàng)中填入
InPlacePodVerticalScaling=true
,開啟原地變配的特性門控。說明配置過程中Kube API Server卡片會(huì)顯示狀態(tài)為操作執(zhí)行中,當(dāng)狀態(tài)重新為已安裝時(shí),說明原地變配的特性門控開啟成功。
步驟二:對(duì)ACS Pod進(jìn)行規(guī)格變配
在集群頁(yè)面,單擊目標(biāo)集群ID,然后在左側(cè)導(dǎo)航欄,選擇
。單擊使用YAML創(chuàng)建資源,使用下面的樣例YAML進(jìn)行創(chuàng)建。YAML中的
scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'
表示為當(dāng)前Pod啟用柔性變配。apiVersion: apps/v1 kind: Deployment metadata: labels: app: demo name: demo namespace: default spec: replicas: 1 selector: matchLabels: app: demo template: metadata: annotations: scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' # 聲明開啟柔性變配 labels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default app: demo spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1' imagePullPolicy: IfNotPresent name: spring ports: - containerPort: 8080 protocol: TCP resources: limits: cpu: 1 memory: 4Gi requests: cpu: 1 memory: 4Gi
Pod Annotations配置項(xiàng)
配置項(xiàng)描述
Value
scaling.alibabacloud.com/enable-inplace-resource-resize
在創(chuàng)建Pod時(shí)指定,描述當(dāng)前ACS Pod啟用柔性變配。
true
創(chuàng)建完成后在容器組頁(yè)面點(diǎn)擊編輯,手動(dòng)把容器CPU資源從
1
修改為2
,然后點(diǎn)擊更新。通過柔性變配能力,當(dāng)前Pod不發(fā)生Pod重啟,規(guī)格就變更為
2vCpu4Gi
。
使用自動(dòng)柔性變配加速應(yīng)用啟動(dòng)示例
以一個(gè)典型Java應(yīng)用為例,在應(yīng)用啟動(dòng)階段會(huì)在類加載、字節(jié)碼編譯等動(dòng)作上消耗大量資源,而進(jìn)入穩(wěn)態(tài)后這部分資源將被釋放出來。因此從應(yīng)用快速啟動(dòng),并且在常態(tài)運(yùn)行降低成本的角度考慮,我們需要有一種方式能讓Serverless Pod在啟動(dòng)階段使用更多資源,而服務(wù)啟動(dòng)完成后將資源進(jìn)行降配。
ACS提供啟動(dòng)加速的功能,您可以通過配置描述將一個(gè)ACS Pod以聲明規(guī)格的一定倍數(shù)進(jìn)行啟動(dòng),在啟動(dòng)完成后自動(dòng)降配至原始規(guī)格。
步驟一:開啟原地變配的特性門控
請(qǐng)參見步驟一:開啟原地變配的特性門控。
步驟二:安裝acs-advanced-vertical-pod-autoscaler組件
在左側(cè)導(dǎo)航欄,選擇應(yīng)用> Helm,搜索并安裝acs-advanced-vertical-pod-autoscaler組件。具體操作,請(qǐng)參見使用Helm管理ACS應(yīng)用。
步驟三:使用柔性變配加速應(yīng)用啟動(dòng)
通過YAML創(chuàng)建一個(gè)Java的工作負(fù)載,并開啟啟動(dòng)加速特性。YAML中除了
scaling.alibabacloud.com/enable-inplace-resource-resize: 'true'
之外,還需要通過alibabacloud.com/startup-cpu-burst-factor
和alibabacloud.com/startup-cpu-burst-duration-seconds
注解來配置啟動(dòng)擴(kuò)容倍數(shù)和自動(dòng)降配時(shí)間。apiVersion: apps/v1 kind: Deployment metadata: labels: app: spring-with-burst name: spring-with-burst namespace: default spec: replicas: 1 selector: matchLabels: app: spring-with-burst template: metadata: annotations: alibabacloud.com/startup-cpu-burst-factor: '2' #設(shè)置啟動(dòng)擴(kuò)容倍數(shù)為2, 即初始2C會(huì)以4C啟動(dòng),容器Ready狀態(tài)后縮容會(huì)初始狀態(tài) alibabacloud.com/startup-cpu-burst-duration-seconds: "30" #不填則默認(rèn)在Pod Ready后30秒自動(dòng)降配 scaling.alibabacloud.com/enable-inplace-resource-resize: 'true' # 聲明開啟柔性變配 labels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default app: spring-with-burst spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/acs-demo-ns/demo-java:java-with-metrics-v1' imagePullPolicy: IfNotPresent name: spring ports: - containerPort: 8080 protocol: TCP resources: limits: cpu: 1 memory: 4Gi requests: cpu: 1 memory: 4Gi
Pod Annotations配置項(xiàng)
配置項(xiàng)描述
Value
scaling.alibabacloud.com/enable-inplace-resource-resize
在創(chuàng)建Pod時(shí)指定,描述當(dāng)前ACS Pod啟用柔性變配。
支持取值:true。
alibabacloud.com/startup-cpu-burst-factor
在創(chuàng)建Pod時(shí)指定,描述當(dāng)前ACS Pod以原始規(guī)格的倍數(shù)進(jìn)行啟動(dòng)。
支持取值:2。
說明例如原始規(guī)格為
2vCpu
,則啟動(dòng)時(shí)以4vCpu
進(jìn)行啟動(dòng)。alibabacloud.com/startup-cpu-burst-duration-seconds
在創(chuàng)建Pod時(shí)指定,描述當(dāng)前ACS Pod在啟動(dòng)完成一定秒數(shù)后進(jìn)行降配。
支持取值:大于等于30。
說明默認(rèn)值為30秒,當(dāng)Pod進(jìn)入Ready狀態(tài)30秒后進(jìn)行降配。
步驟四:觀察Pod的創(chuàng)建和服務(wù)啟動(dòng)過程
創(chuàng)建完成后,進(jìn)入應(yīng)用詳情,此時(shí)可以看到Pod以2vCpu4Gi
的規(guī)格進(jìn)行創(chuàng)建。在啟動(dòng)完成并達(dá)到預(yù)設(shè)的延遲等待時(shí)間后,Pod規(guī)格會(huì)自動(dòng)降配至1vCpu4Gi
。
查看Pod事件。
在事件頁(yè)面中選擇Pod,會(huì)透出具體的降配信息。在本示例中為
Starting to resize resource down for container: spring cpu: 2 -> 1, memory: 4Gi -> 4Gi
。查看Pod監(jiān)控。
通過監(jiān)控頁(yè)面可以看到CPU Info信息中,CPU存在一個(gè)變化的過程。