如果您的應用需要根據單位時間內收到的請求數量動態地調整計算資源總量,您可以使用ALB執行個體統計的QPS資料為應用的Pod設定Auto Scaling。
閱讀前提示
閱讀本文前,推薦您閱讀建立ALB Ingress瞭解ALB Ingress的基礎使用方法。
工作原理
QPS(Queries Per Second)指的是每秒鐘收到的請求數量。ALB執行個體可以通過Log Service記錄用戶端的訪問資料。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。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊。
在基本資料頁簽下,找到Log Service 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日誌庫的配置樣本,請參見開啟Log Service訪問日誌。預設值:
""
。執行以下命令,建立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)。
節點的Auto Scaling,請參見節點伸縮概述。