Establecer reglas de escalado en Azure Container Apps
Azure Container Apps administra el escalado horizontal automático a través de un conjunto de reglas de escalado declarativas. A medida que se escala horizontalmente una revisión de la Container App, se crean nuevas instancias de la revisión bajo demanda. Estas instancias se conocen como réplicas.
Al agregar o editar reglas de escalado, se crea una nueva revisión de la aplicación contenedora. Una revisión es una instantánea inmutable de la aplicación contenedora. Para obtener información sobre qué tipos de cambios desencadenan una nueva revisión, consulte revisión tipos de cambio.
Los trabajos de Container Apps controlados por eventos usan reglas de escalado para desencadenar ejecuciones basadas en eventos.
Definición de escala
El escalado es la combinación de límites, reglas y comportamiento.
Límites definir el número mínimo y máximo posible de réplicas por revisión a medida que se escala la aplicación contenedora.
Límite de escala Valor predeterminado Valor mínimo Valor máximo Número mínimo de réplicas por revisión 0 0 Las réplicas máximas configurables son 300 en Azure Portal y 1000 en la CLI de Azure. Número máximo de réplicas por revisión 10 1 Las réplicas máximas configurables son 300 en Azure Portal y 1000 en la CLI de Azure. Las reglas son los criterios utilizados por Container Apps para decidir cuándo agregar o quitar réplicas.
Las reglas de escalado se implementan como HTTP, TCP (protocolo de control de transmisión) o personalizadas.
El comportamiento es la combinación de reglas y límites para determinar las decisiones de escala a lo largo del tiempo.
Comportamiento de escalado explica cómo se toman decisiones de escala.
A medida que defina las reglas de escalado, es importante tener en cuenta los siguientes elementos:
- No se le facturan cargos de uso si la aplicación contenedora se escala a cero.
- Las réplicas que no se procesan, pero que permanecen en memoria se pueden facturar con una tasa de "inactividad" inferior. Para obtener más información, vea Facturación.
- Si desea asegurarse de que siempre se está ejecutando una instancia de la revisión, establezca el número mínimo de réplicas en 1 o superior.
Reglas de escalado
El escalado está controlado por tres categorías diferentes de desencadenadores:
- HTTP: se basa en el número de solicitudes HTTP simultáneas a la revisión.
- TCP: se basa en el número de conexiones TCP simultáneas a la revisión.
- Personalizado: se basa en orígenes de datos de CPU, memoria o basados en eventos admitidos, como:
- Azure Service Bus
- Azure Event Hubs
- Apache Kafka
- Redis
Si define más de una regla de escalado, la aplicación contenedora comienza a escalar una vez que se cumple la primera condición de las reglas.
HTTP
Con una regla de escalado HTTP, tiene control sobre el umbral de solicitudes HTTP simultáneas que determina cómo se escala la revisión de la aplicación de contenedor. Cada 15 segundos, el número de solicitudes simultáneas se calcula como el número de solicitudes de los últimos 15 segundos dividido por 15. Los trabajos de Container Apps no admiten reglas de escalado HTTP.
En el ejemplo siguiente, la revisión escala horizontalmente hasta cinco réplicas y puede reducir horizontalmente a cero. La propiedad de escalado se establece en 100 solicitudes simultáneas por segundo.
Ejemplo
La sección http
define una regla de escalado HTTP.
Propiedad de escala | Descripción | Valor predeterminado | Valor mínimo | Valor máximo |
---|---|---|---|---|
concurrentRequests |
Cuando el número de solicitudes HTTP supera este valor, se agrega otra réplica. Las réplicas se siguen agregando al grupo hasta la cantidad de maxReplicas . |
10 | 1 | N/D |
{
...
"resources": {
...
"properties": {
...
"template": {
...
"scale": {
"minReplicas": 0,
"maxReplicas": 5,
"rules": [{
"name": "http-rule",
"http": {
"metadata": {
"concurrentRequests": "100"
}
}
}]
}
}
}
}
}
Nota:
Establezca la propiedad properties.configuration.activeRevisionsMode
de la aplicación contenedora en single
, cuando se usen reglas de escalado de eventos que no sean HTTP.
Defina una regla de escalado HTTP mediante el parámetro --scale-rule-http-concurrency
en los comandos create
o update
.
Parámetro de la CLI | Descripción | Valor predeterminado | Valor mínimo | Valor máximo |
---|---|---|---|---|
--scale-rule-http-concurrency |
Cuando el número de solicitudes HTTP simultáneas supera este valor, se agrega otra réplica. Las réplicas se siguen agregando al grupo hasta la cantidad de max-replicas . |
10 | 1 | N/D |
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
Vaya a la aplicación contenedora en Azure Portal.
Seleccionar escala.
Seleccione Editar e implementar.
Seleccione la pestaña Escala.
Seleccione el intervalo de réplica mínimo y máximo.
Seleccione Agregar.
En el cuadro Nombre de regla, escriba un nombre para la regla.
En la lista desplegable Tipo, seleccione Escalado HTTP.
En el cuadro Solicitudes simultáneas, escriba el número deseado de solicitudes simultáneas de la aplicación contenedora.
TCP
Con una regla de escalado TCP, tiene control sobre el umbral de conexiones TCP simultáneas que determina cómo se escala la aplicación. Cada 15 segundos, el número de solicitudes simultáneas se calcula como el número de conexiones de los últimos 15 segundos dividido por 15. Los trabajos de Container Apps no admiten reglas de escalado TCP.
En el ejemplo siguiente, la revisión de la aplicación contenedora se escala horizontalmente hasta cinco réplicas y se puede reducir horizontalmente a cero. El umbral de escalado se establece en 100 conexiones simultáneas por segundo.
Ejemplo
La sección tcp
define una regla de escalado TCP.
Propiedad de escala | Descripción | Valor predeterminado | Valor mínimo | Valor máximo |
---|---|---|---|---|
concurrentConnections |
Cuando el número de conexiones TCP simultáneas supera este valor, se agrega otra réplica. Las réplicas se siguen agregando la cantidad maxReplicas a medida que aumenta el número de conexiones simultáneas. |
10 | 1 | N/D |
{
...
"resources": {
...
"properties": {
...
"template": {
...
"scale": {
"minReplicas": 0,
"maxReplicas": 5,
"rules": [{
"name": "tcp-rule",
"tcp": {
"metadata": {
"concurrentConnections": "100"
}
}
}]
}
}
}
}
}
Defina una regla de escalado TCP mediante el parámetro --scale-rule-tcp-concurrency
en los comandos create
o update
.
Parámetro de la CLI | Descripción | Valor predeterminado | Valor mínimo | Valor máximo |
---|---|---|---|---|
--scale-rule-tcp-concurrency |
Cuando el número de conexiones TCP simultáneas supera este valor, se agrega otra réplica. Las réplicas se siguen agregando la cantidad de max-replicas a medida que aumenta el número de conexiones simultáneas. |
10 | 1 | N/D |
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
No se admite en Azure Portal. Use la CLI de Azure o Azure Resource Manager para configurar una regla de escalado TCP.
Personalizado
Puede crear una regla de escalado de Container Apps personalizada basada en cualquier escalador KEDA basado en ScaledObject con estos valores predeterminados:
Defaults | Segundos |
---|---|
Intervalo de sondeo | 30 |
Período de esporádico | 300 |
En trabajos de Container Apps controlados por eventos, puede crear una regla de escalado personalizada basada en cualquier escalador KEDA basado en ScaledJob.
En el siguiente ejemplo se muestra cómo crear una regla de escalado personalizada.
Ejemplo
En este ejemplo se muestra cómo convertir un escalador de Azure Service Bus en una regla de escalado de Container Apps y, además, usará el mismo proceso para cualquier otra especificación del escalador KEDA basado en ScaledObject.
Para la autenticación, los parámetros de autenticación del escalador KEDA se convierten en secretos de Container Apps.
En el procedimiento siguiente se muestra cómo convertir un escalador KEDA en una regla de escalado de aplicaciones de Container. Este fragmento de código es un extracto de una plantilla de ARM para mostrar dónde encaja cada sección en el contexto de la plantilla general.
{
...
"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>"
}
]
}
}
]
}
}
}
}
}
Consulte este extracto para obtener contexto sobre cómo encajan los ejemplos siguientes en la plantilla de ARM.
En primer lugar, debe definir el tipo y los metadatos de la regla de escalado.
En la especificación del escalador KEDA, busque el valor
type
.triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
En la plantilla de ARM, escriba el valor
type
del escalador en la propiedadcustom.type
de la regla de escalado.... "rules": [ { "name": "azure-servicebus-queue-rule", "custom": { "type": "azure-servicebus", "metadata": { "queueName": "my-queue", "namespace": "service-bus-namespace", "messageCount": "5" } } } ] ...
En la especificación del escalador KEDA, busque los valores
metadata
.triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
En la plantilla de ARM, agregue todos los valores de metadatos a la sección
custom.metadata
de la regla de escalado.... "rules": [ { "name": "azure-servicebus-queue-rule", "custom": { "type": "azure-servicebus", "metadata": { "queueName": "my-queue", "namespace": "service-bus-namespace", "messageCount": "5" } } } ] ...
Autenticación
Un escalador KEDA admite el uso de secretos en un TriggerAuthentication al que hace referencia la propiedad authenticationRef
. Puede asignar el objeto TriggerAuthentication a la regla de escalado de Container Apps.
Nota:
Las reglas de escalado de Container Apps solo admiten referencias de secretos. No se admiten otros tipos de autenticación, como la identidad del pod.
Busque el objeto
TriggerAuthentication
al que hace referencia la especificaciónScaledObject
de KEDA.En la especificación de KEDA, busque cada
secretTargetRef
del objetoTriggerAuthentication
y su secreto asociado.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
En la plantilla de ARM, agregue todas las entradas a la matriz
auth
de la regla de escalado.Agregue un secreto a la matriz
secrets
de la aplicación contenedora que contiene el valor secreto.Establezca el valor de la propiedad
triggerParameter
en el valor de la propiedadkey
deTriggerAuthentication
.Establezca el valor de la propiedad
secretRef
en el nombre del secreto de 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" } ] } } ] } } } } }
Algunos escaladores admiten metadatos con el sufijo
FromEnv
para hacer referencia a un valor de una variable de entorno. Container Apps examina el primer contenedor que se muestra en la plantilla de ARM de la variable de entorno.Consulte la sección consideraciones para obtener más información relacionada con la seguridad.
En la especificación del escalador KEDA, busque el valor
type
.triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
En el comando de la CLI, establezca el parámetro
--scale-rule-type
en el valortype
de la especificación.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"
En la especificación del escalador KEDA, busque los valores
metadata
.triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
En el comando de la CLI, establezca el parámetro
--scale-rule-metadata
en los valores de metadatos.Debe transformar los valores de un formato YAML a un par clave-valor para su uso en la línea de comandos. Separe cada par clave-valor con un espacio.
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"
Autenticación
Un escalador KEDA admite el uso de secretos en un TriggerAuthentication al que hace referencia la propiedad authenticationRef. Puede asignar el objeto TriggerAuthentication a la regla de escalado de Container Apps.
Nota:
Las reglas de escalado de Container Apps solo admiten referencias de secretos. No se admiten otros tipos de autenticación, como la identidad del pod.
Busque el objeto
TriggerAuthentication
al que hace referencia la especificaciónScaledObject
de KEDA. Identifique cadasecretTargetRef
del objetoTriggerAuthentication
.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
En la aplicación contenedora, cree los secretos que coincidan con las propiedades de
secretTargetRef
.En el comando de la CLI, establezca parámetros para cada entrada
secretTargetRef
.Cree una entrada de secreto con el parámetro
--secrets
. Si hay varios secretos, sepárelos con un espacio.Cree una entrada de autenticación con el parámetro
--scale-rule-auth
. Si hay varias entradas, sepárelas con un espacio.
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"
Vaya a la aplicación contenedora en Azure Portal.
Seleccionar escala.
Seleccione Editar e implementar.
Seleccione la pestaña Escalado y réplicas.
Seleccione el intervalo de réplica mínimo y máximo.
Seleccione Agregar.
En el cuadro Nombre de regla, escriba un nombre para la regla.
En la lista desplegable Tipo, seleccione Personalizado.
En la especificación del escalador KEDA, busque el valor
type
.triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
En el cuadro Tipo de regla personalizada, escriba el valor
type
del escalador.En la especificación del escalador KEDA, busque los valores
metadata
.triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
En el portal, busque la sección Metadatos y seleccione Agregar. Escriba el nombre y el valor de cada elemento de la sección de metadatos de la especificación
ScaledObject
de KEDA.
Autenticación
Un escalador KEDA admite el uso de secretos en un TriggerAuthentication al que hace referencia la propiedad authenticationRef. Puede asignar el objeto TriggerAuthentication a la regla de escalado de Container Apps.
Nota:
Las reglas de escalado de Container Apps solo admiten referencias de secretos. No se admiten otros tipos de autenticación, como la identidad del pod.
En la aplicación contenedora, cree los secretos a los que desea hacer referencia.
Busque el objeto
TriggerAuthentication
al que hace referencia la especificaciónScaledObject
de KEDA. Identifique cadasecretTargetRef
del objetoTriggerAuthentication
.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
En la sección Autenticación, seleccione Agregar para crear una entrada para cada parámetro
secretTargetRef
de KEDA.
Regla de escalado predeterminada
Si no crea una regla de escalado, la regla de escalado predeterminada se aplica a la aplicación contenedora.
Desencadenador | Min replicas (Número mínimo de réplicas) | Max replicas (Número máximo de réplicas) |
---|---|---|
HTTP | 0 | 10 |
Importante
Asegúrese de crear una regla de escalado o establecer minReplicas
en 1 o más si no habilita la entrada. Si la entrada está deshabilitada y no define una minReplicas
o una regla de escalado personalizada, la aplicación contenedora se escalará a cero y no tendrá forma de iniciar la copia de seguridad.
Comportamiento de escalado
El comportamiento de escalado tiene los valores predeterminados siguientes:
Parámetro | Value |
---|---|
Intervalo de sondeo | 30 segundos |
Período de esporádico | 300 segundos |
Ventana de estabilización de escalado vertical | 0 segundos |
Ventana de estabilización de reducción vertical | 300 segundos |
Paso de escalado vertical | 1, 4, 100 % de corriente |
Paso de reducción vertical | 100 % del actual |
Algoritmo de escalado | desiredReplicas = ceil(currentMetricValue / targetMetricValue) |
- El intervalo de sondeo es la frecuencia con la que KEDA consulta los orígenes del evento. Este valor no se aplica a las reglas de escalado HTTP y TCP.
- El periodo de recuperación es el tiempo transcurrido desde que se observó el último evento antes de que la aplicación se redujera verticalmente a su número mínimo de réplicas.
- La ventana de estabilización del escalado vertical es cuánto tiempo debe esperar antes de realizar una decisión de escalado vertical una vez que se cumplan las condiciones de este tipo de escalado.
- La ventana de estabilización de la reducción vertical es cuánto tiempo debe esperar antes de realizar una decisión de reducción vertical una vez que se cumplan las condiciones de este tipo de reducción.
- El escalado vertical es la velocidad a la que se agregan nuevas instancias. Comienza con 1, 4, 8, 16, 32… hasta el número máximo de réplicas configurado.
- La reducción vertical es la velocidad a la que se quitan las réplicas. De forma predeterminada, se quitan el 100 % de las réplicas que necesitan apagarse.
- El algoritmo de escalado es la fórmula que se usa para calcular el número deseado actual de réplicas.
Ejemplo
Para la siguiente regla de escalado:
"minReplicas": 0,
"maxReplicas": 20,
"rules": [
{
"name": "azure-servicebus-queue-rule",
"custom": {
"type": "azure-servicebus",
"metadata": {
"queueName": "my-queue",
"namespace": "service-bus-namespace",
"messageCount": "5"
}
}
}
]
A medida que la aplicación se escala horizontalmente, KEDA comienza con una cola vacía y realiza los pasos siguientes:
- Compruebe
my-queue
cada 30 segundos. - Si la longitud de la cola es igual a 0, vuelva a (1).
- Si la longitud de la cola es > 0, escale la aplicación a 1.
- Si la longitud de la cola es 50, calcule
desiredReplicas = ceil(50/5) = 10
. - Escale la aplicación a
min(maxReplicaCount, desiredReplicas, max(4, 2*currentReplicaCount))
- Vuelva a (1).
Si la aplicación se ha escalado al recuento máximo de réplicas de 20, el escalado pasa por los mismos pasos anteriores. La reducción vertical solo se produce si la condición se cumplió durante 300 segundos (ventana de estabilización de reducción vertical). Una vez que la longitud de la cola es 0, KEDA espera 300 segundos (período de recuperación) antes de escalar la aplicación a 0.
Consideraciones
En el modo de revisiones múltiples, al agregar un nuevo desencadenador de escalado, se crea una nueva revisión de la aplicación, pero la revisión anterior sigue estando disponible con las reglas de escalado antiguas. Use la página Administración de revisiones para administrar sus asignaciones de tráfico.
Cuando una aplicación se escala a cero no se generan gastos de uso. Para más información sobre precios, consulte Facturación en Azure Container Apps.
Es necesario habilitar la protección de datos para todas las aplicaciones .NET en Azure Container Apps. Para obtener más información, consulte Implementación y escalado de aplicaciones ASP.NET Core en Azure Container Apps.
Limitaciones conocidas
No se admite el escalado vertical.
Las cantidades de réplica son una cantidad de destino, no una garantía.
Si usa actores de Dapr para administrar estados, debe tener en cuenta que no se admite el escalado a cero. Dapr usa actores virtuales para administrar llamadas asincrónicas, lo que significa que su representación en memoria no está vinculada a su identidad o duración.