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