使用HPA基于QPS數(shù)據(jù)實現(xiàn)應(yīng)用的彈性伸縮
如果您的應(yīng)用需要根據(jù)單位時間內(nèi)收到的請求數(shù)量動態(tài)地調(diào)整計算資源總量,您可以使用ALB實例統(tǒng)計的QPS數(shù)據(jù)為應(yīng)用的Pod設(shè)置彈性伸縮。
閱讀前提示
閱讀本文前,推薦您閱讀創(chuàng)建ALB Ingress了解ALB Ingress的基礎(chǔ)使用方法。
工作原理
QPS(Queries Per Second)指的是每秒鐘收到的請求數(shù)量。ALB實例可以通過日志服務(wù)記錄客戶端的訪問數(shù)據(jù)。HPA(Horizontal Pod Autoscaler)可以根據(jù)訪問記錄,對Service的QPS數(shù)據(jù)進(jìn)行觀測,并對相應(yīng)的工作負(fù)載(Deployment、StatefulSet等)進(jìn)行擴(kuò)縮容。
前提條件
已安裝alibaba-cloud-metrics-adapter組件,且版本為2.3.0及以上。具體操作,請參見部署alibaba-cloud-metrics-adapter組件。
已安裝壓力測試工具Apache Benchmark。具體操作,請參見官方文檔Compiling and Installing。
已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
已創(chuàng)建兩個不同可用區(qū)的交換機(jī),并且與集群處于同一VPC。具體操作,請參見創(chuàng)建和管理交換機(jī)。
步驟一:創(chuàng)建AlbConfig并關(guān)聯(lián)日志Project
查看集群關(guān)聯(lián)的日志Project。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標(biāo)集群名稱,然后在左側(cè)導(dǎo)航欄,選擇集群信息。
在基本信息頁簽下,找到日志服務(wù) Project資源,記錄右側(cè)的日志Project名稱。
創(chuàng)建AlbConfig。
創(chuàng)建并拷貝以下內(nèi)容到alb-qps.yaml中,并在
accessLogConfig
字段中填入日志Project相關(guān)的信息。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-qps spec: config: name: alb-qps addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 虛擬交換機(jī)的ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** accessLogConfig: logProject: <LOG_PROJECT> # 集群關(guān)聯(lián)的日志項目名稱 logStore: <LOG_STORE> # 自定義日志庫名稱,必須以“alb_“開頭 listeners: - port: 80 protocol: HTTP
字段說明如下:
字段
取值類型
說明
logProject
string
SLS日志項目的名稱。
默認(rèn)值:
""
。logStore
string
SLS日志庫的名稱,必須以
alb_
開頭。如果不存在此日志庫,則會自動創(chuàng)建。SLS日志庫的配置示例,請參見開啟日志服務(wù)訪問日志。默認(rèn)值:
""
。執(zhí)行以下命令,創(chuàng)建AlbConfig。
kubectl apply -f alb-qps.yaml
預(yù)期輸出:
albconfig.alibabacloud.com/alb-qps created
步驟二:創(chuàng)建示例資源
除了AlbConfig外,ALB Ingress還需要Deployment、Service、IngressClass、Ingress這4種資源才能正常工作,您可以使用以下的示例快速創(chuàng)建這4種資源。
使用以下內(nèi)容,創(chuàng)建qps-quickstart.yaml。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: qps-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-qps # 與AlbConfig的名稱一致 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: qps-ingress spec: ingressClassName: qps-ingressclass # 與Ingress Class的名稱一致 rules: - host: demo.alb.ingress.top # 替換為您的域名 http: paths: - path: /qps pathType: Prefix backend: service: name: qps-svc port: number: 80 --- apiVersion: v1 kind: Service metadata: name: qps-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: qps-deploy type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: qps-deploy labels: app: qps-deploy spec: replicas: 2 selector: matchLabels: app: qps-deploy template: metadata: labels: app: qps-deploy spec: containers: - name: qps-container image: nginx:1.7.9 ports: - containerPort: 80
執(zhí)行以下命令,創(chuàng)建示例資源。
kubectl apply -f qps-quickstart.yaml
步驟三:創(chuàng)建HPA
創(chuàng)建qps-hpa.yaml文件,并將以下內(nèi)容拷貝到該文件中并保存。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: qps-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: qps-deploy # HPA所控制的工作負(fù)載的名稱 minReplicas: 2 # 最低Pod數(shù)量 maxReplicas: 10 # 最高Pod數(shù)量 metrics: - type: External external: metric: name: sls_alb_ingress_qps # QPS數(shù)據(jù)的指標(biāo)名稱,請勿修改 selector: matchLabels: sls.project: <LOG_PROJECT> # 集群關(guān)聯(lián)的日志項目名稱 sls.logstore: <LOG_STORE> # 自定義日志庫名稱 sls.ingress.route: default-qps-svc-80 # Service的路徑,參數(shù)的格式為<namespace>-<svc>-<port> target: type: AverageValue averageValue: 2 # 指標(biāo)的預(yù)期目標(biāo),示例中是所有Pod的平均QPS為2
字段說明如下:
字段
說明
scaleTargetRef
應(yīng)用所使用的工作負(fù)載。示例中使用的是步驟一中創(chuàng)建的名為qps-deployment的Deployment。
minReplicas
該Deployment可縮容的容器數(shù)量下限。該值需要設(shè)置為大于等于1的整數(shù)。
maxRaplicas
該Deployment可擴(kuò)容的容器數(shù)量上限。該值需要大于最小副本數(shù)。
external.metric.name
HPA基于的QPS數(shù)據(jù)的指標(biāo),請勿修改。
sls.project
指標(biāo)所基于的日志項目,與AlbConfig中的內(nèi)容保持一致。
sls.logstore
指標(biāo)所基于的日志庫,與AlbConfig中的內(nèi)容保持一致。
sls.ingress.route
Service的路徑,格式為<namespace>-<svc>-<port>,示例中為步驟一中創(chuàng)建的名為qps-svc的Service。
external.target
指標(biāo)的預(yù)期目標(biāo),本示例中所有Pod的平均QPS為2。HPA會控制Pod的數(shù)量,使QPS盡可能接近預(yù)期目標(biāo)。
執(zhí)行以下命令,創(chuàng)建HPA。
kubectl apply -f qps-hpa.yaml
執(zhí)行以下命令,查看HPA部署情況。
kubectl get hpa
預(yù)期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 0/2 (avg) 2 10 2 5m41s
執(zhí)行以下命令,查看HPA配置信息。
kubectl describe hpa qps-hpa
預(yù)期輸出:
Name: qps-hpa Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: ******** # HPA的時間戳,可忽略 Reference: Deployment/qps-deployment Metrics: ( current / target ) "sls_alb_ingress_qps" (target average value): 0 / 2 Min replicas: 2 Max replicas: 10 Deployment pods: 2 current / 2 desired
(可選)步驟四:效果驗證
驗證應(yīng)用擴(kuò)容。
執(zhí)行以下命令,查看Ingress信息。
kubectl get ingress
預(yù)期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE qps-ingress qps-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80 10m31s
記錄下
HOSTS
與ADDRESS
部分的值,以便后續(xù)步驟使用。執(zhí)行以下命令,對應(yīng)用進(jìn)行壓測。其中的
demo.alb.ingress.top
與alb-********.alb.aliyuncs.com
請?zhí)鎿Q為在上一步中得到的值。ab -r -c 5 -n 10000 -H Host:demo.alb.ingress.top http://alb-********.alb.aliyuncs.com/qps
執(zhí)行以下命令,查看應(yīng)用的伸縮情況。
kubectl get hpa
預(yù)期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 14375m/2 (avg) 2 10 10 15m
返回結(jié)果中
REPLICAS
為10,表明隨著QPS數(shù)據(jù)增大,應(yīng)用的Pod擴(kuò)容到10個。
驗證應(yīng)用縮容。
壓力測試結(jié)束后,執(zhí)行以下命令,查看應(yīng)用的伸縮情況。
kubectl get hpa
預(yù)期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 0/2 (avg) 2 10 2 28m
返回結(jié)果中
REPLICAS
為2,表明QPS數(shù)據(jù)下降到0后,應(yīng)用縮容到2個Pod。
相關(guān)文檔
如果需要基于Pod的CPU或內(nèi)存負(fù)載對應(yīng)用擴(kuò)縮容,請參見容器水平伸縮(HPA)。
如果需要定時對應(yīng)用擴(kuò)縮容,請參見容器定時水平伸縮(CronHPA)。
節(jié)點的彈性伸縮,請參見節(jié)點伸縮概述。