基于流量請(qǐng)求數(shù)實(shí)現(xiàn)服務(wù)自動(dòng)擴(kuò)縮容
Knative on ASM中提供開(kāi)箱即用、基于流量請(qǐng)求的自動(dòng)擴(kuò)縮容KPA(Knative Pod Autoscaler)功能。當(dāng)您遇到因業(yè)務(wù)流量波動(dòng)導(dǎo)致的服務(wù)性能不穩(wěn)定或資源浪費(fèi)問(wèn)題時(shí),可以基于流量請(qǐng)求數(shù)實(shí)現(xiàn)服務(wù)自動(dòng)擴(kuò)縮容。通過(guò)監(jiān)控和分析實(shí)時(shí)流量數(shù)據(jù)動(dòng)態(tài)調(diào)整服務(wù)實(shí)例數(shù),既能保障高峰期的服務(wù)質(zhì)量和用戶體驗(yàn),又能有效節(jié)約閑置資源,在降低成本的同時(shí)提高系統(tǒng)整體效能。
前提條件
已使用Knative on ASM創(chuàng)建Knative服務(wù)。具體操作,請(qǐng)參見(jiàn)使用Knative on ASM部署Serverless應(yīng)用。
本示例以默認(rèn)域名example.com為例為您演示功能。如需使用自定義域名, 請(qǐng)參見(jiàn)在Knative on ASM中使用自定義域名。
自動(dòng)擴(kuò)縮容介紹
Knative Serving為每個(gè)Pod注入QUEUE代理容器(queue-proxy)。該容器負(fù)責(zé)向Autoscaler報(bào)告業(yè)務(wù)容器的并發(fā)指標(biāo)。接收到這些指標(biāo)之后,Autoscaler會(huì)根據(jù)并發(fā)請(qǐng)求數(shù)及縮放算法,調(diào)整Deployment的Pod數(shù)量,從而實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
并發(fā)數(shù)和QPS
并發(fā)數(shù)指同一時(shí)刻Pod的接收的請(qǐng)求數(shù);QPS指Pod每秒響應(yīng)的請(qǐng)求數(shù),即最大吞吐能力。
并發(fā)數(shù)的增加并不一定會(huì)導(dǎo)致QPS增加。應(yīng)用在訪問(wèn)壓力較大的情況下,如果并發(fā)數(shù)增加,可能導(dǎo)致系統(tǒng)超負(fù)荷工作,CPU、內(nèi)存等其他消耗導(dǎo)致系統(tǒng)性能下降,從而導(dǎo)致響應(yīng)延遲,QPS反而會(huì)下降。
算法
Knative Pod Autoscaler(KPA)基于每個(gè)Pod的平均請(qǐng)求數(shù)(或并發(fā)數(shù))進(jìn)行自動(dòng)擴(kuò)縮容,Knative默認(rèn)使用基于并發(fā)數(shù)的自動(dòng)彈性,每個(gè)Pod的最大并發(fā)數(shù)為100。此外,Knative還提供了目標(biāo)使用率(target-utilization-percentage)的概念,用于指定自動(dòng)擴(kuò)縮容的目標(biāo)使用率。
基于并發(fā)數(shù)彈性為例,Pod數(shù)計(jì)算方式如為:Pod數(shù)=并發(fā)請(qǐng)求總數(shù)/(Pod最大并發(fā)數(shù)*目標(biāo)使用率)
例如,如果服務(wù)中Pod最大并發(fā)數(shù)設(shè)置為10,目標(biāo)使用率設(shè)置為0.7,此時(shí)如果接收到了100個(gè)并發(fā)請(qǐng)求,則Autoscaler就會(huì)創(chuàng)建15個(gè)Pod(即100/(0.7*10)≈15)。
KPA基于每個(gè)Pod的平均請(qǐng)求數(shù)(或并發(fā)數(shù))來(lái)進(jìn)行自動(dòng)擴(kuò)縮容,并結(jié)合了Stable穩(wěn)定模式和Panic恐慌模式兩個(gè)概念,以實(shí)現(xiàn)精細(xì)化的彈性。
Stable穩(wěn)定模式
在穩(wěn)定模式中,KPA會(huì)在默認(rèn)的穩(wěn)定窗口期(默認(rèn)為60秒)內(nèi)計(jì)算Pod的平均并發(fā)數(shù)。根據(jù)這個(gè)平均并發(fā)數(shù),KPA會(huì)調(diào)整Pod的數(shù)量,以保持穩(wěn)定的負(fù)載水平。
Panic恐慌模式
在恐慌模式中,KPA會(huì)在恐慌窗口期(默認(rèn)為6秒)內(nèi)計(jì)算Pod的平均并發(fā)數(shù)。恐慌窗口期=穩(wěn)定窗口期*panic-window-percentage(panic-window-percentage取值是0~1,默認(rèn)是0.1)。當(dāng)請(qǐng)求突然增加導(dǎo)致當(dāng)前Pod的使用率超過(guò)恐慌窗口百分比時(shí),KPA會(huì)快速增加Pod的數(shù)量以滿足負(fù)載需求。
在KPA中,彈性生效的判斷是基于恐慌模式下計(jì)算得出的Pod數(shù)量是否超過(guò)恐慌閾值(PanicThreshold)。恐慌閾值=panic-threshold-percentage/100,panic-threshold-percentage默認(rèn)為200,即恐慌閾值默認(rèn)為2。
綜上所述,如果在恐慌模式下計(jì)算得出的Pod數(shù)量大于或等于當(dāng)前Ready Pod數(shù)量的兩倍,那么KPA將使用恐慌模式下計(jì)算得出的Pod數(shù)量進(jìn)行彈性生效;否則,將使用穩(wěn)定模式下計(jì)算得出的Pod數(shù)量。
KPA配置介紹
KPA的全局默認(rèn)配置位于kantive-serving命名空間下ConfigMap的config-autoscaler中。您可以執(zhí)行以下命令,查看config-autoscaler的默認(rèn)配置。下文介紹重點(diǎn)參數(shù)。
kubectl -n knative-serving get cm config-autoscaler -o yaml
預(yù)期輸出(已忽略代碼中的注釋部分):
apiVersion: v1
kind: ConfigMap
metadata:
name: config-autoscaler
namespace: knative-serving
data:
_example:
container-concurrency-target-default: "100"
container-concurrency-target-percentage: "0.7"
enable-scale-to-zero: "true"
max-scale-up-rate: "1000"
max-scale-down-rate: "2"
panic-window-percentage: "10"
panic-threshold-percentage: "200"
scale-to-zero-grace-period: "30s"
scale-to-zero-pod-retention-period: "0s"
stable-window: "60s"
target-burst-capacity: "200"
requests-per-second-target-default: "200"
_example
字段下展示的參數(shù)配置為默認(rèn)值。如需修改,請(qǐng)將_example
字段下相應(yīng)的字段復(fù)制到data
字段下進(jìn)行修改。
對(duì)config-autoscaler所做的修改對(duì)全局的Knative service生效。如需單獨(dú)對(duì)某個(gè)Knative service進(jìn)行修改,您可以通過(guò)Annotation注解的方式。具體操作,請(qǐng)參考下文場(chǎng)景一:設(shè)置并發(fā)請(qǐng)求數(shù)實(shí)現(xiàn)自動(dòng)擴(kuò)縮容、場(chǎng)景二:設(shè)置擴(kuò)縮容邊界實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
為KPA配置縮容至0
字段 | 描述 | 示例值 |
scale-to-zero-grace-period | 在縮容至0之前,inactive revision保留的運(yùn)行時(shí)間(最小時(shí)間為30s)。 | 30s |
stable-window | Stable模式運(yùn)行時(shí),Autoscaler在穩(wěn)定窗口期下平均并發(fā)數(shù)下的操作。此外, stable-window也可以在Revision注釋中配置,例如 | 60s |
enable-scale-to-zero | 設(shè)置字段為 | true |
配置Autoscaler的并發(fā)數(shù)
字段 | 描述 | 示例值 |
container-concurrency-target-default | 定義在指定時(shí)間(軟限制)需要多少并發(fā)請(qǐng)求,為Knative中Autoscaler的推薦配置。ConfigMap中默認(rèn)配置的并發(fā)target為100。 此外, 此字段值可以通過(guò)Revision中的 | 100 |
containerConcurrency | 限制在給定時(shí)間內(nèi)允許并發(fā)請(qǐng)求的數(shù)量。
| 0 |
container-concurrency-target-percentage | 并發(fā)百分比,即并發(fā)因子,會(huì)直接參與擴(kuò)縮容并發(fā)數(shù)計(jì)算。實(shí)際擴(kuò)縮容并發(fā)數(shù)=target(或者containerConcurrency)*container-concurrency-target-percentage。例如,如果并發(fā)數(shù)target或者containerConcurrency設(shè)置值為 | 0.7 |
配置擴(kuò)縮容邊界
通過(guò)minScale和maxScale,可以配置應(yīng)用程序提供服務(wù)的最小和最大Pod數(shù)量,以控制服務(wù)冷啟動(dòng)或者控制計(jì)算成本。
如果未設(shè)置minScale注釋,Pod將縮放至0。
如果未設(shè)置maxScale注釋,創(chuàng)建的Pod數(shù)量將沒(méi)有上限。
如果設(shè)置config-autoscaler的enable-scale-to-zero為false,Pod將縮放至1。
minScale和maxScale可以在Revision模板中按照以下方式進(jìn)行配置。
spec:
template:
metadata:
autoscaling.knative.dev/minScale: "2"
autoscaling.knative.dev/maxScale: "10"
場(chǎng)景一:設(shè)置并發(fā)請(qǐng)求數(shù)實(shí)現(xiàn)自動(dòng)擴(kuò)縮容
本場(chǎng)景將在集群中部署autoscale-go應(yīng)用,通過(guò)設(shè)置并發(fā)請(qǐng)求數(shù),基于KPA實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
關(guān)于如何使用Knative on ASM創(chuàng)建Knative服務(wù),請(qǐng)參見(jiàn)使用Knative on ASM部署Serverless應(yīng)用。
創(chuàng)建autoscale-go.yaml,設(shè)置并發(fā)目標(biāo)數(shù)為10,即
autoscaling.knative.dev/target
取值為10。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: autoscale-go namespace: default spec: template: metadata: labels: app: autoscale-go annotations: autoscaling.knative.dev/target: "10" spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
使用kubectl連接到集群,在命令行執(zhí)行以下命令部署autoscale-go。
kubectl apply -f autoscale-go.yaml
登錄ASM控制臺(tái),單擊目標(biāo)實(shí)例名稱,然后選擇 ,在服務(wù)地址區(qū)域,獲取IP。
使用Hey壓測(cè)工具,執(zhí)行30s內(nèi)保持50個(gè)并發(fā)請(qǐng)求。
關(guān)于Hey壓測(cè)工具的安裝步驟和詳細(xì)信息,請(qǐng)參見(jiàn)Hey。
說(shuō)明請(qǐng)將
xxx.xxx.xxx.xxx
替換為您實(shí)際的訪問(wèn)網(wǎng)關(guān)地址。關(guān)于如何獲取訪問(wèn)網(wǎng)關(guān)地址的具體操作,請(qǐng)參見(jiàn)獲取訪問(wèn)網(wǎng)關(guān)地址。hey -z 30s -c 50 -host "autoscale-go.default.example.com" "http://xxx.xxx.xxx.xxx?sleep=100&prime=10000&bloat=5"
預(yù)期輸出:
預(yù)期輸出表明,整個(gè)過(guò)程中共擴(kuò)容7個(gè)Pod。這是由于當(dāng)容器并發(fā)量大于目標(biāo)并發(fā)量的一定百分比后(默認(rèn)為70%),Knative會(huì)提前創(chuàng)建更多的Pod備用,避免并發(fā)量進(jìn)一步增加的情況下目標(biāo)值被突破。
場(chǎng)景二:設(shè)置擴(kuò)縮容邊界實(shí)現(xiàn)自動(dòng)擴(kuò)縮容
擴(kuò)縮容邊界指應(yīng)用程序提供服務(wù)的最小和最大Pod數(shù)量。本場(chǎng)景將在集群中部署autoscale-go應(yīng)用,通過(guò)設(shè)置應(yīng)用程序提供服務(wù)的最小和最大Pod數(shù)量實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
關(guān)于如何使用Knative on ASM創(chuàng)建Knative服務(wù),請(qǐng)參見(jiàn)使用Knative on ASM部署Serverless應(yīng)用。
創(chuàng)建autoscale-go.yaml,設(shè)置最大并發(fā)請(qǐng)求數(shù)為10,minScale最小保留實(shí)例數(shù)為1,maxScale最大擴(kuò)容實(shí)例數(shù)為3。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: autoscale-go namespace: default spec: template: metadata: labels: app: autoscale-go annotations: autoscaling.knative.dev/target: "10" autoscaling.knative.dev/minScale: "1" autoscaling.knative.dev/maxScale: "3" spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
使用kubectl連接到集群,在命令行執(zhí)行以下命令部署autoscale-go。
kubectl apply -f autoscale-go.yaml
登錄ASM控制臺(tái),單擊目標(biāo)實(shí)例名稱,然后選擇 ,在服務(wù)地址區(qū)域,獲取IP。
使用Hey壓測(cè)工具,執(zhí)行30s內(nèi)保持50個(gè)并發(fā)請(qǐng)求。
關(guān)于Hey壓測(cè)工具的安裝步驟和詳細(xì)信息,請(qǐng)參見(jiàn)Hey。
說(shuō)明請(qǐng)將
xxx.xxx.xxx.xxx
替換為您實(shí)際的訪問(wèn)網(wǎng)關(guān)地址。關(guān)于如何獲取訪問(wèn)網(wǎng)關(guān)地址的具體操作,請(qǐng)參見(jiàn)獲取訪問(wèn)網(wǎng)關(guān)地址。hey -z 30s -c 50 -host "autoscale-go.default.example.com" "http://xxx.xxx.xxx.xxx?sleep=100&prime=10000&bloat=5"
預(yù)期輸出:
預(yù)期輸出表明,整個(gè)過(guò)程中Pod最大擴(kuò)容儲(chǔ)量為3,且在無(wú)訪問(wèn)請(qǐng)求流量的情況下,Pod最小保留數(shù)量為1,即自動(dòng)擴(kuò)縮容符合預(yù)期。
相關(guān)文檔
當(dāng)您需要安全地訪問(wèn)和管理Knative構(gòu)建的微服務(wù)時(shí),可以使用ASM網(wǎng)關(guān)來(lái)實(shí)現(xiàn)HTTPS訪問(wèn),通過(guò)對(duì)服務(wù)端點(diǎn)進(jìn)行加密傳輸配置保護(hù)服務(wù)間的通信,提高整體架構(gòu)的安全性和可靠性。具體操作,請(qǐng)參見(jiàn)使用ASM網(wǎng)關(guān)實(shí)現(xiàn)HTTPS訪問(wèn)Knative服務(wù)。
當(dāng)您在進(jìn)行應(yīng)用迭代升級(jí)時(shí)面臨新版本兼容性和穩(wěn)定性挑戰(zhàn)時(shí),可以在Knative on ASM中基于流量灰度發(fā)布服務(wù)。具體操作,請(qǐng)參見(jiàn)在Knative on ASM中基于流量灰度發(fā)布服務(wù)。
您可以在Knative Service中設(shè)置CPU指標(biāo)閾值,滿足在突發(fā)高負(fù)載的場(chǎng)景下,自動(dòng)擴(kuò)縮容資源的訴求。具體操作,請(qǐng)參見(jiàn)在Knative中使用HPA。