Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默認(rèn)情況下,提供了開(kāi)箱即用的快速、基于請(qǐng)求的自動(dòng)擴(kuò)縮容功能 - Knative Pod Autoscaler(KPA)。下面帶你體驗(yàn)如何在 Knative 中玩轉(zhuǎn) Autoscaler。
Autoscaler 機(jī)制
Knative Serving 為每個(gè) POD 注入 QUEUE 代理容器 (queue-proxy),該容器負(fù)責(zé)向 Autoscaler 報(bào)告用戶容器并發(fā)指標(biāo)。Autoscaler 接收到這些指標(biāo)之后,會(huì)根據(jù)并發(fā)請(qǐng)求數(shù)及相應(yīng)的算法,調(diào)整 Deployment 的 POD 數(shù)量,從而實(shí)現(xiàn)自動(dòng)擴(kuò)縮容。
算法
Autoscaler 基于每個(gè) POD 的平均請(qǐng)求數(shù)(并發(fā)數(shù))進(jìn)行擴(kuò)所容處理。默認(rèn)并發(fā)數(shù)為 100。
POD 數(shù)=并發(fā)請(qǐng)求總數(shù)/容器并發(fā)數(shù)
如果服務(wù)中并發(fā)數(shù)設(shè)置了 10,這時(shí)候如果加載了 50 個(gè)并發(fā)請(qǐng)求的服務(wù),Autoscaler 就會(huì)創(chuàng)建了 5 個(gè) POD (50 個(gè)并發(fā)請(qǐng)求/10=POD)。
Autoscaler 實(shí)現(xiàn)了兩種操作模式的縮放算法:Stable(穩(wěn)定模式)和 Panic(恐慌模式)。
穩(wěn)定模式
在穩(wěn)定模式下,Autoscaler 調(diào)整 Deployment 的大小,以實(shí)現(xiàn)每個(gè) POD 所需的平均并發(fā)數(shù)。 POD 的并發(fā)數(shù)是根據(jù) 60 秒窗口內(nèi)接收所有數(shù)據(jù)請(qǐng)求的平均數(shù)來(lái)計(jì)算得出。
恐慌模式
Autoscaler 計(jì)算 60 秒窗口內(nèi)的平均并發(fā)數(shù),系統(tǒng)需要 1 分鐘穩(wěn)定在所需的并發(fā)級(jí)別。但是,Autoscaler 也會(huì)計(jì)算 6 秒的恐慌窗口,如果該窗口達(dá)到目標(biāo)并發(fā)的 2 倍,則會(huì)進(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
通過(guò)上面的介紹,我們對(duì) Knative Pod Autoscaler 工作機(jī)制有了初步的了解,那么接下來(lái)介紹如何配置 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 保留的運(yùn)行時(shí)間(最小是3 0s)。
scale-to-zero-grace-period: 30sstable-window
當(dāng)在 stable mode 模式運(yùn)行中,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(終止時(shí)間)是 POD 在最后一個(gè)請(qǐng)求完成后關(guān)閉的時(shí)間。POD 的終止周期等于穩(wěn)定窗口值和縮放至零寬限期參數(shù)的總和。在本例中,Termination period 為 90 秒。
配置并發(fā)數(shù)
可以使用以下方法配置 Autoscaler 的并發(fā)數(shù):
target
target 定義在給定時(shí)間(軟限制)需要多少并發(fā)請(qǐng)求,是 Knative 中 Autoscaler 的推薦配置。
在 ConfigMap 中默認(rèn)配置的并發(fā) target 為 100。
`container-concurrency-target-default: 100`這個(gè)值可以通過(guò) Revision 中的 autoscaling.knative.dev/target 注釋進(jìn)行修改:
autoscaling.knative.dev/target: 50containerConcurrency
注意:只有在明確需要限制在給定時(shí)間有多少請(qǐng)求到達(dá)應(yīng)用程序時(shí),才應(yīng)該使用 containerConcurrency (容器并發(fā))。只有當(dāng)應(yīng)用程序需要強(qiáng)制的并發(fā)約束時(shí),才建議使用 containerConcurrency。
containerConcurrency 限制在給定時(shí)間允許并發(fā)請(qǐng)求的數(shù)量(硬限制),并在 Revision 模板中配置。
containerConcurrency: 0 | 1 | 2-N- 1: 將確保一次只有一個(gè)請(qǐng)求由 Revision 給定的容器實(shí)例處理;
- 2-N: 請(qǐng)求的并發(fā)值限制為2或更多;
- 0: 表示不作限制,有系統(tǒng)自身決定。
配置擴(kuò)縮容邊界(minScale 和 maxScale)
通過(guò) minScale 和 maxScale 可以配置應(yīng)用程序提供服務(wù)的最小和最大 Pod 數(shù)量。通過(guò)這兩個(gè)參數(shù)配置可以控制服務(wù)冷啟動(dòng)或者控制計(jì)算成本。
minScale 和 maxScale 可以在 Revision 模板中按照以下方式進(jìn)行配置:
spec:template:metadata:autoscaling.knative.dev/minScale: "2"autoscaling.knative.dev/maxScale: "10"通過(guò)在 Revision 模板中修改這些參數(shù),將會(huì)影響到 PodAutoscaler 對(duì)象,這也表明在無(wú)需修改 Knative Serving 系統(tǒng)配置的情況下,PodAutoscaler 對(duì)象是可被修改的。
edit podautoscaler <revision-name>注意:這些注釋適用于 Revision 的整個(gè)生命周期。即使 Revision 沒(méi)有被任何 route 引用,minscale 指定的最小 POD 計(jì)數(shù)仍將提供。請(qǐng)記住,不可路由的 Revision 可能被垃圾收集掉。
默認(rèn)情況
如果未設(shè)置 minscale 注釋,pods 將縮放為零(如果根據(jù)上面提到的 configmap,enable-scale-to-zero 為 false,則縮放為 1)。
如果未設(shè)置 maxscale 注釋,則創(chuàng)建的 Pod 數(shù)量將沒(méi)有上限。
基于 KPA 配置的示例
Knative 0.7 版本部署安裝可以參考:阿里云部署 Knative
我們使用官方提供的 autoscale-go 示例來(lái)進(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èn)網(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
場(chǎng)景1:并發(fā)請(qǐng)求示例
如上配置,當(dāng)前最大并發(fā)請(qǐng)求數(shù) 10。 我們執(zhí)行 30s 內(nèi)保持 50 個(gè)并發(fā)請(qǐng)求,看一下執(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ò)容出來(lái)了 5 個(gè) POD。
場(chǎng)景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ā)請(qǐng)求數(shù) 10,minScale 最小保留實(shí)例數(shù)為 1,maxScale 最大擴(kuò)容實(shí)例數(shù)為 3。
我們依然執(zhí)行 30s 內(nèi)保持 50 個(gè)并發(fā)請(qǐng)求,看一下執(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ò)容出來(lái)了 3 個(gè)POD,并且即使在無(wú)訪問(wèn)請(qǐng)求流量的情況下,保持了 1 個(gè)運(yùn)行的 POD。
結(jié)論
看了上面的介紹,是不是感覺(jué)在 Knative 中配置應(yīng)用擴(kuò)縮容是如此簡(jiǎn)單?其實(shí) Knative 中除了支持 KPA 之外,也支持K8s HPA。你可以通過(guò)如下配置基于 CPU 的 Horizontal POD Autoscaler(HPA)。
通過(guò)在修訂模板中添加或修改 autoscaling.knative.dev/class 和 autoscaling.knative.dev/metric 值作為注釋,可以將Knative 配置為使用基于 CPU 的自動(dòng)縮放,而不是默認(rèn)的基于請(qǐng)求的度量。配置如下:
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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在阿里,我们这样帮助用户实现业务云原生化
- 下一篇: 云原生时代,2个方案轻松加速百万级镜像