1.容器服務彈性伸縮簡介
本小節将基于使用原理對容器服務彈性伸縮進行簡要的描述。
本實踐基于K8s的業務叢集運作在專有雲上,對測試業務進行壓力測試,主要基于以下三種産品和能力:
- 利用阿裡雲的雲企業網專線打通專有雲和公共雲,實作兩朵雲上VPC網絡互通。
- 利用K8s(Kubernetes)的HPA能力,實作容器的水準伸縮。
- 利用K8s的Cluster Autoscaler和阿裡雲彈性伸縮組ESS能力實作節點的自動伸縮。
當被測試業務名額達到上限時,觸發HPA自動擴容業務pod;當業務叢集無法承載更多pod時,觸發公共雲的ESS服務,在公共雲内擴容出ECS并自動添加到專有雲的K8s叢集。

圖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
3.2配置Cluster Autoscaler
本小節将介紹配置Cluster Autoscaler的詳細步驟。
節點自動伸縮元件基于K8s資源排程的配置設定情況進行伸縮判斷,節點中資源的配置設定通過資源請求(Request)進行計算。
當pod由于資源請求(Request)無法滿足并進入等待(Pending)狀态時,節點自動伸縮元件會根據彈性伸縮組配置資訊中的資源規格以及限制配置,計算所需的節點數目。
如果可以滿足伸縮條件,則會觸發伸縮組的節點加入。而當一個節點在彈性伸縮組中且節點上pod的資源請求低于門檻值時,節點自動伸縮元件會将節點進行縮容。
是以資源請求(Request)的正确、合理設定,是彈性伸縮的前提條件。
3.2.1配置彈性伸縮組ESS
①建立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
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:加壓前名額值
加壓後,當CPU值達到門檻值後,會觸發pod的水準擴容:
圖7:加壓後名額值
圖8:觸發pod水準擴容
4.3觀察pod
當叢集資源不足時,新擴容出的pod處于pending狀态,此時将觸發cluster autoscaler,自動擴容節點。
圖9:觸發cluster autoscaler自動擴容節點
作者:劉偉業
阿裡雲智能混合雲PDSA團隊進階解決方案工程師
曾就職于新華三雲負責軟體定義資料中心解決方案,承擔多個省級雲平台的架構設計和落地。現就職于阿裡雲智能混合雲PDSA團隊負責容器和雲原生産品的方案設計、POC和最佳實踐工作。
我們是阿裡雲智能全球技術服務-SRE團隊,我們緻力成為一個以技術為基礎、面向服務、保障業務系統高可用的工程師團隊;提供專業、體系化的SRE服務,幫助廣大客戶更好地使用雲、基于雲建構更加穩定可靠的業務系統,提升業務穩定性。我們期望能夠分享更多幫助企業客戶上雲、用好雲,讓客戶雲上業務運作更加穩定可靠的技術,您可用釘釘掃描下方二維碼,加入阿裡雲SRE技術學院釘釘圈子,和更多雲上人交流關于雲平台的那些事。