Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Enable rapid multi-zone auto scaling

Última actualización: Sep 14, 2026

Distribuir las cargas de trabajo de manera uniforme en varias zonas es una estrategia fundamental para construir una arquitectura de alta disponibilidad. A medida que aumenta la carga de trabajo, una directiva de programación equilibrada y multizona escala horizontalmente las instancias de forma automática en todas las zonas para satisfacer las demandas de capacidad del clúster.

Requisitos previos

Cree como mínimo un vSwitch en cada zona donde desee escalar horizontalmente las instancias. Para obtener más información, consulte Create and manage vSwitches. Una vez creado, seleccione el vSwitch correspondiente cuando create and manage node pools.

Contexto

El escalador automático del clúster determina si un servicio se puede desplegar en un grupo de escalado y envía una solicitud de escalado horizontal a un grupo de escalado de ESS específico para crear nuevas instancias. Sin embargo, surge un problema cuando se configuran vSwitches de varias zonas dentro de un solo grupo de escalado de ESS. Si los pods de la carga de trabajo no se pueden programar por falta de recursos en el clúster, ACK activa el grupo de escalado de ESS para que escale horizontalmente. No obstante, al no existir un mecanismo que asocie la solicitud de escalado con una zona específica, el grupo de escalado de ESS no sabe qué zona necesita más capacidad. Esto provoca que las nuevas instancias se concentren en una sola zona en lugar de distribuirse en varias, lo cual impide cumplir con la demanda de escalado simultáneo en múltiples zonas.

image

Para resolver este escenario, ACK proporciona el componente ack-autoscaling-placeholder. Este componente utiliza una pequeña cantidad de recursos reservados y transforma el escalado automático genérico en varias zonas en un escalado simultáneo y dirigido de node pools específicos. Para obtener más información, consulte Achieve Container Scaling in Seconds Using ack-autoscaling-placeholder. El proceso funciona de la siguiente manera:

  1. Cree un node pool independiente para cada zona y aplique una etiqueta de zona única a cada uno.

  2. Utilice el componente ack-autoscaling-placeholder para crear pods de marcador de posición en cada zona mediante un nodeSelector que apunte a las etiquetas específicas de la zona. De forma predeterminada, estos pods tienen un PriorityClass de baja prioridad, por lo que su nivel es inferior al de los pods de sus aplicaciones.

  3. Cuando un pod de carga de trabajo de alta prioridad queda pendiente, reemplaza a un pod de marcador de posición en una de las zonas. El pod reemplazado, que cuenta con un nodeSelector específico de zona, pasa entonces al estado pendiente. Esta situación indica al escalador automático del clúster que debe escalar horizontalmente un nuevo nodo exclusivamente en esa zona, lo que convierte una necesidad general de escalado en una solicitud dirigida.

A continuación se muestra un ejemplo con dos zonas que ilustra cómo lograr un escalado simultáneo en varias zonas.

image
  1. El componente ack-autoscaling-placeholder actúa como puente entre sus aplicaciones y el escalador automático del clúster al crear un pod de marcador de posición en cada zona. La prioridad de programación de estos pods es menor que la de los pods de sus aplicaciones.

  2. Cuando un pod de aplicación queda pendiente, reemplaza de inmediato a un pod de marcador de posición y se ejecuta en un nodo existente de una de las zonas. El pod de marcador de posición reemplazado entra entonces en el estado Pending.

  3. Como cada pod de marcador de posición se configura con un nodeSelector específico de zona, el escalador automático del clúster sabe exactamente qué zona escalar. Esto permite ejecutar un escalado simultáneo en las zonas correctas.

Paso 1: Crear node pools y agregar etiquetas

  1. Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.

  2. En la página Clusters, haga clic en el nombre del clúster de destino. En el panel de navegación izquierdo, elija Nodes > Node Pools.

  3. Haga clic en Create Node Pool y configure los parámetros según las indicaciones.

    Este ejemplo crea un node pool llamado auto-zone-I con el escalado automático habilitado en la zona I. En la tabla siguiente se describen los parámetros clave. Para obtener más información, consulte Create and manage node pools.

    Parámetro

    Descripción

    Node Pool Name

    auto-zone-I

    Scaling Mode

    Seleccione Auto para habilitar el escalado automático.

    vSwitch

    Seleccione el vSwitch de la zona I.

    Node Labels

    Establezca la Key como available_zone y el Value como i.

    En la lista de node pools, el node pool se crea correctamente cuando su estado cambia a Active.

  4. Repita estos pasos para cada zona donde desee habilitar el escalado automático.

    Una vez creados, verá los node pools de cada zona (por ejemplo, auto-zone-I, auto-zone-K y auto-zone-H) en la lista de node pools. Puede seleccionar distintos tipos de instancia según sea necesario (como ecs.hfc7.xlarge, ecs.c7.xlarge o ecs.s6-c1m2.xlarge). El método de facturación es pay-as-you-go y el estado de cada node pool es Active con el escalado automático habilitado.

Paso 2: Desplegar el componente de marcadores de posición y los Deployments

  1. En el panel de navegación izquierdo, elija Marketplace > Application market.

  2. Busque ack-autoscaling-placeholder, haga clic en la tarjeta del componente y luego haga clic en Deploy.

  3. Seleccione un Cluster y un Namespace, haga clic en Next, elija una Chart Version, edite el Parameter y luego haga clic en OK.

    Una vez creada la aplicación, vaya a la página Applications > Helm. El estado de la aplicación será Deployed.

  4. En el panel de navegación izquierdo de la página de gestión del clúster, elija Application > Helm.

  5. En la página Helm, busque ack-autoscaling-placeholder-default y haga clic en Update en la columna Actions.

  6. En el panel Update Release, actualice la configuración YAML como se muestra en el ejemplo siguiente y haga clic en OK. Debe definir un Deployment de marcador de posición para cada zona.

    Este ejemplo muestra cómo crear Deployments de marcador de posición en las zonas I, K y H.

    deployments:
    - affinity: {}
      annotations: {}
      containers:
      - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1
        imagePullPolicy: IfNotPresent
        name: placeholder
        resources:
          requests:
            cpu: 3500m     # CPU request for the placeholder pod.
            memory: 6      # Memory request for the placeholder pod.
      imagePullSecrets: {}
      labels: {}
      name: ack-place-holder-I             # The name of the placeholder Deployment.
      nodeSelector: {"available_zone":"i"}   # The zone label. It must match the label configured for the node pool in Step 1.
      replicaCount: 10                     # The number of pods to create in each scale-out event.
      tolerations: []
    - affinity: {}
      annotations: {}
      containers:
      - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1
        imagePullPolicy: IfNotPresent
        name: placeholder
        resources:
          requests:
            cpu: 3500m    # CPU request for the placeholder pod.
            memory: 6     # Memory request for the placeholder pod.
      imagePullSecrets: {}
      labels: {}
      name: ack-place-holder-K            # The name of the placeholder Deployment.
      nodeSelector: {"available_zone":"k"}  # The zone label. It must match the label configured for the node pool in Step 1.
      replicaCount: 10                    # The number of pods to create in each scale-out event.
      tolerations: []
    - affinity: {}
      annotations: {}
      containers:
      - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1
        imagePullPolicy: IfNotPresent
        name: placeholder
        resources:
          requests:
            cpu: 3500m   # CPU request for the placeholder pod.
            memory: 6    # Memory request for the placeholder pod.
      imagePullSecrets: {}
      labels: {}
      name: ack-place-holder-H           # The name of the placeholder Deployment.
      nodeSelector: {"available_zone":"h"} # The zone label. It must match the label configured for the node pool in Step 1.
      replicaCount: 10                   # The number of pods to create in each scale-out event.
      tolerations: []
    fullnameOverride: ""
    nameOverride: ""
    podSecurityContext: {}
    priorityClassDefault:
      enabled: true
      name: default-priority-class
      value: -1

    Si la actualización se completa correctamente, se creará un Deployment de marcador de posición para cada zona.

Paso 3: Crear un PriorityClass para la carga de trabajo

  1. Cree un archivo llamado priorityClass.yaml con la plantilla YAML siguiente.

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000              # Set a priority value higher than the default priority of the placeholder pods from Step 2.
    globalDefault: false
    description: "This priority class should be used for XYZ service pods only."

    Si no necesita configurar un PriorityClass específico para cada pod, establezca un valor global predeterminado. Una vez configurado, cualquier pod sin un priorityClassName especificado usará automáticamente esta prioridad.

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: global-high-priority
    value: 1                              # Set a priority value higher than the default priority of the placeholder pods from Step 2.
    globalDefault: true
    description: "This priority class should be used for XYZ service pods only."
  2. Cree el PriorityClass.

    kubectl apply -f priorityClass.yaml

    Resultado esperado:

    priorityclass.scheduling.k8s.io/high-priority created

Paso 4: Crear la carga de trabajo real

En el ejemplo siguiente se crea una carga de trabajo en la zona I.

  1. Cree un archivo llamado workload.yaml con la plantilla YAML siguiente.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: placeholder-test
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:                        # Node selector.
            available_zone: "i"
          priorityClassName: high-priority     # The name of the PriorityClass created in Step 3. This field is optional if you have configured a global default.
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            resources:
              requests:
                cpu: '3'                        # Resource requests for the actual workload.
                memory: 5Gi
  2. Despliegue la carga de trabajo real.

    kubectl apply -f workload.yaml

    Resultado esperado:

    deployment.apps/placeholder-test created

    Una vez desplegada la carga de trabajo, vaya a la página Workloads > Pods. Observará que, debido a que la carga de trabajo tiene un PriorityClass superior, reemplaza a un pod de marcador de posición y se ejecuta en su nodo. El pod de marcador de posición reemplazado, a su vez, activa el escalador automático del clúster para ejecutar un escalado horizontal simultáneo y preparar capacidad para futuros escalados de la carga de trabajo.

    En la página Nodes > Nodes, compruebe que el pod de la carga de trabajo ahora se ejecuta en el nodo que antes ocupaba un pod de marcador de posición. También puede verificar que el clúster escaló horizontalmente nuevos nodos worker. Por ejemplo, podría ver dos nuevos nodos ecs.c6e.xlarge (4 vCPU, 8 GiB) en estado de ejecución, lo que confirma que el escalador automático del clúster completó correctamente el escalado horizontal simultáneo.