Kubernetes彈性伸縮全場景解讀(五) - 定時伸縮元件釋出與開源
前言
容器技術的發展讓軟體交付和運維變得更加標準化、輕量化、自動化。這使得動態調整負載的容量變成一件非常簡單的事情。在kubernetes中,通常只需要修改對應的replicas數目即可完成。當負載的容量調整變得如此簡單後,我們再回過頭來看下應用的資源畫像。對於大部分網際網路的線上應用而言,負載的峰谷分佈是存在一定規律的。例如下圖是一個典型web應用的負載曲線。從每天早上8點開始,負載開始飆高,在中午12點到14點之間,負載會回落;14點到18點會迎來第二個高峰;在18點之後負載會逐漸回落到最低點。
資源的波峰和波谷之間相差3~4倍左右的容量,低負載的時間會維持8個小時左右。如果使用純靜態的容量規劃方式進行應用管理與部署,我們可以計算得出資源浪費比為25% (計算方式:1 - (1*8+4*16)/4*24 = 0.25 )。而當波峰和波谷之間的差別到達10倍的時候,資源浪費比就會飆升至57%(計算方式:1 - (1*8+10*16)/10*24 = 0.57 )。
那麼當我們面對這麼多的資源浪費時,是否可以透過彈性的方式來解決呢?標準的HPA是基於指標閾值進行伸縮的,常見的指標主要是CPU、記憶體,當然也可以透過自定義指標例如QPS、連線數等進行伸縮。但是這裡存在一個問題,因為基於資源的伸縮存在一定的時延,這個時延主要包含:採集時延(分鐘級) + 判斷時延(分鐘級) + 伸縮時延(分鐘級)。而對於上圖中,我們可以發現負載的峰值毛刺還是非常尖銳的,這有可能會由於HPA分鐘級別的伸縮時延造成負載數目無法及時變化,短時間內應用的整體負載飆高,響應時間變慢。特別是對於一些遊戲業務而言,由於負載過高帶來的業務抖動會造成玩家非常差的體驗。
為了解決這個場景,阿里雲容器服務提供了
kube-cronhpa-controller
,專門應對資源畫像存在週期性的場景。開發者可以根據資源畫像的週期性規律,定義time schedule,提前擴容好資源,而在波谷到來後定時回收資源。底層再結合
cluster-autoscaler
的節點伸縮能力,提供資源成本的節約。
使用方式
cronhpa
是基於CRD的方式開發的controller,使用
cronhpa
的方式非常簡單,整體的使用習慣也儘可能的和HPA保持一致。
程式碼倉庫地址
1. 安裝CRD
kubectl apply -f config/crds/autoscaling_v1beta1_cronhorizontalpodautoscaler.yaml
2. 安裝RBAC授權
# create ClusterRole
kubectl apply -f config/rbac/rbac_role.yaml
# create ClusterRolebinding and ServiceAccount
kubectl apply -f config/rbac/rbac_role_binding.yaml
3. 部署
kubernetes-cronhpa-controller
kubectl apply -f config/deploy/deploy.yaml
4. 驗證
kubernetes-cronhpa-controller
安裝狀態
kubectl get deploy kubernetes-cronhpa-controller -n kube-system -o wide
kubernetes-cronhpa-controller git:(master) kubectl get deploy kubernetes-cronhpa-controller -n kube-system
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-cronhpa-controller 1 1 1 1 49s
執行一個cronhpa的demo
安裝了
kubernetes-cronhpa-controller
後,我們可以透過一個簡單的demo進行功能的驗證。在部署前,我們先看下一個標準的cronhpa的定義。
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1beta2
kind: Deployment
name: nginx-deployment-basic
jobs:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "0 */1 * * * *"
targetSize: 3
其中
scaleTargetRef
欄位負責描述伸縮的物件,
jobs
中定義了擴充套件的
crontab
定時任務。在這個例子中,設定的是每分鐘的第0秒擴容到3個Pod,每分鐘的第30s縮容到1個Pod。如果執行正常,我們可以在30s內看到負載數目的兩次變化。
1. 部署demo應用與cronhpa的配置
kubectl apply -f examples/deployment_cronhpa.yaml
2. 檢查demo應用副本數目
kubectl get deploy nginx-deployment-basic
kubernetes-cronhpa-controller git:(master) kubectl get deploy nginx-deployment-basic
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
nginx-deployment-basic 2 2 2 2 9s
3. 檢視cronhpa的狀態 ,確認cronhpa的job已提交
kubectl describe cronhpa cronhpa-sample
Name: cronhpa-sample
Namespace: default
Labels: controller-tools.k8s.io=1.0
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling.alibabacloud.com/v1beta1","kind":"CronHorizontalPodAutoscaler","metadata":{"annotations":{},"labels":{"controll...
API Version: autoscaling.alibabacloud.com/v1beta1
Kind: CronHorizontalPodAutoscaler
Metadata:
Creation Timestamp: 2019-04-14T10:42:38Z
Generation: 1
Resource Version: 4017247
Self Link: /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/cronhorizontalpodautoscalers/cronhpa-sample
UID: 05e41c95-5ea2-11e9-8ce6-00163e12e274
Spec:
Jobs:
Name: scale-down
Schedule: 30 */1 * * * *
Target Size: 1
Name: scale-up
Schedule: 0 */1 * * * *
Target Size: 3
Scale Target Ref:
API Version: apps/v1beta2
Kind: Deployment
Name: nginx-deployment-basic
Status:
Conditions:
Job Id: 38e79271-9a42-4131-9acd-1f5bfab38802
Last Probe Time: 2019-04-14T10:43:02Z
Message:
Name: scale-down
Schedule: 30 */1 * * * *
State: Submitted
Job Id: a7db95b6-396a-4753-91d5-23c2e73819ac
Last Probe Time: 2019-04-14T10:43:02Z
Message:
Name: scale-up
Schedule: 0 */1 * * * *
State: Submitted
Events: <none>
4. 等待一段時間,檢視cronhpa的執行狀態。
kubernetes-cronhpa-controller git:(master) kubectl describe cronhpa cronhpa-sample
Name: cronhpa-sample
Namespace: default
Labels: controller-tools.k8s.io=1.0
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"autoscaling.alibabacloud.com/v1beta1","kind":"CronHorizontalPodAutoscaler","metadata":{"annotations":{},"labels":{"controll...
API Version: autoscaling.alibabacloud.com/v1beta1
Kind: CronHorizontalPodAutoscaler
Metadata:
Creation Timestamp: 2019-04-15T06:41:44Z
Generation: 1
Resource Version: 15673230
Self Link: /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/cronhorizontalpodautoscalers/cronhpa-sample
UID: 88ea51e0-5f49-11e9-bd0b-00163e30eb10
Spec:
Jobs:
Name: scale-down
Schedule: 30 */1 * * * *
Target Size: 1
Name: scale-up
Schedule: 0 */1 * * * *
Target Size: 3
Scale Target Ref:
API Version: apps/v1beta2
Kind: Deployment
Name: nginx-deployment-basic
Status:
Conditions:
Job Id: 84818af0-3293-43e8-8ba6-6fd3ad2c35a4
Last Probe Time: 2019-04-15T06:42:30Z
Message: cron hpa job scale-down executed successfully
Name: scale-down
Schedule: 30 */1 * * * *
State: Succeed
Job Id: f8579f11-b129-4e72-b35f-c0bdd32583b3
Last Probe Time: 2019-04-15T06:42:20Z
Message:
Name: scale-up
Schedule: 0 */1 * * * *
State: Submitted
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Succeed 5s cron-horizontal-pod-autoscaler cron hpa job scale-down executed successfully
此時可以在event中發現負載的定時伸縮已經生效。
最後
kubernetes-cronhpa-controller
可以很好的解決擁有周期性資源畫像的負載彈性,結合底層的
cluster-autoscaler
可以降低大量的資源成本。目前
kubernetes-cronhpa-controller
已經
正式開源
,更詳細的用法與文件請查閱程式碼倉庫的文件,歡迎開發者提交issue與pr。
本文為雲棲社群原創內容,未經允許不得轉載。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69922229/viewspace-2643590/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 彈性佈局(伸縮佈局)
- Knative Autoscaler 自定義彈性伸縮
- 如何使用 Kubernetes 實現應用程式的彈性伸縮
- 透過HPA+CronHPA組合應對業務複雜彈性伸縮場景
- CSS-彈性佈局3-伸縮屬性CSS
- 我們總結了彈性伸縮的五個條件與六個教訓
- SpringCloud 應用在 Kubernetes 上的最佳實踐 —— 高可用(彈性伸縮)SpringGCCloud
- Node.js的可伸縮性Node.js
- EMQX Operator 如何快速建立彈性伸縮的 MQTT 叢集MQQT
- js滑鼠懸浮水平彈性伸縮的導航選單JS
- Twitter如何使用Redis提高可伸縮性Redis
- KubeVela + KEDA:為應用帶來“與生俱來”的彈性伸縮能力
- 阿里云云計算ACP認證重點梳理3—彈性伸縮阿里
- 雲端乾貨|降本必備—彈性伸縮的基本原理
- 如何基於容器網路流量指標進行彈性伸縮指標
- CSS-伸縮佈局CSS
- Redis 叢集伸縮原理Redis
- jQuery 伸縮搜尋框jQuery
- Fluid 給資料彈性一雙隱形的翅膀 -- 自定義彈性伸縮UI
- 可伸縮聚類演算法綜述(可伸縮聚類演算法開篇)聚類演算法
- AutoScaling彈性伸縮附加與分離負載均衡例項負載
- 網站架構的伸縮性設計網站架構
- JVM效能優化,提高Java的伸縮性JVM優化Java
- Serverless:基於個性化服務畫像的彈性伸縮實踐Server
- 彈性伸縮:高可用架構利器(架構+演算法+思維)架構演算法
- CSS3 伸縮佈局CSSS3
- redis自學(37)叢集伸縮Redis
- HikariPool原始碼(三)資源池動態伸縮原始碼
- 分散式系統「伸縮性」大招之——「水平&垂直切分」詳解分散式
- 可伸縮NoSQL資料庫的五條建議SQL資料庫
- RDS for MySQL Serverless公測上線:彈性伸縮,最高可降成本超80%MySqlServer
- 類似列表的view伸縮動畫View動畫
- 使用 tke-autoscaling-placeholder 實現秒級彈性伸縮
- 在騰訊雲容器服務 TKE 中利用 HPA 實現業務的彈性伸縮
- 伸縮自如的時光軸實現——改進版
- SQL Server 2008可伸縮性資源調控器簡介SQLServer
- 導航欄實現移入後彈出左右伸縮的過渡(css3)CSSS3
- 大型網站的可伸縮性架構如何設計?網站架構