Kubernetes 彈性伸縮全場景解讀(五) - 定時伸縮組件發佈與開源

file

做者| 阿里雲容器技術專家劉中巍(莫源)nginx

導讀:Kubernetes彈性伸縮系列文章爲讀者一一解析了各個彈性伸縮組件的相關原理和用法。本篇文章中,阿里雲容器技術專家莫源將爲你帶來定時伸縮組件  kubernetes-cronhpa-controller  的相關介紹與具體操做,目前該組件已經正式開源,歡迎你們一塊兒交流探討。git

前言

容器技術的發展讓軟件交付和運維變得更加標準化、輕量化、自動化。這使得動態調整負載的容量變成一件很是簡單的事情。在 Kubernetes 中,一般只須要修改對應的 replicas 數目便可完成。當負載的容量調整變得如此簡單後,咱們再回過頭來看下應用的資源畫像。github

對於大部分互聯網的在線應用而言,負載的峯谷分佈是存在必定規律的。例以下圖是一個典型 web 應用的負載曲線。從天天早上 8 點開始,負載開始飆高,在中午 12 點到 14 點之間,負載會回落;14 點到 18 點會迎來第二個高峯;在 18 點以後負載會逐漸回落到最低點。web

file

資源的波峯和波谷之間相差 3~4 倍左右的容量,低負載的時間會維持 8 個小時左右。若是使用純靜態的容量規劃方式進行應用管理與部署,咱們能夠計算得出資源浪費比爲 25% (計算方式: 1 - (18+416)/424 = 0.25 )。而當波峯和波谷之間的差異到達 10 倍的時候,資源浪費比就會飆升至 57% (計算方式: 1 - (18+1016)/1024 = 0.57 )。api

那麼當咱們面對這麼多的資源浪費時,是否能夠經過彈性的方式來解決呢?app

標準的 HPA 是基於指標閾值進行伸縮的,常見的指標主要是 CPU、內存,固然也能夠經過自定義指標例如 QPS、鏈接數等進行伸縮。可是這裏存在一個問題:基於資源的伸縮存在必定的時延,這個時延主要包含:採集時延(分鐘級) + 判斷時延(分鐘級) + 伸縮時延(分鐘級)。而對於上圖中,咱們能夠發現負載的峯值毛刺仍是很是尖銳的,這有可能會因爲 HPA 分鐘級別的伸縮時延形成負載數目沒法及時變化,短期內應用的總體負載飆高,響應時間變慢。特別是對於一些遊戲業務而言,因爲負載太高帶來的業務抖動會形成玩家很是差的體驗。運維

爲了解決這個場景,阿里雲容器服務提供了 kube-cronhpa-controller,專門應對資源畫像存在週期性的場景。開發者能夠根據資源畫像的週期性規律,定義 time schedule,提早擴容好資源,而在波谷到來後定時回收資源。底層再結合 cluster-autoscaler 的節點伸縮能力,提供資源成本的節約。ide

使用方式

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。

Kubernetes 彈性伸縮系列文章目錄


掃描下方二維碼添加小助手,與 8000 位雲原生愛好者討論技術趨勢,實戰進階! 進羣暗號:公司-崗位-城市 file

相關文章
相關標籤/搜索