簡介: 阿里雲專有云容器服務彈性伸縮最佳實踐html
本小節將基於使用原理對容器服務彈性伸縮進行簡要的描述。
本實踐基於K8s的業務集羣運行在專有云上,對測試業務進行壓力測試,主要基於如下三種產品和能力:node
當被測試業務指標達到上限時,觸發HPA自動擴容業務pod;當業務集羣沒法承載更多pod時,觸發公共雲的ESS服務,在公共雲內擴容出ECS並自動添加到專有云的K8s集羣。nginx
圖1:容器服務彈性伸縮原理圖docker
本次最佳實踐的軟件環境要求以下:
應用環境:json
配置條件:centos
本小節將介紹配置HPA的詳細步驟。
HPA(Horizontal Pod Autoscaler)是K8s的一種資源對象,可以根據CPU、內存等指標對statefulset、deployment等對象中的pod數量進行動態伸縮,使運行在上面的服務對指標的變化有必定的自適應能力。
本示例建立了一個支持HPA的nginx應用,建立成功後,當pod的利用率超過本例中設置的20%利用率時,則會進行水平擴容,低於20%的時候會進行縮容。具體操做步驟以下。api
①建立一個nginx應用,必須爲應用設置request值,不然HPA不會生效。bash
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閾值
圖2:阿里雲容器服務配置HPA架構
本小節將介紹配置Cluster Autoscaler的詳細步驟。
節點自動伸縮組件基於K8s資源調度的分配狀況進行伸縮判斷,節點中資源的分配經過資源請求(Request)進行計算。
當pod因爲資源請求(Request)沒法知足並進入等待(Pending)狀態時,節點自動伸縮組件會根據彈性伸縮組配置信息中的資源規格以及約束配置,計算所需的節點數目。
若是能夠知足伸縮條件,則會觸發伸縮組的節點加入。而當一個節點在彈性伸縮組中且節點上pod的資源請求低於閾值時,節點自動伸縮組件會將節點進行縮容。
所以資源請求(Request)的正確、合理設置,是彈性伸縮的前提條件。
①建立ESS彈性伸縮組,記錄最小實例數和最大實例數。
圖3:建立彈性伸縮組並配置-1
圖4:建立彈性伸縮組並配置-2
②建立伸縮配置,記錄伸縮配置的id。
圖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
kubectl apply -f ca.yml
參考ca.yml建立autoscaler,注意修改以下配置與實際環境相對應。
access-key-id: "TFRB********************" access-key-secret: "bGIy********************W***************" region-id: "Y24t************"
本小節將對最佳實踐的運用場景進行說明。
啓動busybox鏡像,在pod內執行以下命令訪問以上應用的service,能夠同時啓動多個pod增長業務負載。
while true;do wget -q -O- http://hpa-test/index.html;done
加壓前:
圖6:加壓前指標值
加壓後,當CPU值達到閾值後,會觸發pod的水平擴容:
圖7:加壓後指標值
圖8:觸發pod水平擴容
當集羣資源不足時,新擴容出的pod處於pending狀態,此時將觸發cluster autoscaler,自動擴容節點。
圖9:觸發cluster autoscaler自動擴容節點
做者:劉偉業阿里雲智能混合雲PDSA團隊高級解決方案工程師
曾就任於新華三雲作軟件定義數據中心解決方案,負責多個省級雲平臺的架構設計和落地。現就任於阿里雲智能混合雲PDSA團隊負責容器和雲原生產品的方案設計、POC和最佳實踐工做。