全部產品
Search
文件中心

Container Service for Kubernetes:基於RocketMQ指標的事件驅動伸縮(KEDA)

更新時間:Apr 18, 2025

使用RocketMQ時,訊息堆積產生時容易導致系統負載過高。為避免服務崩潰,提高系統的可靠性和穩定性,您可以基於RocketMQ訊息堆積指標,使用KEDA(Kubernetes Event-driven Autoscaling)為應用的Auto Scaling方案,實現自動化和高效的容器水平伸縮(HPA)。

功能介紹

RocketMQ是一種高效能、高可靠、高擴充性的分布式訊息中介軟體,已被廣泛應用於企業級應用中。但使用RocketMQ時,容易產生訊息堆積的問題,尤其是在高負載情況下。訊息堆積容易導致系統負載過高,甚至導致服務崩潰。

在此情境下,您可以使用Kubernetes事件驅動自動調整工具KEDA,根據自訂的RocketMQ訊息堆積指標,啟動容器水平伸縮應用。此方案可以協助您實現自動化和高效性的應用程式伸縮,從而提高系統的可靠性和穩定性。如果您採用的是開源的RocketMQ,考慮通過JMX的Prometheus Exporter提供訊息對接的資料也可以實作類別似的能力。更多資訊,請參見RocketMQ開源社區

本文使用阿里雲Prometheus作為資料來源,介紹如何?RocketMQ的訊息對接伸縮對象配置。

前提條件

步驟一:部署工作負載

本樣本建立一個名為sample-app的Nginx樣本應用。

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

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

  3. 無狀態頁面,單擊使用YAML建立資源,按照頁面提示選擇樣本模板自訂,使用如下範例程式碼建立一個名為sample-app的Nginx應用。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sample-app
      namespace: default
      labels:
        app: sample-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sample-app
      template:
        metadata:
          labels:
            app: sample-app
        spec:
          containers:
          - name: sample-app
            # 修改為業務真實的RocketMQ的消費者鏡像。
            image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/nginx_optimized:20240221-1.20.1-2.3.0  
            resources:
              limits:
                cpu: "500m"

步驟二:通過ScaledObject配置伸縮策略

您可以通過ScaledObject YAML檔案配置KEDA的伸縮策略,包括擴縮容的對象、最大最小副本數、擴縮容閾值(訊息堆積量閾值)等。在配置ScaledObject前,您需要擷取RocketMQ執行個體指標資料的Prometheus地址等資訊。

1、在RocketMQ控制台擷取RocketMQ執行個體資訊

  1. 登入雲訊息佇列 RocketMQ 版控制台,在左側導覽列單擊執行個體列表

  2. 在頂部功能表列選擇地區,如華東1(杭州),然後在執行個體列表中,單擊目標執行個體名稱。

  3. 在左側導覽列,單擊Topic 管理,查看並記錄名稱的值和右上方執行個體 ID,例如:keda、mq-cn-uax33****。

2、在Prometheus控制台擷取RocketMQ執行個體的Prometheus資料來源

  1. 登入ARMS控制台

  2. 在左側導覽列選擇Prometheus監控 > 執行個體列表,進入可觀測監控 Prometheus 版的執行個體列表頁面。

  3. 單擊目標執行個體雲端服務-{{RegionId}},在左側導覽列,單擊設定,記錄HTTP API地址(Grafana 讀取地址)

    image

3、建立ScaledObject YAML檔案

  1. 使用如下內容,建立ScaledObject.yaml,配置伸縮策略。

    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: prometheus-scaledobject
      namespace: default
    spec:
      scaleTargetRef:
        name: sample-app
      maxReplicaCount: 10
      minReplicaCount: 2
      triggers:
      - type: prometheus
        metadata:
          serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
          metricName: rocketmq_consumer_inflight_messages
          query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
          threshold: '30'

    參數說明如下。

    參數

    說明

    scaleTargetRef.name

    配置擴縮容的對象,這裡配置步驟一:部署工作負載建立好的應用sample-app。

    maxReplicaCount

    擴容的最大副本數。

    minReplicaCount

    縮容的最小副本數。

    serverAddress

    配置儲存RocketMQ指標資料的Prometheus地址,即上文記錄的HTTP API地址(Grafana 讀取地址)

    metricName

    PromQL請求資料。

    query

    對metricName中PromQL請求的資料做彙總操作,此處彙總方式為訊息堆積量的PromQL。

    threshold

    擴縮容的閾值。本樣本將訊息堆積量30作為閾值,超過30時會觸發擴容。

  2. 執行如下命令,部署檔案並查看建立的資源。

    # 下發伸縮配置。
    kubectl apply -f ScaledObject.yaml
    
    scaledobject.keda.sh/prometheus-scaledobject created
    
    # 擷取伸縮配置狀態。
    kubectl get ScaledObject
    
    NAME                      SCALETARGETKIND      SCALETARGETNAME   MIN   MAX   TRIGGERS     AUTHENTICATION   READY   ACTIVE   FALLBACK   AGE
    prometheus-scaledobject   apps/v1.Deployment   sample-app        2     10    prometheus                    True    False    False      105s
    
    # 檢查HPA的產生情況。
    kubectl get hpa
    
    NAME                               REFERENCE               TARGETS      MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)   2         10        2          28m
  3. (可選)使用Prometheus Token以提高資料讀取的安全性,並配置Prometheus Token的驗證。

    展開查看詳細步驟

    1. 按照頁面提示,產生Prometheus Token。

      image

    2. 建立一個Secret,其中需對customAuthHeader: "Authorization"customAuthValue這兩個欄位的Value值進行Base64編碼。

      apiVersion: v1
      kind: Secret
      metadata:
        name: keda-prom-secret
        namespace: default
      data:
        customAuthHeader: "QXV0Xxxxxxxlvbg=="
        customAuthValue: "kR2tpT2lJeFpXSmxaVFV6WlMTxxxxxxxxRMVFE0TUdRdE9USXpaQzFqWkRZd09EZ3dOVFV5WWpZaWZRLjlDaFBYU0Q2dEhWc1dQaFlyMGh3ZU5FQjZQZWVETXFjTlYydVNqOU82TTQ="
    3. 參見下方範例程式碼,建立KEDA請求資料的憑證,並部署到叢集中。

      apiVersion: keda.sh/v1alpha1
      kind: TriggerAuthentication
      metadata:
        name: keda-prom-creds
        namespace: default
      spec:
        secretTargetRef:
          - parameter: customAuthHeader
            name: keda-prom-secret
            key: customAuthHeader
          - parameter: customAuthValue
            name: keda-prom-secret
            key: customAuthValue
    4. 在ScaledObject YAML檔案中,配置authenticationRef欄位,填寫建立的憑證名稱。

      apiVersion: keda.sh/v1alpha1
      kind: ScaledObject
      metadata:
        name: prometheus-scaledobject
        namespace: default
      spec:
        scaleTargetRef:
          name: sample-app
        maxReplicaCount: 10
        minReplicaCount: 2
        triggers:
        - type: prometheus
          metadata:
            serverAddress: http://cn-beijing.arms.aliyuncs.com:9090/api/v1/prometheus/8cba801fff65546a3012e9a684****/****538168824185/cloud-product-rocketmq/cn-beijing
            metricName: rocketmq_consumer_inflight_messages
            query: sum({__name__=~"rocketmq_consumer_ready_messages|rocketmq_consumer_inflight_messages",instance_id="rmq-cn-uax3xxxxxx",topic=~"keda"}) by (consumer_group)
            threshold: '30'
            authModes: "custom"
          authenticationRef: # 配置欄位。
              name: keda-prom-creds # 填寫憑證名稱。
      說明

      本樣本使用Custom authentication的認證類型。您可以參見KEDA社區文檔選擇其他認證方式。

步驟三:生產和消費資料

本樣本使用rocketmq-keda-sample專案生產和消費資料,請在專案代碼中配置步驟二中記錄的RocketMQ執行個體的地址、使用者名稱、密碼。

步驟四:使用生產和消費資料實現擴縮容

  1. 登入雲訊息佇列 RocketMQ 版控制台,在左側導覽列單擊執行個體列表

  2. 在頂部功能表列選擇地區,如華東1(杭州),然後在執行個體列表中,單擊目標執行個體名稱,查看並記錄存取點和網路資訊

  3. 在左側導覽列,單擊存取控制,然後單擊智能身份識別頁簽,查看並記錄執行個體使用者名稱和執行個體密碼。

  4. 運行Producer程式生產資料,然後執行如下命令,查看HPA伸縮情況。

    kubectl get hpa

    預期輸出:

    NAME                               REFERENCE               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   32700m/30 (avg)   2         10        10         47m

    預期輸出表明,sample-app應用已經擴容到KEDA組件設定的最大副本數。

  5. 關閉Producer程式,運行Consumer程式,然後執行如下命令,查看HPA伸縮情況。

    kubectl get hpa -w

    預期輸出:

    NAME                               REFERENCE               TARGETS            MINPODS   MAXPODS   REPLICAS   AGE
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   222500m/30 (avg)   2         10        10         50m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   232400m/30 (avg)   2         10        10         51m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        10         52m
    keda-hpa-prometheus-scaledobject   Deployment/sample-app   0/30 (avg)         2         10        2          57m

    預期輸出表明,在資料消費結束一段時間後,sample-app應用縮容至KEDA組件設定的最小副本數。

相關文檔

您也可以實現基於RabbitMQ指標的KEDA,監控隊列長度和訊息速率指標,請參見基於RabbitMQ指標的容器水平伸縮