如果您的應用需要根據單位時間內收到的請求數量動態地調整計算資源總量,您可以使用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及以上。具體操作,請參見部署ack-alibaba-cloud-metrics-adapter組件。
已安裝壓力測試工具Apache Benchmark。具體操作,請參見官方文檔Compiling and Installing。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
已建立兩個不同可用性區域的交換器,並且與叢集處於同一VPC,且需在ALB支援的可用性區域內。具體操作,請參見建立和管理交換器。
步驟一:建立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訪問日誌。預設值:
"alb_****"。執行以下命令,建立AlbConfig。
kubectl apply -f alb-qps.yaml預期輸出:
albconfig.alibabacloud.com/alb-qps created
步驟二:建立樣本資源
除了 AlbConfig 外,ALB Ingress 還需要 Deployment、Service、IngressClass 和 Ingress 這 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 # 使用外部指標(非K8s原生指標) external: metric: name: sls_alb_ingress_qps # 指標名稱(阿里雲ALB Ingress的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擴容到目標MAXPODS最大值10個Pod。
驗證應用縮容。
壓力測試結束後,執行以下命令,查看應用的伸縮情況。
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後,應用縮容到MINPODS最小值2個Pod。
相關文檔
如果需要基於Pod的CPU或記憶體負載對應用擴縮容,請參見容器水平伸縮(HPA)。
如果需要定時對應用擴縮容,請參見容器定時水平伸縮(CronHPA)。
節點的Auto Scaling,請參見節點伸縮。