全部產品
Search
文件中心

Container Service for Kubernetes:基於阿里雲組件指標的容器水平伸縮

更新時間:Jun 19, 2024

本文介紹如何在Kubernetes提供外部指標(External Metrics)支援的情況下,通過配置如HTTP請求率、Ingress QPS等指標,在阿里雲環境中實現應用的自動水平伸縮。

前提條件

已建立Kubernetes叢集。具體操作,請參見建立Kubernetes託管版叢集建立Kubernetes專有版叢集建立叢集

部署alibaba-cloud-metrics-adapter組件

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

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

  3. Helm頁面,單擊建立。參考如下資訊完成基礎資訊配置。

    參數

    樣本值

    應用程式名稱

    ack-alibaba-cloud-metrics-adapter

    命名空間

    kube-system

    來源

    預設為應用市場

    Chart

    • 應用情境:選擇全部

    • 支援架構:選擇amd64

    • 搜尋方塊:搜尋ack-alibaba-cloud-metrics-adapter。

    選中ack-alibaba-cloud-metrics-adapter,單擊下一步

  4. 參數配置頁面,選擇Chart 版本,然後單擊確定

配置HPA自動調整樣本

本文以建立名為Nginx的Deployment和Service為例配置HPA自動調整。

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

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面中,單擊使用YAML建立資源

  4. 設定樣本模板自訂,並使用以下YAML檔案建立一個應用,並暴露一個ClusterIP的Service,然後單擊建立

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: nginx
      type: ClusterIP
  5. 在叢集管理頁左側導覽列中,選擇網路 > 路由,並在路由頁面右上方,單擊建立Ingress

  6. 建立面板中填寫相關資訊,然後單擊確定。完成建立後,系統會自動跳轉至路由頁面。

  7. 名稱下,單擊產生的Ingress名稱,查看路由規則資訊。

  8. 配置HPA。

    1. 單擊左上方的返回符號,返回叢集列表頁面。

    2. 在控制台左側導覽列,選擇市場 > 編排模板

    3. 模板列表頁面右上方單擊建立

    4. 建立對話方塊中,配置編排模板,最後單擊儲存

      • 名稱:設定該模板的名稱,本文配置為HPA。

      • 描述:輸入對該模板的描述,可不配置。

      • 模板:配置符合Kubernetes YAML文法規則的編排模板,參考以下檔案。

      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      metadata:
        name: ingress-hpa
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: nginx-deployment-basic
        minReplicas: 2
        maxReplicas: 10
        metrics:
          - type: External
            external:
              metric:
                name: sls_ingress_qps
                selector:
                  matchLabels:
                    sls.project: "***" # 替換sls.project的值為真實值。
                    sls.logstore: "nginx-ingress"
                    sls.ingress.route: "default-nginx-80"
              target:
                type: AverageValue
                averageValue: 10
          - type: External
            external:
              metric:
                name: sls_ingress_latency_p9999
                selector:
                  matchLabels:
                    # default ingress log project is k8s-log-clusterId
                    sls.project: "***" 
                    # default ingress logstre is nginx-ingress
                    sls.logstore: "nginx-ingress"
                    # namespace-svc-port
                    sls.ingress.route: "default-nginx-80"
                    # sls vpc endpoint, default true
                    # sls.internal.endpoint:true
              target:
                type: Value
                # sls_ingress_latency_p9999 > 10ms
                value: 10

      HPA的配置涉及的參數如下:

      參數名

      描述

      sls.ingress.route

      必填,參數的格式為:<namespace>-<svc>-<port>,例如default-nginx-80

      說明

      <namespace>為Ingress所在的命名空間,<svc>是Ingress對應的Service名稱,<port>是Ingress對應Service的Port名稱。

      sls.logstore

      Log Service的日誌庫名稱,必填。叢集中預設sls.logstore值為nginx-ingress

      sls.project

      Log Service的Project名稱,必填。叢集中預設sls.project值為k8s-log-叢集ID.

      sls.internal.endpoint

      設定通過內網還是外網訪問Log Service,預設為true。選擇true說明通過內網訪問Log Service;選擇false說明通過外網訪問Log Service。

      說明

      sls_ingress_qpssls_ingress_latency_p9999是本文實現伸縮使用的兩個指標。在targettype中。

      • sls_ingress_qps設定的是AverageValue,表示QPS要除以Pod的數目進行判斷。

      • sls_ingress_latency_p9999設定的是Value,表示無需除以Pod的數目。

      以上兩種不同的type在HPA的設定中會經常用到。

    5. 模板列表頁面,選擇HPA並單擊建立應用

    6. 模板列表 - HPA頁面右側,單擊建立

  9. 設定好HPA後,執行以下指令碼進行壓測。

    #!/bin/bash
    ##使用Apache Benchmark對Ingress暴露的服務設定並發為10,時間為300秒的壓測。
    ab -t 300 -c 10 <ingress配置的網域名稱>
  10. 驗證指標伸縮狀態。

    1. 在控制台左側導覽列單擊叢集,並在叢集列表頁面,選擇目的地組群操作列的更多 > 通過CloudShell管理叢集

    2. 執行以下命令檢查伸縮狀態。

      kubectl get hpa ingress-hpa

      預期輸出:

      NAME            REFERENCE                              TARGETS           MINPODS    MAXPODS    REPLICAPS   AGE
      ingress-hpa     Depolyment/nginx-deployment-basic      21/10 (avg)       2          10         10          7m49s

      REPLICAS的值和MAXPODS的值相同時,說明伸縮成功。

通過命令列查詢資料

可以通過以下命令列查詢資料。以請求指標sls_ingress_qps為例。

kubectl get --raw  /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress

其中 {{SLS_Project}}是此ACK叢集對應的SLS日誌中心的Project名。若未自訂配置,預設為k8s-log-{{ClusterId}},{{ClusterId}}為此叢集的ClusterId。

若返回結果為:

Error from server: {
    "httpCode": 400,
    "errorCode": "ParameterInvalid",
    "errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is  in your log,please wrap : with quotation mark \"",
    "requestID": "xxxxxxx"
}

表明此指標無資料。原因可能是未配置使用ALB Ingress,但使用了sls_alb_ingress_qps指標進行資料查詢。

常見問題

  • 問:如果執行kubectl get hpa後發現target一欄為<unknow>怎麼辦?

    答:請按照以下操作解決。

    1. 執行kubectl describe hpa <hpa_name>,確認HPA失效的原因。

      • 如果Conditions欄位提示AbleToScaleFalse,請確認Deployment是否正常部署。

      • 如果Conditions欄位提示ScalingActiveFalse,請繼續下一步。

    2. 執行kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"。如果返回為Error from server (NotFound): the server could not find the requested resource,請確認alibaba-cloud-metrics-adapter的啟動狀態。

      如果確認alibaba-cloud-metrics-adapter狀態正常,請確認HPA指標是否是Ingress相關指標。如果是Ingress相關指標,您需要提前部署Log Service組件。更多資訊,請參見Nginx Ingress訪問日誌分析與監控

    3. 確認HPA指標填寫正確。sls.ingress.route的值格式為<namespace>-<svc>-<port>

      • namespace為Ingress所在的命名空間。

      • svc是Ingress對應的Service名稱。

      • port是Ingress對應Service的連接埠名稱。

  • 問:如何尋找HPA支援的指標名稱?

    答:請參見阿里雲HPA指標, 以下列舉為常用指標。

    指標名稱

    描述

    附加參數

    sls_ingress_qps

    指定的IngressRoute每秒查詢率

    sls.ingress.route

    sls_alb_ingress_qps

    ALB資料的IngressRoute每秒查詢率

    sls.ingress.route

    sls_ingress_latency_avg

    所有請求的延遲

    sls.ingress.route

    sls_ingress_latency_p50

    50%請求的延遲

    sls.ingress.route

    sls_ingress_latency_p95

    95%請求的延遲

    sls.ingress.route

    sls_ingress_latency_p99

    99%請求的延遲

    sls.ingress.route

    sls_ingress_latency_p9999

    99.99%請求的延遲

    sls.ingress.route

    sls_ingress_inflow

    Ingress的流入頻寬

    sls.ingress.route

  • 問:當使用者自訂了Nginx Ingress日誌格式,如何進行適配操作?

    答:本文介紹的使用SLS Ingress指標進行容器水平伸縮,需要您開啟並正確配置叢集中Nginx Ingress日誌接入阿里雲Log Service。

    • 在建立叢集時,Log Service是預設開啟的。當您保持預設值不變,叢集建立成功後,您可以在阿里雲Log ServiceSLS控制台查看Nginx Ingress的訪問日誌分析報表和監控Nginx Ingress即時狀態。

    • 在建立叢集時,若您手動關閉了Log Service,叢集建立完成後,如果想要使用SLS Ingress指標進行容器水平伸縮,您需要重新開啟或配置Log Service。詳細資料,請參見Nginx Ingress訪問日誌分析與監控

    • 當您需要自訂Nginx Ingress日誌格式時,由於叢集中初次開啟Log Service部署AliyunLogConfig的CRD只針對ACK預設Ingress Controller中的日誌格式生效,若您修改過Ingress Controller的訪問日誌格式,請修改CRD配置中的Regex提取processor_regex部分。具體操作,請參見通過DaemonSet-CRD方式採集容器日誌

相關文檔