在 Azure Container Apps 中設定調整規則

Azure 容器應用程式會透過一組宣告式調整規則來管理自動水平調整。 當容器應用程式修訂擴增時,系統會視需要為修訂建立新的執行個體。 這些執行個體稱為複本。

新增或編輯調整規則會建立容器應用程式的新修訂版本。 修訂版是容器應用程式的不可變快照。 若要瞭解哪些類型的變更會觸發新的修訂,請參閱修訂 變更類型

事件驅動容器應用程式作業 會使用調整規則來根據事件觸發執行。

調整定義

調整是限制、規則和行為的組合。

  • 限制 會定義每個修訂的最小和最大可能複本數目,因為您的容器應用程式會進行調整。

    調整限制 預設值 最小值 最大值
    每個修訂的最小複本數目 0 0 可設定的最大複本在 Azure 入口網站 中為 300,在 Azure CLI 中為 1,000 個。
    每個修訂的最大複本數目 10 1 可設定的複本上限為 300,Azure 入口網站,在 Azure CLI 中為 1,000 個。
  • 規則 是容器應用程式用來決定何時新增或移除複本的準則。

    調整規則 會實作為 HTTP、TCP(傳輸控制通訊協定)或自定義。

  • 行為 是規則和限制的組合,可決定一段時間的調整決策。

    調整行為 說明調整決策的制定方式。

當您定義調整規則時,請務必考慮下列專案:

  • 如果容器應用程式調整為零,則不會向您收取使用量費用。
  • 未處理但保留在記憶體中的複本可能會以較低的「閒置」費率計費。 如需詳細資訊,請參閱帳單
  • 如果您想要確保修訂的執行個體會永遠執行,請將複本的最小數目設定為 1 或更高的值。

調整規則

調整會由三種不同的觸發程序類別驅動:

  • HTTP:根據修訂的並行 HTTP 要求數目。
  • TCP:根據修訂的並行 TCP 連線數目。
  • 自訂:根據 CPU、記憶體或支援的事件驅動數據來源,例如:
    • Azure 服務匯流排
    • Azure 事件中樞
    • Apache Kafka
    • Redis

如果您定義多個調整規則,容器應用程式會在符合任何規則的第一個條件後立刻開始調整。

HTTP

使用 HTTP 調整規則時,您可以控制並行 HTTP 要求的閾值,此閾值會決定容器應用程式修訂的調整方式。 每 15 秒,並行要求的數目會計算為過去 15 秒的要求數目除以 15。 容器應用程式作業 不支援 HTTP 調整規則。

在下列範例中,修訂會擴增至五個複本,而且可以縮減為零。 調整屬性會設定為每秒 100 個並行要求。

範例

http 段會定義 HTTP 縮放規則。

Scale 屬性 描述 預設值 最小值 最大值
concurrentRequests 當 HTTP 要求數目超過此值時,就會新增另一個複本。 復本會繼續新增至集區,最多可達 maxReplicas 數量。 10 1 n/a
{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [{
            "name": "http-rule",
            "http": {
              "metadata": {
                "concurrentRequests": "100"
              }
            }
          }]
        }
      }
    }
  }
}

注意

properties.configuration.activeRevisionsMode使用非 HTTP 事件調整規則時,將容器應用程式的 屬性設定為 single

在或 update 命令中使用 --scale-rule-http-concurrencycreate 參數定義 HTTP 縮放規則。

CLI 參數 描述 預設值 最小值 最大值
--scale-rule-http-concurrency 當並行 HTTP 要求數目超過此值時,就會新增另一個複本。 復本會繼續新增至集區,最多可達 max-replicas 數量。 10 1 n/a
az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --environment <ENVIRONMENT_NAME> \
  --image <CONTAINER_IMAGE_LOCATION>
  --min-replicas 0 \
  --max-replicas 5 \
  --scale-rule-name azure-http-rule \
  --scale-rule-type http \
  --scale-rule-http-concurrency 100
  1. 移至 Azure 入口網站 中的容器應用程式

  2. 選取 [調整]。

  3. 選取 [編輯並部署]

  4. 選取 [調整] 索引標籤。

  5. 選取最小和最大複本範圍。

    Azure Container Apps 縮放範圍滑桿的螢幕快照。

  6. 選取 [新增]。

  7. 在 [ 規則名稱] 方塊中,輸入規則名稱。

  8. 從 [ 類型 ] 下拉式清單中,選取 [ HTTP 調整]。

  9. 在 [ 並行要求 ] 方塊中,輸入容器應用程式所需的並行要求數目。

TCP

使用 TCP 調整規則時,您可以控制用以決定應用程式調整方式的並行 TCP 連線閾值。 每 15 秒,並行連線數目會計算為過去 15 秒的連線數目除以 15。 容器應用程式作業 不支援 TCP 調整規則。

在下列範例中,容器應用程式修訂會擴增至五個複本,而且可以縮減為零。 調整閾值會設定為每秒 100 個並行連線。

範例

tcp 段會定義 TCP 調整規則。

Scale 屬性 描述 預設值 最小值 最大值
concurrentConnections 當並行 TCP 連線數目超過此值時,系統便會再新增一個複本。 當並行連線數目增加時,復本會繼續加到 maxReplicas 數量。 10 1 n/a
{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [{
            "name": "tcp-rule",
            "tcp": {
              "metadata": {
                "concurrentConnections": "100"
              }
            }
          }]
        }
      }
    }
  }
}

createupdate 命令中使用 --scale-rule-tcp-concurrency 參數定義 TCP 調整規則。

CLI 參數 描述 預設值 最小值 最大值
--scale-rule-tcp-concurrency 當並行 TCP 連線數目超過此值時,系統便會再新增一個複本。 當並行連線數目增加時,復本會繼續加到 max-replicas 數量。 10 1 n/a
az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --environment <ENVIRONMENT_NAME> \
  --image <CONTAINER_IMAGE_LOCATION>
  --min-replicas 0 \
  --max-replicas 5 \
  --scale-rule-name azure-tcp-rule \
  --scale-rule-type tcp \
  --scale-rule-tcp-concurrency 100

Azure 入口網站 不支援。 使用 Azure CLIAzure Resource Manager 來設定 TCP 調整規則。

自訂

您可以使用下列預設值,根據任何 ScaledObjectKEDA 調整器 來建立自訂容器應用程式調整規則:

Defaults
輪詢間隔 30
冷卻期間 300

針對 事件驅動容器應用程式作業,您可以根據任何 ScaledJob 型 KEDA 調整器來建立自定義調整規則。

下列範例示範如何建立自定義調整規則。

範例

此範例示範如何將 Azure 服務匯流排 調整器轉換成容器應用程式調整規則,但您對於任何其他 ScaledObjectKEDA 縮放程式規格使用相同的程式。

若要進行驗證,KEDA 縮放程式驗證參數會轉換成 Container Apps 秘密

下列程式示範如何將KEDA調整器轉換成容器應用程式調整規則。 此代碼段是 ARM 範本的摘錄,可說明每個區段在整體範本內容中的位置。

{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "configuration": {
        ...
        "secrets": [
          {
            "name": "<NAME>",
            "value": "<VALUE>"
          }
        ]
      },
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [
            {
              "name": "<RULE_NAME>",
              "custom": {
                "metadata": {
                  ...
                },
                "auth": [
                  {
                    "secretRef": "<NAME>",
                    "triggerParameter": "<PARAMETER>"
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

如需下列範例在 ARM 範本中如何配合的內容,請參閱此摘錄。

首先,您可以定義縮放規則的類型和元數據。

  1. 從 KEDA 縮放程式規格中,尋找 type 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  2. 在 ARM 範本中,將 scaler typecustom.type 輸入縮放規則的 屬性。

    ...
    "rules": [
      {
        "name": "azure-servicebus-queue-rule",
        "custom": {
          "type": "azure-servicebus",
          "metadata": {
            "queueName": "my-queue",
            "namespace": "service-bus-namespace",
            "messageCount": "5"
          }
        }
      }
    ]
    ...
    
  3. 從 KEDA 縮放程式規格中,尋找 metadata 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  4. 在 ARM 範本中,將所有元數據值新增至 custom.metadata 縮放規則的 區段。

    ...
    "rules": [
      {
        "name": "azure-servicebus-queue-rule",
        "custom": {
          "type": "azure-servicebus",
          "metadata": {
            "queueName": "my-queue",
            "namespace": "service-bus-namespace",
            "messageCount": "5"
          }
        }
      }
    ]
    ...
    

驗證

KEDA 縮放程式支援在 屬性所authenticationRef參考的 TriggerAuthentication 中使用秘密。 您可以將 TriggerAuthentication 對象對應至 Container Apps 縮放規則。

注意

容器應用程式調整規則僅支援秘密參考。 不支援其他驗證類型,例如 Pod 身分識別。

  1. TriggerAuthentication尋找 KEDA ScaledObject 規格所參考的物件。

  2. 從 KEDA 規格中,尋找每個secretTargetRefTriggerAuthentication物件及其相關聯的秘密。

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secrets
      namespace: my-project
    type: Opaque
    data:
      connection-string-secret: <SERVICE_BUS_CONNECTION_STRING>
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
    spec:
      secretTargetRef:
      - parameter: connection
        name: my-secrets
        key: connection-string-secret
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: azure-servicebus-queue-rule
      namespace: default
    spec:
      scaleTargetRef:
        name: my-scale-target
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: my-queue
          namespace: service-bus-namespace
          messageCount: "5"
        authenticationRef:
            name: azure-servicebus-auth
    
  3. 在 ARM 範本中,將所有專案新增至 auth 縮放規則的數位。

    1. 將秘密新增至容器應用程式的secrets陣列,其中包含秘密值。

    2. 將屬性的值triggerParameter設定為 TriggerAuthenticationkey 的屬性值。

    3. 將屬性的值 secretRef 設定為 Container Apps 秘密的名稱。

    {
      ...
      "resources": {
        ...
        "properties": {
          ...
          "configuration": {
            ...
            "secrets": [
              {
                "name": "connection-string-secret",
                "value": "<SERVICE_BUS_CONNECTION_STRING>"
              }
            ]
          },
          "template": {
            ...
            "scale": {
              "minReplicas": 0,
              "maxReplicas": 5,
              "rules": [
                {
                  "name": "azure-servicebus-queue-rule",
                  "custom": {
                    "type": "azure-servicebus",
                    "metadata": {
                      "queueName": "my-queue",
                      "namespace": "service-bus-namespace",
                      "messageCount": "5"
                    },
                    "auth": [
                      {
                        "secretRef": "connection-string-secret",
                        "triggerParameter": "connection"
                      }
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    某些縮放程式支援具有後綴的元數據, FromEnv 以參考環境變數中的值。 Container Apps 會查看 ARM 範本中針對環境變數列出的第一個容器。

    如需更多安全性相關信息, 請參閱考慮一節

  1. 從 KEDA 縮放程式規格中,尋找 type 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  2. 在 CLI 命令中,將 --scale-rule-type 參數設定為規格 type 值。

    az containerapp create \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --environment <ENVIRONMENT_NAME> \
      --image <CONTAINER_IMAGE_LOCATION>
      --min-replicas 0 \
      --max-replicas 5 \
      --secrets "connection-string-secret=<SERVICE_BUS_CONNECTION_STRING>" \
      --scale-rule-name azure-servicebus-queue-rule \
      --scale-rule-type azure-servicebus \
      --scale-rule-metadata "queueName=my-queue" \
                            "namespace=service-bus-namespace" \
                            "messageCount=5" \
      --scale-rule-auth "connection=connection-string-secret"
    
  3. 從 KEDA 縮放程式規格中,尋找 metadata 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  4. 在 CLI 命令中,將 --scale-rule-metadata 參數設定為元數據值。

    您必須將 YAML 格式的值轉換成索引鍵/值組,才能在命令行上使用。 使用空格分隔每個索引鍵/值組。

    az containerapp create \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --environment <ENVIRONMENT_NAME> \
      --image <CONTAINER_IMAGE_LOCATION>
      --min-replicas 0 \
      --max-replicas 5 \
      --secrets "connection-string-secret=<SERVICE_BUS_CONNECTION_STRING>" \
      --scale-rule-name azure-servicebus-queue-rule \
      --scale-rule-type azure-servicebus \
      --scale-rule-metadata "queueName=my-queue" \
                            "namespace=service-bus-namespace" \
                            "messageCount=5" \
      --scale-rule-auth "connection=connection-string-secret"
    

驗證

KEDA 縮放程式支援在 authenticationRef 屬性所參考的 TriggerAuthentication 中使用秘密。 您可以將 TriggerAuthentication 對象對應至 Container Apps 縮放規則。

注意

容器應用程式調整規則僅支援秘密參考。 不支援其他驗證類型,例如 Pod 身分識別。

  1. TriggerAuthentication尋找 KEDA ScaledObject 規格所參考的物件。 識別每個secretTargetRefTriggerAuthentication物件。

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secrets
      namespace: my-project
    type: Opaque
    data:
      connection-string-secret: <SERVICE_BUS_CONNECTION_STRING>
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
    spec:
      secretTargetRef:
      - parameter: connection
        name: my-secrets
        key: connection-string-secret
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: azure-servicebus-queue-rule
      namespace: default
    spec:
      scaleTargetRef:
        name: my-scale-target
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: my-queue
          namespace: service-bus-namespace
          messageCount: "5"
        authenticationRef:
            name: azure-servicebus-auth
    
  2. 在您的容器應用程式中,建立符合屬性的secretTargetRef秘密

  3. 在 CLI 命令中,設定每個 secretTargetRef 項目的參數。

    1. 使用 --secrets 參數建立秘密專案。 如果有多個秘密,請使用空格分隔它們。

    2. 使用 --scale-rule-auth 參數建立驗證專案。 如果有多個專案,請以空格分隔這些專案。

    az containerapp create \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --environment <ENVIRONMENT_NAME> \
      --image <CONTAINER_IMAGE_LOCATION>
      --min-replicas 0 \
      --max-replicas 5 \
      --secrets "connection-string-secret=<SERVICE_BUS_CONNECTION_STRING>" \
      --scale-rule-name azure-servicebus-queue-rule \
      --scale-rule-type azure-servicebus \
      --scale-rule-metadata "queueName=my-queue" \
                            "namespace=service-bus-namespace" \
                            "messageCount=5" \
      --scale-rule-auth "connection=connection-string-secret"
    
  1. 移至 Azure 入口網站 中的容器應用程式。

  2. 選取 [調整]。

  3. 選取 [編輯並部署]

  4. 選取 [ 調整和複本] 索引標籤

  5. 選取最小和最大複本範圍。

    Azure Container Apps 縮放範圍滑桿的螢幕快照。

  6. 選取 [新增]。

  7. 在 [ 規則名稱] 方塊中,輸入規則名稱。

  8. 從 [ 類型 ] 下拉式清單中,選取 [ 自定義]。

  9. 從 KEDA 縮放程式規格中,尋找 type 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  10. 在 [ 自定義規則類型 ] 方塊中,輸入 scaler type 值。

  11. 從 KEDA 縮放程式規格中,尋找 metadata 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  12. 在入口網站中,尋找 [ 元數據] 區段,然後選取 [ 新增]。 輸入KEDA ScaledObject 規格元數據區段中每個項目的名稱和值。

驗證

KEDA 縮放程式支援在 authenticationRef 屬性所參考的 TriggerAuthentication 中使用秘密。 您可以將 TriggerAuthentication 對象對應至 Container Apps 縮放規則。

注意

容器應用程式調整規則僅支援秘密參考。 不支援其他驗證類型,例如 Pod 身分識別。

  1. 在您的容器應用程式中,建立您想要參考的秘密。

  2. TriggerAuthentication尋找 KEDA ScaledObject 規格所參考的物件。 識別每個secretTargetRefTriggerAuthentication物件。

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secrets
      namespace: my-project
    type: Opaque
    data:
      connection-string-secret: <SERVICE_BUS_CONNECTION_STRING>
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
    spec:
      secretTargetRef:
      - parameter: connection
        name: my-secrets
        key: connection-string-secret
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: azure-servicebus-queue-rule
      namespace: default
    spec:
      scaleTargetRef:
        name: my-scale-target
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: my-queue
          namespace: service-bus-namespace
          messageCount: "5"
        authenticationRef:
            name: azure-servicebus-auth
    
  3. 在 [驗證] 區段中,選取 [新增] 以為每個 KEDA secretTargetRef 參數建立專案。

預設調整規則

如果您未建立調整規則,系統會對容器應用程式套用預設調整規則。

觸發程序 最小複本 最大複本
HTTP 0 10

重要

如果您未啟用輸入,請務必建立擴展規則或設定 minReplicas 為 1 或更多。 如果輸入已停用,且您未定義 minReplicas 或自定義調整規則,則您的容器應用程式會調整為零,且無法開始備份。

調整行為

調整行為具有下列預設值:

參數
輪詢間隔 30 秒
冷卻期間 300 秒
擴大穩定期間 0 秒
縮小穩定期間 300 秒
擴大步驟 1、4、當前的 100%
縮小步驟 當前的 100%
調整演算法 desiredReplicas = ceil(currentMetricValue / targetMetricValue)
  • 輪詢間隔 是 KEDA 查詢事件來源的頻率。 此值不適用於 HTTP 和 TCP 調整規則。
  • 冷卻期間 是在應用程式縮減至其最小復本計數之前觀察到最後一個事件之後多久的時間。
  • 相應增加穩定視窗 是在符合相應增加條件后,執行相應增加決策之前等待的時間長度。
  • 相應減少穩定視窗 是在符合相應減少條件之後,執行相應減少決策之前等待的時間長度。
  • 相應增加步驟 是新增實例的速率。 其會從 1、4、8、16、32 開始,一直到所設定的最大複本計數。
  • 相應減少步驟 是移除複本的速率。 依預設,系統會 100% 移除需要關閉的複本。
  • 調整演算法 是用來計算目前所需複本數目的公式。

範例

針對下列縮放規則:

"minReplicas": 0,
"maxReplicas": 20,
"rules": [
  {
    "name": "azure-servicebus-queue-rule",
    "custom": {
      "type": "azure-servicebus",
      "metadata": {
        "queueName": "my-queue",
        "namespace": "service-bus-namespace",
        "messageCount": "5"
      }
    }
  }
]

隨著您的應用程式相應放大,KEDA 會以空佇列開頭,並執行下列步驟:

  1. 每隔 30 秒檢查 my-queue 一次。
  2. 如果佇列長度等於 0,請返回 (1)。
  3. 如果佇列長度為 > 0,請將應用程式調整為 1。
  4. 如果佇列長度為 50,請計算 desiredReplicas = ceil(50/5) = 10
  5. 將應用程式調整為 min(maxReplicaCount, desiredReplicas, max(4, 2*currentReplicaCount))
  6. 回到 (1) 。

如果應用程式已調整為20個復本計數上限,則調整會經歷相同的先前步驟。 只有在滿足條件 300 秒(縮小穩定視窗)時,才會相應減少。 佇列長度為 0 之後,KEDA 會等候 300 秒(冷卻期間),再將應用程式調整為 0。

考量

  • 在「多個修訂」模式中,新增調整觸發程式會建立應用程式的新修訂,但舊修訂仍可供舊的縮放規則使用。 使用 [ 修訂管理 ] 頁面來管理流量配置。

  • 當應用程式調整為零時,不會產生任何使用量費用。 如需詳細資訊,請參閱 Azure Container Apps 中的計費。

  • 您必須為 Azure Container Apps 上的所有 .NET 應用程式啟用資料保護。 如需詳細資訊,請參閱 在 Azure Container Apps 上部署和調整 ASP.NET Core 應用程式

已知的限制

  • 不支援垂直調整。

  • 復本數量是目標數量,不保證。

  • 如果您使用 Dapr 動作專案 來管理狀態,您應該記住,不支援調整為零。 Dapr 會使用虛擬動作專案來管理異步呼叫,這表示其記憶體內部表示不會繫結至其身分識別或存留期。

下一步