概述
Kubernetes Pod水平自動(dòng)擴(kuò)縮(Horizontal Pod Autoscaler,以下簡稱HPA)可以基于CPU利用率、內(nèi)存利用率和其他自定義的度量指標(biāo)自動(dòng)擴(kuò)縮Pod的副本數(shù)量,以使得工作負(fù)載服務(wù)的整體度量水平與用戶所設(shè)定的目標(biāo)值匹配。本文將介紹和使用騰訊云容器服務(wù)TKE的HPA功能實(shí)現(xiàn)Pod自動(dòng)水平擴(kuò)縮容。
使用場景
HPA自動(dòng)伸縮特性使容器服務(wù)具有非常靈活的自適應(yīng)能力,能夠在用戶設(shè)定內(nèi)快速擴(kuò)容多個(gè)Pod副本來應(yīng)對業(yè)務(wù)負(fù)載的急劇飆升,也可以在業(yè)務(wù)負(fù)載變小的情況下根據(jù)實(shí)際情況適當(dāng)縮容來節(jié)省計(jì)算資源給其他的服務(wù),整個(gè)過程自動(dòng)化無須人為干預(yù),非常適合服務(wù)波動(dòng)較大,服務(wù)數(shù)量多且需要頻繁擴(kuò)縮容的業(yè)務(wù)場景,如:電商服務(wù)、線上教育、金融服務(wù)等。
原理概述
Pod水平自動(dòng)擴(kuò)縮特性由Kubernetes API資源和控制器實(shí)現(xiàn)。資源利用指標(biāo)決定控制器的行為,控制器會周期性的根據(jù)Pod資源利用情況調(diào)整服務(wù)Pod的副本數(shù)量,以使得工作負(fù)載的度量水平與用戶所設(shè)定的目標(biāo)值匹配。其擴(kuò)縮容流程和說明如下:
提示:目前這一功能處于beta版本,且Pod自動(dòng)水平擴(kuò)縮不適用于無法擴(kuò)縮的對象,比如DaemonSet資源。
HPA Controller:控制HPA擴(kuò)縮邏輯的控制組件。
Metrics Aggregator:度量指標(biāo)聚合器。通常情況下,控制器將從一系列的聚合API(metrics.k8s.io、custom.metrics.k8s.io和external.metrics.k8s.io)中獲取度量值。metrics.k8s.io API通常由Metrics服務(wù)器提供,社區(qū)版可提供基本的CPU、內(nèi)存度量類型,相比于社區(qū)版,TKE使用自定義Metrics Server采集可支持更廣泛的的HPA的度量指標(biāo)觸發(fā)類型,提供包括CPU、內(nèi)存、硬盤、網(wǎng)絡(luò)和GPU相關(guān)指標(biāo),了解更多詳細(xì)內(nèi)容參閱TKE自動(dòng)伸縮指標(biāo)說明[1]。
提示:控制器也可以直接從Heapster獲取指標(biāo)。但自Kubernetes 1.11起,從Heapster獲取指標(biāo)特性的方式已廢棄。
HPA計(jì)算目標(biāo)副本數(shù)算法:TKE HPA擴(kuò)縮容算法請參考工作原理[2],更多詳細(xì)算法請參閱算法細(xì)節(jié)[3]。
前提條件
·已注冊騰訊云賬戶[4]。
·已登錄騰訊云容器服務(wù)控制臺[5]。
·已創(chuàng)建TKE集群。關(guān)于創(chuàng)建集群,詳情請參見創(chuàng)建集群[6]。
操作步驟
第1步:部署測試工作負(fù)載
以Deployment資源類型的工作負(fù)載為例,創(chuàng)建一個(gè)單副本數(shù),服務(wù)類型為WEB服務(wù)的"hpa-test"工作負(fù)載,在TKE控制臺創(chuàng)建Deployment類型工作負(fù)載方法請參閱Deployment管理[7]。本示例創(chuàng)建結(jié)果如下圖所示:
第2步:配置HPA
在TKE控制臺為測試工作負(fù)載綁定一個(gè)HPA配置,關(guān)于如何綁定配置HPA請參閱HPA操作步驟[8],本示例配置當(dāng)網(wǎng)絡(luò)出帶寬達(dá)到0.15Mbps(150Kbps)時(shí)觸發(fā)擴(kuò)容的策略。
第3步:功能驗(yàn)證
在集群中啟動(dòng)一個(gè)臨時(shí)Pod對配置的HPA功能進(jìn)行測試(模擬客戶端):
kubectl run-it--image alpine hpa-test--restart=Never--rm/bin/sh
在臨時(shí)Pod中運(yùn)行下面命令短時(shí)間內(nèi)模擬大量請求訪問"hpa-test"服務(wù)使出口流量帶寬增大:
#hpa-test.default.svc.cluster.local為服務(wù)在集群中的域名,當(dāng)需要停止腳本時(shí)按Ctrl+C即可
while true;do wget-q-O-hpa-test.default.svc.cluster.local;done
在測試Pod中執(zhí)行模擬請求命令后,通過觀察下圖中工作負(fù)載的Pod數(shù)量監(jiān)控可以看到,在16:21分時(shí)工作負(fù)載擴(kuò)容副本數(shù)量至2個(gè),由此可推斷出已經(jīng)觸發(fā)了HPA的擴(kuò)容事件。
再通過下圖的工作負(fù)載的網(wǎng)絡(luò)出口帶寬監(jiān)控可以看出在16:21右左時(shí)網(wǎng)絡(luò)出口帶寬增至大概199 Kbps,已經(jīng)超過HPA設(shè)定的網(wǎng)絡(luò)出口帶寬目標(biāo)值,進(jìn)一步證明此時(shí)觸發(fā)HPA擴(kuò)縮容算法[9]擴(kuò)容了一個(gè)副本數(shù)來滿足設(shè)定的目標(biāo)值,故工作負(fù)載的副本數(shù)量變成了2個(gè)。
注意:HPA擴(kuò)縮容算法[10]不只以公式計(jì)算維度去控制擴(kuò)縮容邏輯,而會多維度去衡量是否需要擴(kuò)容或縮容,詳情可以參閱算法細(xì)節(jié)[11],所以在實(shí)際情況中可能和預(yù)期會稍有偏差。
接下來模擬縮容過程,在16:24左右手動(dòng)停止執(zhí)行模擬請求的命令,從下圖監(jiān)控看到此時(shí)網(wǎng)絡(luò)出口帶寬值下降到擴(kuò)容前位置,按照HPA的邏輯,此時(shí)已經(jīng)滿足工作負(fù)載縮容的條件。
但從下圖工作負(fù)載的Pod數(shù)量監(jiān)控可以看出,工作負(fù)載在16:30分時(shí)才觸發(fā)了HPA的縮容,這是因?yàn)橛|發(fā)了HPA縮容有默認(rèn)5分鐘的容忍時(shí)間的算法,以防止度量指標(biāo)短時(shí)間波動(dòng)導(dǎo)致的頻繁的擴(kuò)縮容,詳情請參閱冷卻/延遲支持[12]。從下圖可以看出工作負(fù)載副本數(shù)在停止命令5分鐘后按照HPA擴(kuò)縮容算法[13]縮容到了最初設(shè)定的1個(gè)副本數(shù)。
當(dāng)TKE發(fā)生HPA擴(kuò)縮容事件時(shí),會在對應(yīng)的HPA實(shí)例的事件列表展示,如下圖所示。需要注意的是事件通知列表的時(shí)間分為“首次出現(xiàn)時(shí)間”和“最后出現(xiàn)時(shí)間”,“首次出現(xiàn)時(shí)間”表示相同事件第一次出現(xiàn)的時(shí)間,”最后出現(xiàn)時(shí)間”為相同事件出現(xiàn)的最新時(shí)間,所以從下圖事件列表“最后出現(xiàn)時(shí)間”字段可以看到本示例擴(kuò)容事件時(shí)間點(diǎn)是16:21:03,縮容事件時(shí)間是16.29:42,時(shí)間點(diǎn)與工作負(fù)載監(jiān)控看到的時(shí)間點(diǎn)相吻合。
此外,工作負(fù)載事件列表也會記錄HPA發(fā)生時(shí)工作負(fù)載的增刪副本數(shù)事件,從下圖可以看出工作負(fù)載擴(kuò)縮容時(shí)間點(diǎn)與HPA事件列表的時(shí)間點(diǎn)也是吻合的,增加副本數(shù)時(shí)間點(diǎn)是16:21:03,減少副本數(shù)時(shí)間點(diǎn)是16:29:42。
總結(jié)
在本示例中主要演示了TKE的HPA功能,使用TKE自定義的網(wǎng)絡(luò)出口帶寬度量類型作為工作負(fù)載HPA的擴(kuò)縮容度量指標(biāo),當(dāng)工作負(fù)載實(shí)際度量值超過HPA配置的度量目標(biāo)值時(shí),HPA根據(jù)擴(kuò)容算法計(jì)算出合適的副本數(shù)實(shí)現(xiàn)水平擴(kuò)容,保證工作負(fù)載的度量指標(biāo)滿足預(yù)期,保障工作負(fù)載健康穩(wěn)定運(yùn)行;當(dāng)實(shí)際度量值遠(yuǎn)低于HPA配置的度量目標(biāo)值時(shí),HPA會在容忍時(shí)間后計(jì)算合適的副本數(shù)實(shí)現(xiàn)水平縮容,適當(dāng)釋放閑置資源,達(dá)到提升資源利用率的目的,并且整個(gè)過程在HPA和工作負(fù)載事件列表都會有相應(yīng)的事件記錄,使整個(gè)工作負(fù)載水平擴(kuò)縮容全程可追溯。
參考資料
[1]TKE自動(dòng)伸縮指標(biāo)說明:https://cloud.tencent.com/document/product/457/38929
[2]工作原理:https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86
[3]算法細(xì)節(jié):https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details
[4]注冊騰訊云賬戶:https://cloud.tencent.com/register
[5]騰訊云容器服務(wù)控制臺:https://console.cloud.tencent.com/tke2
[6]創(chuàng)建集群:https://cloud.tencent.com/document/product/457/32189
[7]Deployment管理:https://cloud.tencent.com/document/product/457/31705
[8]HPA操作步驟:https://cloud.tencent.com/document/product/457/37384#.E6.93.8D.E4.BD.9C.E6.AD.A5.E9.AA.A4
[9]擴(kuò)縮容算法:https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86
[10]擴(kuò)縮容算法:https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86
[11]算法細(xì)節(jié):https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#algorithm-details
[12]冷卻/延遲支持:https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/#冷卻-延遲支持
[13]擴(kuò)縮容算法:https://cloud.tencent.com/document/product/457/37384#.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86