雲計算

阿里雲專有云容器服務彈性伸縮最佳實踐

1.容器服務彈性伸縮簡介

本小節將基於使用原理對容器服務彈性伸縮進行簡要的描述。
本實踐基於K8s的業務集群運行在專有云上,對測試業務進行壓力測試,主要基於以下三種產品和能力:

  • 利用阿里雲的雲企業網專線打通專有云和公共雲,實現兩朵雲上VPC網絡互通。
  • 利用K8s(Kubernetes)的HPA能力,實現容器的水平伸縮。
  • 利用K8s的Cluster Autoscaler和阿里雲彈性伸縮組ESS能力實現節點的自動伸縮。

當被測試業務指標達到上限時,觸發HPA自動擴容業務pod;當業務集群無法承載更多pod時,觸發公共雲的ESS服務,在公共雲內擴容出ECS並自動添加到專有云的K8s集群。

圖1:容器服務彈性伸縮原理圖.png

圖1:容器服務彈性伸縮原理圖

2.軟件環境

本次最佳實踐的軟件環境要求如下:
應用環境:

  • 容器服務ACK基於專有云V3.10.0版本。
  • 公共云云企業網服務CEN。
  • 公共雲彈性伸縮組服務ESS。

配置條件:

  • 使用專有云的容器服務或者在ECS上手動部署敏捷PaaS。
  • 開通雲專線,打通容器服務所在VPC與公共雲上的VPC。
  • 開通公共雲彈性伸縮組服務(ESS)。

3.配置指導

3.1配置HPA

本小節將介紹配置HPA的詳細步驟。
HPA(Horizontal Pod Autoscaler)是K8s的一種資源對象,能夠根據CPU、內存等指標對statefulset、deployment等對象中的pod數量進行動態伸縮,使運行在上面的服務對指標的變化有一定的自適應能力。
本示例創建了一個支持HPA的nginx應用,創建成功後,當pod的利用率超過本例中設置的20%利用率時,則會進行水平擴容,低於20%的時候會進行縮容。具體操作步驟如下。

3.1.1若使用自建K8s集群,則通過yaml文件配置HPA

①創建一個nginx應用,必須為應用設置request值,否則HPA不會生效。

apiVersion: app/v1beta2
kind: Deployment
spec:
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: hpa-test
    spec:
      dnsPolicy: ClusterFirst
      terminationGracePeriodSeconds:30
      containers:
        image: '192.168.**.***:5000/admin/hpa-example:v1'
        imagePullPolicy: IfNotPresent
        terminationMessagePolicy:File
        terminationMessagePath:/dev/termination-log
        name: hpa-test
        resources:
          requests:
            cpu: //必須設置request值
        securityContext: {}
        restartPolicy:Always
        schedulerName:default-scheduler
  replicas: 1
  selector: 
    matchLabels:
        app: hpa-test
  revisionHistoryLimit: 10
  strategy: 
    type: RollingUpdate
    rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
  progressDeadlineSeconds: 600

②創建HPA。

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
autoscaling.alpha.kubernetes.io/conditions:'[{"type":"AbleToScale","status":"True","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"ScaleDownStabilized","message":"recent recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"ValidMetricFound","message":"theHPA was able to successfully calculate a replica count from cpu resource utilization(percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2020-04-29T06:57:28Z","reason":"DesiredWithinRange","message":"thedesired count is within the acceptable range"}]' autoscaling.alpha.kubernetes.io/currentmetrics:'[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
  creationTimestamp: 2020-04-29T06:57:13Z
  name: hpa-test
  namespace: default
  resourceVersion: "3092268"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/hpa01
  uid: a770ca26-89e6-11ea-a7d7-00163e0106e9
spec:
  maxReplicas: //設置pod數量
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1beta2
    kind: Deployment
    name: centos
  targetCPUUtilizationPercentage://設置CPU閾值
3.1.2若使用阿里雲容器服務,需要在部署應用時選擇配置HPA

圖2:阿里雲容器服務配置HPA.png

圖2:阿里雲容器服務配置HPA

3.2配置Cluster Autoscaler

本小節將介紹配置Cluster Autoscaler的詳細步驟。
節點自動伸縮組件基於K8s資源調度的分配情況進行伸縮判斷,節點中資源的分配通過資源請求(Request)進行計算。
當pod由於資源請求(Request)無法滿足並進入等待(Pending)狀態時,節點自動伸縮組件會根據彈性伸縮組配置信息中的資源規格以及約束配置,計算所需的節點數目。
如果可以滿足伸縮條件,則會觸發伸縮組的節點加入。而當一個節點在彈性伸縮組中且節點上pod的資源請求低於閾值時,節點自動伸縮組件會將節點進行縮容。
因此資源請求(Request)的正確、合理設置,是彈性伸縮的前提條件。

3.2.1配置彈性伸縮組ESS

①創建ESS彈性伸縮組,記錄最小實例數和最大實例數。

圖3:創建彈性伸縮組並配置-1.png

圖3:創建彈性伸縮組並配置-1

圖4:創建彈性伸縮組並配置-2.png

圖4:創建彈性伸縮組並配置-2

②創建伸縮配置,記錄伸縮配置的id。

圖5:創建伸縮配置.png

圖5:創建伸縮配置

#!/bin/sh
yum install -y ntpdate && ntpdate -u ntp1.aliyun.com && curl http:// example.com/public/hybrid/attach_local_node_aliyun.sh | bash -s -- --docker-version 17.06.2-ce-3 --token 9s92co.y2gkocbumal4fz1z --endpoint 192.168.**.***:6443 --cluster-dns 10.254.**.** --region cn-huhehaote
echo "{" > /etc/docker/daemon.json
echo "\"registry-mirrors\": [" >> /etc/docker/daemon.json
echo "\"https://registry-vpc.cn-huhehaote.aliyuncs.com\"" >> /etc/docker/daemon.json
echo "]," >> /etc/docker/daemon.json
echo "\"insecure-registries\": [\"https://192.168.**.***:5000\"]" >> /etc/docker/daemon.json
echo "}" >> /etc/docker/daemon.json
systemctl restart docker
3.2.2 K8s集群部署autoscaler
kubectl apply -f ca.yml

參考ca.yml創建autoscaler,注意修改如下配置與實際環境相對應。

access-key-id: "TFRB********************"
access-key-secret: "bGIy********************W***************"
region-id: "Y24t************"

4.壓力測試

本小節將對最佳實踐的運用場景進行說明。

4.1模擬業務訪問

啟動busybox鏡像,在pod內執行如下命令訪問以上應用的service,可以同時啟動多個pod增加業務負載。

while true;do wget  -q -O-  http://hpa-test/index.html;done

4.2觀察HPA

加壓前:

圖6:加壓前指標值.png

圖6:加壓前指標值

加壓後,當CPU值達到閾值後,會觸發pod的水平擴容:

圖7:加壓後指標值.png

圖7:加壓後指標值

圖8:觸發pod水平擴容.png

圖8:觸發pod水平擴容

4.3觀察pod

當集群資源不足時,新擴容出的pod處於pending狀態,此時將觸發cluster autoscaler,自動擴容節點。

圖9:觸發cluster autoscaler自動擴容節點.png

圖9:觸發cluster autoscaler自動擴容節點

作者:劉偉業

阿里雲智能混合雲PDSA團隊高級解決方案工程師

曾就職於新華三雲做軟件定義數據中心解決方案,負責多個省級雲平臺的架構設計和落地。現就職於阿里雲智能混合雲PDSA團隊負責容器和雲原生產品的方案設計、POC和最佳實踐工作。

我們是阿里雲智能全球技術服務-SRE團隊,我們致力成為一個以技術為基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用雲、基於雲構建更加穩定可靠的業務系統,提升業務穩定性。我們期望能夠分享更多幫助企業客戶上雲、用好雲,讓客戶雲上業務運行更加穩定可靠的技術,您可用釘釘掃描下方二維碼,加入阿里雲SRE技術學院釘釘圈子,和更多雲上人交流關於雲平臺的那些事。

image.png

Leave a Reply

Your email address will not be published. Required fields are marked *