Knative on ASM中提供開箱即用、基於流量請求的自動擴縮容KPA(Knative Pod Autoscaler)功能。當您遇到因業務流量波動導致的服務效能不穩定或資源浪費問題時,可以基於流量請求數實現服務自動擴縮容。通過監控和分析即時資料流量資料動態調整服務執行個體數,既能保障高峰期的服務品質和使用者體驗,又能有效節約閑置資源,在降低成本的同時提高系統整體效能。
前提條件
已使用Knative on ASM建立Knative服務。具體操作,請參見使用Knative on ASM部署Serverless應用。
本樣本以預設網域名稱example.com為例為您示範功能。如需使用自訂網域名, 請參見在Knative on ASM中使用自訂網域名。
自動擴縮容介紹
Knative Serving為每個Pod注入QUEUE代理容器(queue-proxy)。該容器負責向Autoscaler報告業務容器的並髮指標。接收到這些指標之後,Autoscaler會根據並發請求數及縮放演算法,調整Deployment的Pod數量,從而實現自動擴縮容。

並發數和QPS
並發數指同一時刻Pod的接收的請求數;QPS指Pod每秒響應的請求數,即最大吞吐能力。
並發數的增加並不一定會導致QPS增加。應用在訪問壓力較大的情況下,如果並發數增加,可能導致系統超負荷工作,CPU、記憶體等其他消耗導致系統效能下降,從而導致響應延遲,QPS反而會下降。
演算法
Knative Pod Autoscaler(KPA)基於每個Pod的平均請求數(或並發數)進行自動擴縮容,Knative預設使用基於並發數的自動彈性,每個Pod的最大並發數為100。此外,Knative還提供了目標使用率(target-utilization-percentage)的概念,用於指定自動擴縮容的目標使用率。
基於並發數彈性為例,Pod數計算方式如為:Pod數=並發請求總數/(Pod最大並發數*目標使用率)
例如,如果服務中Pod最大並發數設定為10,目標使用率設定為0.7,此時如果接收到了100個並發請求,則Autoscaler就會建立15個Pod(即100/(0.7 x 10)≈15)。
KPA基於每個Pod的平均請求數(或並發數)來進行自動擴縮容,並結合了Stable穩定模式和Panic恐慌模式兩個概念,以實現精細化的彈性。
Stable穩定模式
在穩定模式中,KPA會在預設的穩定視窗期(預設為60秒)內計算Pod的平均並發數。根據這個平均並發數,KPA會調整Pod的數量,以保持穩定的負載水平。
Panic恐慌模式
在恐慌模式中,KPA會在恐慌視窗期(預設為6秒)內計算Pod的平均並發數。
恐慌視窗期=穩定視窗期 x panic-window-percentage(panic-window-percentage取值是0~1,預設是0.1)。當請求突然增加導致當前Pod的使用率超過恐慌視窗百分比時,KPA會快速增加Pod的數量以滿足負載需求。
在KPA中,彈性生效的判斷是基於恐慌模式下計算得出的Pod數量是否超過恐慌閾值(PanicThreshold)。恐慌閾值=panic-threshold-percentage/100,panic-threshold-percentage預設為200,即恐慌閾值預設為2。
綜上所述,如果在恐慌模式下計算得出的Pod數量大於或等於當前Ready Pod數量的兩倍,那麼KPA將使用恐慌模式下計算得出的Pod數量進行彈性生效;否則,將使用穩定模式下計算得出的Pod數量。
KPA配置介紹
KPA的全域預設配置位於kantive-serving命名空間下ConfigMap的config-autoscaler中。您可以執行以下命令,查看config-autoscaler的預設配置。下文介紹重點參數。
kubectl -n knative-serving get cm config-autoscaler -o yaml
預期輸出(已忽略代碼中的注釋部分):
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欄位下展示的參數配置為預設值。如需修改,請將_example欄位下相應的欄位複製到data欄位下進行修改。
對config-autoscaler所做的修改對全域的Knative service生效。如需單獨對某個Knative service進行修改,您可以通過Annotation註解的方式。具體操作,請參考下文情境一:設定並發請求數實現自動擴縮容、情境二:設定擴縮容邊界實現自動擴縮容。
為KPA配置縮容至0
|
欄位 |
描述 |
樣本值 |
|
scale-to-zero-grace-period |
在縮容至0之前,inactive revision保留的已耗用時間(最小時間為30s)。 |
30s |
|
stable-window |
Stable模式運行時,Autoscaler在穩定視窗期下平均並發數下的操作。此外, stable-window也可以在Revision注釋中配置,例如 |
60s |
|
enable-scale-to-zero |
設定欄位為 |
true |
配置Autoscaler的並發數
|
欄位 |
描述 |
樣本值 |
|
container-concurrency-target-default |
定義在指定時間(軟式節流)需要多少並發請求,為Knative中Autoscaler的推薦配置。ConfigMap中預設配置的並發target為100。 此外, 此欄位值可以通過Revision中的 |
100 |
|
containerConcurrency |
限制在給定時間內允許並發請求的數量。
|
0 |
|
container-concurrency-target-percentage |
並發百分比,即並發因子,會直接參与擴縮容並發數計算。實際擴縮容並發數=target(或者containerConcurrency)*container-concurrency-target-percentage。例如,如果並發數target或者containerConcurrency設定值為 |
0.7 |
配置擴縮容邊界
通過minScale和maxScale,可以配置應用程式提供服務的最小和最大Pod數量,以控制服務冷啟動或者控制計算成本。
-
如果未設定minScale注釋,Pod將縮放至0。
-
如果未設定maxScale注釋,建立的Pod數量將沒有上限。
-
如果設定config-autoscaler的enable-scale-to-zero為false,Pod將縮放至1。
minScale和maxScale可以在Revision模板中按照以下方式進行配置。
spec:
template:
metadata:
autoscaling.knative.dev/minScale: "2"
autoscaling.knative.dev/maxScale: "10"
情境一:設定並發請求數實現自動擴縮容
本情境將在叢集中部署autoscale-go應用,通過設定並發請求數,基於KPA實現自動擴縮容。
關於如何使用Knative on ASM建立Knative服務,請參見使用Knative on ASM部署Serverless應用。
-
建立autoscale-go.yaml,設定並發目標數為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串連到叢集,在命令列執行以下命令部署autoscale-go。
kubectl apply -f autoscale-go.yaml -
登入ASM控制台,單擊目標執行個體名稱,然後選擇,在服務地址地區,擷取IP。
-
使用Hey壓測工具,執行30s內保持50個並發請求。
關於Hey壓測工具的安裝步驟和詳細資料,請參見Hey。
說明請將
xxx.xxx.xxx.xxx替換為您實際的訪問網關地址。關於如何擷取訪問網關地址的具體操作,請參見擷取訪問網關地址。hey -z 30s -c 50 -host "autoscale-go.default.example.com" "http://xxx.xxx.xxx.xxx?sleep=100&prime=10000&bloat=5"(base) xxx .kube % kubectl get deploy -w NAME READY UP-TO-DATE AVAILABLE AGE autoscale-go-00001-deployment 0/0 0 0 7m5s autoscale-go-00001-deployment 0/1 0 0 7m17s autoscale-go-00001-deployment 0/1 0 0 7m17s autoscale-go-00001-deployment 0/1 0 0 7m17s autoscale-go-00001-deployment 0/1 1 0 7m17s autoscale-go-00001-deployment 0/7 1 0 7m18s autoscale-go-00001-deployment 0/7 1 0 7m18s autoscale-go-00001-deployment 0/7 1 0 7m18s autoscale-go-00001-deployment 0/7 7 0 7m18s autoscale-go-00001-deployment 1/7 7 1 7m19s autoscale-go-00001-deployment 2/7 7 2 7m20s autoscale-go-00001-deployment 3/7 7 3 7m20s autoscale-go-00001-deployment 4/7 7 4 7m21s autoscale-go-00001-deployment 5/7 7 5 7m23s autoscale-go-00001-deployment 6/7 7 6 7m23s autoscale-go-00001-deployment 7/7 7 7 7m23s autoscale-go-00001-deployment 7/3 7 7 8m20s autoscale-go-00001-deployment 7/3 7 7 8m20s autoscale-go-00001-deployment 7/3 7 7 8m20s autoscale-go-00001-deployment 3/3 3 3 8m20s autoscale-go-00001-deployment 3/2 3 3 8m26s autoscale-go-00001-deployment 3/2 3 3 8m26s autoscale-go-00001-deployment 2/2 2 2 8m26s autoscale-go-00001-deployment 2/1 2 2 8m36s autoscale-go-00001-deployment 2/1 2 2 8m36s autoscale-go-00001-deployment 1/1 1 1 8m36s autoscale-go-00001-deployment 1/0 1 1 9m48s autoscale-go-00001-deployment 1/0 1 1 9m48s autoscale-go-00001-deployment 0/0 0 0 9m48s預期輸出表明,整個過程中共擴容7個Pod。這是由於當容器並發量大於目標並發量的一定百分比後(預設為70%),Knative會提前建立更多的Pod備用,避免並發量進一步增加的情況下目標值被突破。
情境二:設定擴縮容邊界實現自動擴縮容
擴縮容邊界指應用程式提供服務的最小和最大Pod數量。本情境將在叢集中部署autoscale-go應用,通過設定應用程式提供服務的最小和最大Pod數量實現自動擴縮容。
關於如何使用Knative on ASM建立Knative服務,請參見使用Knative on ASM部署Serverless應用。
-
建立autoscale-go.yaml,設定最大並發請求數為10,minScale最小保留執行個體數為1,maxScale最大擴容執行個體數為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串連到叢集,在命令列執行以下命令部署autoscale-go。
kubectl apply -f autoscale-go.yaml -
登入ASM控制台,單擊目標執行個體名稱,然後選擇,在服務地址地區,擷取IP。
-
使用Hey壓測工具,執行30s內保持50個並發請求。
關於Hey壓測工具的安裝步驟和詳細資料,請參見Hey。
說明請將
xxx.xxx.xxx.xxx替換為您實際的訪問網關地址。關於如何擷取訪問網關地址的具體操作,請參見擷取訪問網關地址。hey -z 30s -c 50 -host "autoscale-go.default.example.com" "http://xxx.xxx.xxx.xxx?sleep=100&prime=10000&bloat=5"kubectl get deploy -w
text NAME READY UP-TO-DATE AVAILABLE AGE autoscale-go-00001-deployment 1/1 1 1 115s autoscale-go-00001-deployment 1/2 1 1 2m4s autoscale-go-00001-deployment 1/2 1 1 2m4s autoscale-go-00001-deployment 1/2 1 1 2m4s autoscale-go-00001-deployment 1/2 2 1 2m4s autoscale-go-00001-deployment 2/2 2 2 2m6s autoscale-go-00001-deployment 2/3 2 2 2m6s autoscale-go-00001-deployment 2/3 2 2 2m6s autoscale-go-00001-deployment 2/3 2 2 2m6s autoscale-go-00001-deployment 2/3 3 2 2m6s autoscale-go-00001-deployment 3/3 3 3 2m8s autoscale-go-00001-deployment 3/1 3 3 3m34s autoscale-go-00001-deployment 3/1 3 3 3m34s autoscale-go-00001-deployment 1/1 1 1 3m34s預期輸出:預期輸出表明,整個過程中Pod最大擴容儲量為3,且在無訪問請求流量的情況下,Pod最小保留數量為1,即自動擴縮容符合預期。
相關文檔
-
當您需要安全地訪問和管理Knative構建的微服務時,可以使用ASM網關來實現HTTPS訪問,通過對服務端點進行加密傳輸配置保護服務間的通訊,提高整體架構的安全性和可靠性。具體操作,請參見使用ASM網關實現HTTPS訪問Knative服務。
-
當您在進行應用迭代升級時面臨新版本相容性和穩定性挑戰時,可以在Knative on ASM中基於流量灰階發布服務。具體操作,請參見在Knative on ASM中基於流量灰階發布服務。
-
您可以在Knative Service中設定CPU指標閾值,滿足在突發高負載的情境下,自動擴縮容資源的訴求。具體操作,請參見在Knative中使用HPA。