請在 Azure 容器應用程式中設定縮放比例規則。
Azure 容器應用程式會透過一組宣告式調整規則來管理自動水平調整。 當容器應用程式修訂擴增時,系統會視需要為修訂建立新的執行個體。 這些執行個體稱為複本。
新增或編輯調整規則會建立容器應用程式的新修訂版本。 修訂版是容器應用程式的不可變快照。 若要了解哪些類型的變更會觸發新的修訂,請參閱修訂 變更類型。
事件驅動 Azure 容器應用程式作業會使用縮放規則來根據事件觸發執行。
調整定義
縮放是限制、規則和行為的組合。
限制定義容器應用程式調整時每個修訂的最小和最大可能複本數目。
調整限制 預設值 最小值 最大值 每個修訂的最小複本數目 0 0 可設定的複本上限為 1,000。 每個修訂的最大複本數目 10 1 可設定的複本上限為 1,000。 規則是 Azure 容器應用程式用來決定何時新增或移除複本的準則。
縮放規則 實作為 HTTP、TCP (傳輸控制通訊協定) 或自訂。
行為是規則和限制的組合,可決定一段時間的縮放決策。
縮放行為說明如何計算縮放決策。
當您定義縮放規則時,請務必考慮下列項目:
- 如果容器應用程式調整為零,則不會向您收取使用量費用。
- 未處理但保留在記憶體中的複本可能會以較低的「閒置」費率計費。 如需詳細資訊,請參閱帳單。
- 如果您想要確保修訂的執行個體會永遠執行,請將複本的最小數目設定為 1 或更高的值。
調整規則
調整會由三種不同的觸發程序類別驅動:
- HTTP:根據您修訂的並行 HTTP 要求數量。
- TCP:根據連線到您修訂的並行 TCP 連線數量。
- 自訂:根據 CPU、記憶體或支援的事件驅動資料來源,例如:
- Azure 服務匯流排
- Azure 事件中樞
- Apache Kafka
- Redis
如果您定義多個調整規則,容器應用程式會在符合任何規則的第一個條件後立刻開始調整。
HTTP
使用 HTTP 調整規則時,您可以控制並行 HTTP 要求的閾值,此閾值會決定容器應用程式修訂的調整方式。 每 15 秒,系統會將過去 15 秒的要求數目除以 15,得出的結果就是並行要求的數量。 Azure 容器應用程式作業不支援 HTTP 縮放規則。
在下列範例中,修訂會擴增至五個複本,而且可以縮減為零。 調整屬性會設定為每秒 100 個並行要求。
範例
http
區段會定義 HTTP 縮放規則。
縮放屬性 | 描述 | 預設值 | 最小值 | 最大值 |
---|---|---|---|---|
concurrentRequests |
當 HTTP 要求的數目超過此值時,便會新增另一個複本。 複本會繼續新增至集區,數量最多可達 maxReplicas 。 |
10 | 1 | n/a |
{
...
"resources": {
...
"properties": {
...
"template": {
...
"scale": {
"minReplicas": 0,
"maxReplicas": 5,
"rules": [{
"name": "http-rule",
"http": {
"metadata": {
"concurrentRequests": "100"
}
}
}]
}
}
}
}
}
注意
使用非 HTTP 事件縮放規則時,請將容器應用程式的 properties.configuration.activeRevisionsMode
屬性設定為 single
。
在 create
或 update
命令中使用 --scale-rule-http-concurrency
參數來定義 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
在 Azure 入口網站中,移至您的容器應用程式
選取 [級別]。
選取 [編輯並部署]。
選取 [調整] 索引標籤。
選取最小和最大複本範圍。
選取 [新增]。
在 [規則名稱] 方塊中,輸入規則的名稱。
從 [類型] 下拉式清單中,選取 [HTTP 縮放]。
在 [並行要求] 方塊中,輸入容器應用程式所需的並行要求數量。
TCP
使用 TCP 調整規則時,您可以控制用以決定應用程式調整方式的並行 TCP 連線閾值。 每 15 秒,系統會將過去 15 秒的連線數除以 15,得出的結果就是並行連線的數量。 Azure 容器應用程式作業不支援 TCP 縮放規則。
在下列範例中,容器應用程式修訂會擴增至五個複本,而且可以縮減為零。 調整閾值會設定為每秒 100 個並行連線。
範例
tcp
區段會定義 TCP 縮放規則。
縮放屬性 | 描述 | 預設值 | 最小值 | 最大值 |
---|---|---|---|---|
concurrentConnections |
當並行 TCP 連線數目超過此值時,系統便會再新增一個複本。 隨著同時連線數目增加,複本數量會繼續新增至最多 maxReplicas 個。 |
10 | 1 | n/a |
{
...
"resources": {
...
"properties": {
...
"template": {
...
"scale": {
"minReplicas": 0,
"maxReplicas": 5,
"rules": [{
"name": "tcp-rule",
"tcp": {
"metadata": {
"concurrentConnections": "100"
}
}
}]
}
}
}
}
}
在 create
或 update
命令中使用 --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 \
--transport tcp \
--ingress <external/internal> \
--target-port <CONTAINER_TARGET_PORT> \
--scale-rule-name azure-tcp-rule \
--scale-rule-type tcp \
--scale-rule-tcp-concurrency 100
Azure 入口網站中不支援。 使用 Azure CLI 或 Azure Resource Manager 來設定 TCP 縮放規則。
自訂
您可以使用下列預設值,根據任何 ScaledObject 型 KEDA 縮放工具來建立自訂 Azure 容器應用程式縮放規則:
Defaults | 秒 |
---|---|
輪詢間隔 | 30 |
冷卻期間 | 300 |
針對 事件驅動 Azure 容器應用程式作業,您可以根據任何 ScaledJob 型 KEDA 縮放工具來建立自訂縮放規則。
以下範例將示範建立自訂縮放規則的方式。
範例
此範例示範如何將 Azure 服務匯流排調整工具轉換成 Azure 容器應用程式縮放規則,但您也可以針對 ScaledObject 型 KEDA 縮放工具規格使用相同的流程。
若要進行驗證,KEDA 調整程式驗證參數會採用容器應用程式祕密或受控識別。
以下程序示範如何將 KEDA 縮放工具轉換成 Azure 容器應用程式縮放規則。 此程式碼片段是 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 範本中如何配合的相關內容,請參閱此摘錄。
首先,您要定義縮放規則的類型和中繼資料。
從 KEDA 縮放工具規格中尋找
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 ARM 範本中,將縮放工具
type
值輸入縮放規則的custom.type
屬性。... "rules": [ { "name": "azure-servicebus-queue-rule", "custom": { "type": "azure-servicebus", "metadata": { "queueName": "my-queue", "namespace": "service-bus-namespace", "messageCount": "5" } } } ] ...
從 KEDA 縮放工具規格中尋找
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 ARM 範本中,將所有中繼資料值新增至縮放規則的
custom.metadata
區段。... "rules": [ { "name": "azure-servicebus-queue-rule", "custom": { "type": "azure-servicebus", "metadata": { "queueName": "my-queue", "namespace": "service-bus-namespace", "messageCount": "5" } } } ] ...
驗證
容器應用程式調整規則支援祕密型驗證。 Azure 資源的調整規則,包括 Azure 佇列儲存體、Azure 服務匯流排和 Azure 事件中樞,也支援受控識別。 可能的話,請使用受控識別驗證來避免將祕密儲存在應用程式內。
使用祕密
若要使用祕密進行驗證,您必須在容器應用程式的 secrets
陣列中建立祕密。 祕密值用於調整規則的 auth
陣列中。
KEDA 調整程式可以在 authenticationRef
屬性所參考的 TriggerAuthentication 中使用祕密。 您可以將 TriggerAuthentication 物件對應至 Azure 容器應用程式縮放規則。
尋找 KEDA
ScaledObject
規格所參考的TriggerAuthentication
物件。在
TriggerAuthentication
物件中,尋找每個secretTargetRef
及其相關聯的祕密。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
在 ARM 範本中,針對每個祕密:
將祕密新增至容器應用程式中包含祕密名稱和值的
secrets
陣列。將項目新增至調整規則的
auth
陣列。將
triggerParameter
屬性值設定為secretTargetRef
之parameter
屬性的值。將
secretRef
屬性的值設定為secretTargetRef
的key
屬性名稱。
{ ... "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
尾碼的中繼資料,以參考環境變數中的值。 Azure 容器應用程式會查看 ARM 範本中針對環境變數列出的第一個容器。如需更多安全性相關資訊,請參閱考量一節。
使用受控識別
容器應用程式調整規則可以使用受控識別向 Azure 服務進行驗證。 下列 ARM 範本會傳入以系統為基礎的受控識別,以驗證 Azure 佇列調整程式。
"scale": {
"minReplicas": 0,
"maxReplicas": 4,
"rules": [
{
"name": "azure-queue",
"custom": {
"type": "azure-queue",
"metadata": {
"accountName": "apptest123",
"queueName": "queue1",
"queueLength": "1"
},
"identity": "system"
}
}
]
}
若要深入了解如何搭配調整規則使用受控識別,請參閱受控識別。
從 KEDA 縮放工具規格中尋找
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 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"
從 KEDA 縮放工具規格中尋找
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 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"
驗證
容器應用程式調整規則支援祕密型驗證。 Azure 資源的調整規則,包括 Azure 佇列儲存體、Azure 服務匯流排和 Azure 事件中樞,也支援受控識別。 可能的話,請使用受控識別驗證來避免將祕密儲存在應用程式內。
使用祕密
若要設定容器應用程式調整規則的祕密型驗證,您可以在容器應用程式中設定祕密,並在調整規則中參考祕密。
KEDA 調整程式支援 TriggerAuthentication 中 authenticationRef
屬性用於參考的祕密。 您可以將 TriggerAuthentication
物件對應至容器應用程式調整規則。
尋找 KEDA
ScaledObject
規格所參考的TriggerAuthentication
物件。 識別TriggerAuthentication
物件的每個secretTargetRef
。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
在您的容器應用程式中,建立符合
secretTargetRef
屬性的秘密。在 CLI 命令中,為每個
secretTargetRef
項目設定參數。使用
--secrets
參數建立秘密項目。 如果有多個秘密,請使用空格分隔。使用
--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"
使用受控識別
容器應用程式調整規則可以使用受控識別向 Azure 服務進行驗證。 下列命令會建立具有使用者指派的受控識別的容器應用程式,並將其用來驗證 Azure 佇列調整程式。
az containerapp create \
--resource-group <RESOURCE_GROUP> \
--name <APP_NAME> \
--environment <ENVIRONMENT_ID> \
--user-assigned <USER_ASSIGNED_IDENTITY_ID> \
--scale-rule-name azure-queue \
--scale-rule-type azure-queue \
--scale-rule-metadata "accountName=<AZURE_STORAGE_ACCOUNT_NAME>" "queueName=queue1" "queueLength=1" \
--scale-rule-identity <USER_ASSIGNED_IDENTITY_ID>
將預留位置取代為您的值。
在 Azure 入口網站中,移至您的容器應用程式。
選取 [級別]。
選取 [編輯並部署]。
選取 [縮放和複本] 索引標籤。
選取最小和最大複本範圍。
選取 [新增]。
在 [規則名稱] 方塊中,輸入規則的名稱。
在 [類型] 下拉式清單中,選取 [自訂]。
從 KEDA 縮放工具規格中尋找
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 [自訂規則類型] 方塊中,輸入縮放工具
type
值。從 KEDA 縮放工具規格中尋找
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在入口網站中,尋找 [中繼資料] 區段,然後選取 [新增]。 在 KEDA
ScaledObject
規格中繼資料區段中,輸入每個項目的名稱和值。
驗證
容器應用程式調整規則支援祕密型驗證。 Azure 資源的調整規則,包括 Azure 佇列儲存體、Azure 服務匯流排和 Azure 事件中樞,也支援受控識別。 可能的話,請使用受控識別驗證來避免將祕密儲存在應用程式內。
使用祕密
在您的容器應用程式中,建立您要參考的秘密。
尋找 KEDA
ScaledObject
規格所參考的TriggerAuthentication
物件。 識別TriggerAuthentication
物件的每個secretTargetRef
。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
在 [驗證] 區段中,選取 [新增],為每個 KEDA
secretTargetRef
參數建立項目。
使用受控識別
Azure 入口網站不支援受控識別驗證。 使用 Azure CLI 或 Azure Resource Manager 以使用受控識別進行驗證。
預設調整規則
如果您未建立調整規則,系統會對容器應用程式套用預設調整規則。
觸發程序 | 最小複本 | 最大複本 |
---|---|---|
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 會以空佇列開頭,並執行下列步驟:
- 每隔 30 秒檢查一次
my-queue
。 - 如果佇列長度等於 0,請返回 (1)。
- 如果佇列長度為 > 0,請將應用程式縮放為 1。
- 如果佇列長度為 50,請計算
desiredReplicas = ceil(50/5) = 10
。 - 將應用程式縮放至
min(maxReplicaCount, desiredReplicas, max(4, 2*currentReplicaCount))
- 返回 (1)。
如果應用程式已縮放為 20 個複本計數上限,則縮放也會經歷相同的先前步驟。 只有在滿足條件 300 秒 (縮小穩定視窗) 時,才會開始縮小。 佇列長度為 0 之後,KEDA 會等候 300 秒 (冷卻期間),再將應用程式縮放為 0。
考量
在「多個修訂」模式中,新增縮放觸發會為您的應用程式建立新修訂,但是您的舊修訂仍可以使用舊的縮放規則。 使用 [修訂管理] 頁面來管理流量配置。
當應用程式縮放為零時,不會產生任何使用費用。 如需詳細資訊,請參閱 Azure 容器應用程式中的計費。
您必須為 Azure 容器應用程式上的所有 .NET 應用程式啟用資料保護作業。 如需詳細資訊,請參閱在 Azure 容器應用程式上部署和縮放 ASP.NET Core 應用程式。
已知的限制
不支援垂直縮放比例。
複本數量是目標數量,不是保證。
如果您正在使用 Dapr 執行者管理狀態,請記住,該功能不支援縮放為零。 Dapr 使用虛擬執行者來管理非同步呼叫,這表示其記憶體內部的表示法未繫結至其身分識別或存留期。