AHPA(Advanced Horizontal Pod Autoscaler)可以根據(jù)歷史指標彈性預測未來負載的情況,同時也支持根據(jù)時間段設置最大和最小實例數(shù)量。將Knative與AHPA結合,可以實現(xiàn)基于每秒請求數(shù)(RPS)或并發(fā)數(shù)的定時彈性能力。這種彈性能力不僅可以周期性地調整資源,還可以在突發(fā)流量場景下隨時擴容資源。本文介紹如何將Knative和AHPA結合從而擁有基于RPS定時彈性的能力。
索引
前提條件
已創(chuàng)建Kubernetes托管版集群,且集群版本為1.20及以上。
步驟一:配置彈性指標
本文通過AHPA配置彈性指標和擴縮容邊界。
執(zhí)行以下命令,新建一個名為ahpa-demo的YAML文件。
vi ahpa-demo.yaml
將以下內容粘貼至已創(chuàng)建的YAML文件中。
apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedHorizontalPodAutoscalerTemplate metadata: name: ahpa-demo spec: metrics: - type: Resource resource: name: rps target: type: Utilization averageUtilization: 10 # 目前閾值,10表示RPS使用目標閾值是10。 maxReplicas: 50 # 定義了Pod最大副本數(shù)為50。 minReplicas: 0 # 定義了Pod最小副本數(shù)為0。 prediction: quantile: 95 # 表示預測使用95%的置信度進行預測。 scaleUpForward: 180 # 表示向前預測的時間范圍為180秒。 # 在2023-06-01 00:00:00~2123-06-01 00:00:00這個時間范圍內,Pod副本數(shù)的數(shù)量將受到AHPAT中定義的最大和最小副本數(shù)的限制。 instanceBounds: - startTime: "2023-06-01 00:00:00" endTime: "2123-06-01 00:00:00" bounds: # 在0-6小時的時間段內,最小副本數(shù)為0,最大副本數(shù)為50。 - cron: '* 0-6 ? * *' maxReplicas: 50 minReplicas: 0 # 在7-9小時的時間段內,最小副本數(shù)為5,最大副本數(shù)為50。 - cron: '* 7-9 ? * *' maxReplicas: 50 minReplicas: 5 # 在10-16小時的時間段內,最小副本數(shù)為10,最大副本數(shù)為50。 - cron: '* 10-16 ? * *' maxReplicas: 50 minReplicas: 10 # 在17-23小時的時間段內,最小副本數(shù)為2,最大副本數(shù)為50。 - cron: '* 17-23 ? * *' maxReplicas: 50 minReplicas: 2
參數(shù)說明如下所示:
參數(shù)
是否必選
說明
metrics
必選
用于配置彈性Metrics 。當前支持RPS、并發(fā)數(shù)、CPU、Memory指標。
maxReplicas
必選
最大擴容實例數(shù)。
minReplicas
必選
最小縮容實例數(shù)。
instanceBounds
可選
擴縮容時間段實例數(shù)邊界。
startTime:開始時間。
endTime:結束時間。
bounds
可選
在不同的時間范圍內Pod副本數(shù)的最小值和最大值。
cron:用于表示時間范圍的格式化字符串。可以配置定時任務。
如果您需要使用Cron表達式來定義定期運行的任務或自動擴展Pod副本數(shù),請先根據(jù)下文Cron表達式中各個字段的詳細說明,熟悉Cron中特殊字符和通配符的含義。
maxReplicas:最大副本數(shù)。
minReplicas:最低副本數(shù)。
Cron表達式中各個字段的詳細說明
Cron表達式的字段解釋如下,更多信息,請參見Cron表達式。
字段
特定字符
是否必選
說明
分(Minutes)
* / , -
必選
取值范圍為[0,59]。
時(Hours)
* / , -
必選
取值范圍為[0,23]。
日(Day of month)
* / , – ?
必選
取值范圍為[1,31]。
月(Month)
* / , -
必選
取值范圍為[1,12]或者JAN~DEC。
說明JAN~DEC字段的值不區(qū)分大小寫。
星期(Day of week)
* / , – ?
可選
取值范圍為[0,6]或者SUN~SAT。
說明SUN~SAT字段的值不區(qū)分大小寫。如:SUN和sun都可表示星期日。
星期(Day of week)字段如果沒提供,相當于是
*
。
cron表達式中各個字符代表的意義如下:
星號(*)表示所有可能的值。例如,
*
表示匹配所有分鐘和小時。斜杠(/)表示步長。例如,
/5
表示每隔5個時間單位。英文半角逗號(,)表示分隔符。例如,
1,3,5
表示匹配1、3、5等值。破折號(-)表示范圍。例如,
1-5
表示匹配1到5。問號(?)僅在日(Day of month)和星期(Day of week)字段中使用,表示不指定值。
步驟二:創(chuàng)建Knative服務,并指定使用AHPA彈性策略
配置完彈性策略之后,您可以通過Knative服務使用該定時彈性策略。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在Knative頁面的服務管理頁簽下,選擇命名空間為default,然后單擊使用模板創(chuàng)建,將以下YAML示例粘貼至模板,最后單擊創(chuàng)建,創(chuàng)建一個名為helloworld-go-demo的服務。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go-demo spec: template: metadata: annotations: autoscaling.knative.dev/class: ahpa.autoscaling.knative.dev # 指定AHPA彈性插件。 autoscaling.knative.dev.alibabacloud/ahpa-template: "ahpa-demo" # 注意這里引用的AHPA模版參數(shù)修改時,關聯(lián)的revision會自動修改彈性策略。 spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 env: - name: TARGET value: "Knative"
服務創(chuàng)建成功后,請獲取并記錄服務網(wǎng)關地址和域名,供步驟三:訪問服務時使用。
步驟三:訪問服務
執(zhí)行如下命令,訪問服務。
# helloworld-go-demo.default.example.com為服務的默認域名。
# alb-i5lagvip6fga******.cn-shenzhen.alb.aliyuncs.com為服務對應的訪問網(wǎng)關。
curl -H "Host: helloworld-go-demo.default.example.com" http://alb-i5lagvip6fga******.cn-shenzhen.alb.aliyuncs.com
預期輸出:
Hello Knative!
表明服務訪問成功。
結果驗證
在Knative的監(jiān)控大盤頁面,可查看Knative服務的實例擴縮容趨勢。關于Knative監(jiān)控大盤的更多信息,請參見通過阿里云Prometheus監(jiān)控查看Knative大盤。
當Knative應用縮容到0且沒有Pod實例時,無法采集Pod的并發(fā)請求數(shù)、Pod每秒請求數(shù)等指標。只有訪問Knative應用Pod后,才能在服務發(fā)現(xiàn)頁面查看這些指標。
當Knative應用沒有縮容到0時,無需訪問Knative應用Pod,即可在服務發(fā)現(xiàn)頁面查看Pod的并發(fā)請求數(shù)、Pod每秒請求數(shù)等指標。