全部產品
Search
文件中心

:使用HPA基於QPS資料實現應用的Auto Scaling

更新時間:Jun 26, 2024

如果您的應用需要根據單位時間內收到的請求數量動態地調整計算資源總量,您可以使用ALB執行個體統計的QPS資料為應用的Pod設定Auto Scaling。

閱讀前提示

閱讀本文前,推薦您閱讀ALB Ingress快速入門瞭解ALB Ingress的基礎使用方法。

工作原理

QPS(Queries Per Second)指的是每秒鐘收到的請求數量。ALB執行個體可以通過Log Service記錄用戶端的訪問資料。HPA(Horizontal Pod Autoscaler)可以根據訪問記錄,對Service的QPS資料進行觀測,並對相應的工作負載(Deployment、StatefulSet等)進行擴縮容。

前提條件

步驟一:建立AlbConfig並關聯日誌Project

  1. 查看叢集關聯的日誌Project。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊

    3. 叢集資源頁簽下,找到Log Service Project資源,記錄右側的日誌Project名稱。

  2. 建立AlbConfig。

    1. 建立並拷貝以下內容到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

      欄位說明如下:

      欄位

      取實值型別

      說明

      logStore

      string

      SLS日誌庫的名稱。

      預設值:""

      logProject

      string

      SLS記錄項目的名稱,必須以alb_開頭。如果不存在此記錄項目,則會自動建立。

      預設值:""

    2. 執行以下命令,建立AlbConfig。

       kubectl apply -f alb-qps.yaml

      預期輸出:

      albconfig.alibabacloud.com/alb-qps created

步驟二:建立樣本資源

除了AlbConfig外,ALB Ingress還需要Deployment、Service、IngressClass、Ingress這4種資源才能正常工作,您可以使用以下的樣本快速建立這4種資源。

  1. 使用以下內容,建立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
  2. 執行以下命令,建立樣本資源。

    kubectl apply -f qps-quickstart.yaml

步驟三:建立HPA

  1. 建立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儘可能接近預期目標。

  2. 執行以下命令,建立HPA。

    kubectl apply -f qps-hpa.yaml
  3. 執行以下命令,查看HPA部署情況。

    kubectl get hpa

    預期輸出:

    NAME      REFERENCE               TARGETS     MINPODS   MAXPODS   REPLICAS   AGE
    qps-hpa   Deployment/qps-deploy   0/2 (avg)   2         10        2          5m41s
  4. 執行以下命令,查看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

(可選)步驟四:效果驗證

  1. 驗證應用擴容。

    1. 執行以下命令,查看Ingress資訊。

      kubectl get ingress

      預期輸出:

      NAME            CLASS                HOSTS                  ADDRESS                         PORTS     AGE
      qps-ingress     qps-ingressclass     demo.alb.ingress.top   alb-********.alb.aliyuncs.com   80        10m31s

      記錄下HOSTSADDRESS部分的值,以便後續步驟使用。

    2. 執行以下命令,對應用進行壓測。其中的demo.alb.ingress.topalb-********.alb.aliyuncs.com請替換為在上一步中得到的值。

      ab -r -c 5 -n 10000 -H Host:demo.alb.ingress.top http://alb-********.alb.aliyuncs.com/qps
    3. 執行以下命令,查看應用的伸縮情況。

      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個。

  2. 驗證應用縮容。

    壓力測試結束後,執行以下命令,查看應用的伸縮情況。

    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。

相關文檔