Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默認(rèn)情況下,提供了開箱即用的快速、基于請求的自動擴(kuò)縮容功能 - Knative Pod Autoscaler(KPA)。下面帶你體驗如何在 Knative 中玩轉(zhuǎn) Autoscaler。
Autoscaler 機(jī)制
Knative Serving 為每個 POD 注入 QUEUE 代理容器 (queue-proxy),該容器負(fù)責(zé)向 Autoscaler 報告用戶容器并發(fā)指標(biāo)。Autoscaler 接收到這些指標(biāo)之后,會根據(jù)并發(fā)請求數(shù)及相應(yīng)的算法,調(diào)整 Deployment 的 POD 數(shù)量,從而實現(xiàn)自動擴(kuò)縮容。
算法
Autoscaler 基于每個 POD 的平均請求數(shù)(并發(fā)數(shù))進(jìn)行擴(kuò)所容處理。默認(rèn)并發(fā)數(shù)為 100。
POD 數(shù)=并發(fā)請求總數(shù)/容器并發(fā)數(shù)
如果服務(wù)中并發(fā)數(shù)設(shè)置了 10,這時候如果加載了 50 個并發(fā)請求的服務(wù),Autoscaler 就會創(chuàng)建了 5 個 POD (50 個并發(fā)請求/10=POD)。
Autoscaler 實現(xiàn)了兩種操作模式的縮放算法:Stable(穩(wěn)定模式)和 Panic(恐慌模式)。
穩(wěn)定模式
在穩(wěn)定模式下,Autoscaler 調(diào)整 Deployment 的大小,以實現(xiàn)每個 POD 所需的平均并發(fā)數(shù)。 POD 的并發(fā)數(shù)是根據(jù) 60 秒窗口內(nèi)接收所有數(shù)據(jù)請求的平均數(shù)來計算得出。
恐慌模式
Autoscaler 計算 60 秒窗口內(nèi)的平均并發(fā)數(shù),系統(tǒng)需要 1 分鐘穩(wěn)定在所需的并發(fā)級別。但是,Autoscaler 也會計算 6 秒的恐慌窗口,如果該窗口達(dá)到目標(biāo)并發(fā)的 2 倍,則會進(jìn)入恐慌模式。在恐慌模式下,Autoscaler 在更短、更敏感的緊急窗口上工作。一旦緊急情況持續(xù) 60 秒后,Autoscaler 將返回初始的 60 秒穩(wěn)定窗口。
|Panic Target---> +--| 20| || <------Panic Window| |Stable Target---> +-------------------------|--| 10 CONCURRENCY| | || <-----------Stable Window| | | --------------------------+-------------------------+--+ 0 120 60 0TIME
配置 KPA
通過上面的介紹,我們對 Knative Pod Autoscaler 工作機(jī)制有了初步的了解,那么接下來介紹如何配置 KPA。在 Knative 中配置 KPA 信息,需要修改 k8s 中的 ConfigMap:config-autoscaler,該 ConfigMap 在 knative-serving 命名空間下。查看 config-autoscaler 使用如下命令:
kubectl -n knative-serving get cm config-autoscaler默認(rèn)的 ConfigMap 如下:
apiVersion: v1 kind: ConfigMap metadata:name: config-autoscalernamespace: knative-serving data:container-concurrency-target-default: 100container-concurrency-target-percentage: 1.0enable-scale-to-zero: trueenable-vertical-pod-autoscaling: falsemax-scale-up-rate: 10panic-window: 6sscale-to-zero-grace-period: 30sstable-window: 60stick-interval: 2s
為 KPA 配置縮容至 0
為了正確配置使 Revision 縮容為 0,需要修改 ConfigMap 中的如下參數(shù)。
scale-to-zero-grace-period
scale-to-zero-grace-period 表示在縮為 0 之前,inactive revison 保留的運行時間(最小是3 0s)。
scale-to-zero-grace-period: 30sstable-window
當(dāng)在 stable mode 模式運行中,autoscaler 在穩(wěn)定窗口期下平均并發(fā)數(shù)下的操作。
stable-window: 60sstable-window 同樣可以配置在 Revision 注釋中。
autoscaling.knative.dev/window: 60senable-scale-to-zero
保證 enable-scale-to-zero 參數(shù)設(shè)置為 true
Termination period
Termination period(終止時間)是 POD 在最后一個請求完成后關(guān)閉的時間。POD 的終止周期等于穩(wěn)定窗口值和縮放至零寬限期參數(shù)的總和。在本例中,Termination period 為 90 秒。
配置并發(fā)數(shù)
可以使用以下方法配置 Autoscaler 的并發(fā)數(shù):
target
target 定義在給定時間(軟限制)需要多少并發(fā)請求,是 Knative 中 Autoscaler 的推薦配置。
在 ConfigMap 中默認(rèn)配置的并發(fā) target 為 100。
`container-concurrency-target-default: 100`這個值可以通過 Revision 中的 autoscaling.knative.dev/target 注釋進(jìn)行修改:
autoscaling.knative.dev/target: 50containerConcurrency
注意:只有在明確需要限制在給定時間有多少請求到達(dá)應(yīng)用程序時,才應(yīng)該使用 containerConcurrency (容器并發(fā))。只有當(dāng)應(yīng)用程序需要強(qiáng)制的并發(fā)約束時,才建議使用 containerConcurrency。
containerConcurrency 限制在給定時間允許并發(fā)請求的數(shù)量(硬限制),并在 Revision 模板中配置。
containerConcurrency: 0 | 1 | 2-N- 1: 將確保一次只有一個請求由 Revision 給定的容器實例處理;
- 2-N: 請求的并發(fā)值限制為2或更多;
- 0: 表示不作限制,有系統(tǒng)自身決定。
配置擴(kuò)縮容邊界(minScale 和 maxScale)
通過 minScale 和 maxScale 可以配置應(yīng)用程序提供服務(wù)的最小和最大 Pod 數(shù)量。通過這兩個參數(shù)配置可以控制服務(wù)冷啟動或者控制計算成本。
minScale 和 maxScale 可以在 Revision 模板中按照以下方式進(jìn)行配置:
spec:template:metadata:autoscaling.knative.dev/minScale: "2"autoscaling.knative.dev/maxScale: "10"通過在 Revision 模板中修改這些參數(shù),將會影響到 PodAutoscaler 對象,這也表明在無需修改 Knative Serving 系統(tǒng)配置的情況下,PodAutoscaler 對象是可被修改的。
edit podautoscaler <revision-name>注意:這些注釋適用于 Revision 的整個生命周期。即使 Revision 沒有被任何 route 引用,minscale 指定的最小 POD 計數(shù)仍將提供。請記住,不可路由的 Revision 可能被垃圾收集掉。
默認(rèn)情況
如果未設(shè)置 minscale 注釋,pods 將縮放為零(如果根據(jù)上面提到的 configmap,enable-scale-to-zero 為 false,則縮放為 1)。
如果未設(shè)置 maxscale 注釋,則創(chuàng)建的 Pod 數(shù)量將沒有上限。
基于 KPA 配置的示例
Knative 0.7 版本部署安裝可以參考:阿里云部署 Knative
我們使用官方提供的 autoscale-go 示例來進(jìn)行演示,示例 service.yaml 如下:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata:name: autoscale-gonamespace: default spec:template:metadata:labels:app: autoscale-goannotations:autoscaling.knative.dev/target: "10"spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1獲取訪問網(wǎng)關(guān):
$ kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}" 121.199.194.150Knative 0.7 版本中獲取域名信息:
$ kubectl get route autoscale-go --output jsonpath="{.status.url}"| awk -F/ '{print $3}' autoscale-go.default.example.com
場景1:并發(fā)請求示例
如上配置,當(dāng)前最大并發(fā)請求數(shù) 10。 我們執(zhí)行 30s 內(nèi)保持 50 個并發(fā)請求,看一下執(zhí)行情況:
hey -z 30s -c 50 -host "autoscale-go.default.example.com" "http://121.199.194.150?sleep=100&prime=10000&bloat=5"結(jié)果正如我們所預(yù)期的:擴(kuò)容出來了 5 個 POD。
場景2:擴(kuò)縮容邊界示例
修改一下 servcie.yaml 配置如下:
apiVersion: serving.knative.dev/v1alpha1 kind: Service metadata:name: autoscale-gonamespace: default spec:template:metadata:labels:app: autoscale-goannotations: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當(dāng)前最大并發(fā)請求數(shù) 10,minScale 最小保留實例數(shù)為 1,maxScale 最大擴(kuò)容實例數(shù)為 3。
我們依然執(zhí)行 30s 內(nèi)保持 50 個并發(fā)請求,看一下執(zhí)行情況:
hey -z 30s -c 50 -host "autoscale-go.default.example.com" "http://121.199.194.150?sleep=100&prime=10000&bloat=5"結(jié)果如我們所預(yù)期:最多擴(kuò)容出來了 3 個POD,并且即使在無訪問請求流量的情況下,保持了 1 個運行的 POD。
結(jié)論
看了上面的介紹,是不是感覺在 Knative 中配置應(yīng)用擴(kuò)縮容是如此簡單?其實 Knative 中除了支持 KPA 之外,也支持K8s HPA。你可以通過如下配置基于 CPU 的 Horizontal POD Autoscaler(HPA)。
通過在修訂模板中添加或修改 autoscaling.knative.dev/class 和 autoscaling.knative.dev/metric 值作為注釋,可以將Knative 配置為使用基于 CPU 的自動縮放,而不是默認(rèn)的基于請求的度量。配置如下:
spec:template:metadata:autoscaling.knative.dev/metric: concurrencyautoscaling.knative.dev/class: hpa.autoscaling.knative.dev你可以自由的將 Knative Autoscaling 配置為使用默認(rèn)的 KPA 或 Horizontal POD Autoscaler(HPA)。
歡迎加入 Knative 交流群
總結(jié)
以上是生活随笔為你收集整理的Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在阿里,我们这样帮助用户实现业务云原生化
- 下一篇: 云原生时代,2个方案轻松加速百万级镜像