Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Enable CPU QoS for containers

Última actualización: Sep 04, 2026

En entornos de coubicación, las aplicaciones sensibles a la latencia (LS) y las de mejor esfuerzo (BE) comparten el mismo nodo. Las solicitudes y los límites de CPU por sí solos no evitan que las cargas de trabajo BE interfieran con las LS, especialmente bajo una carga elevada. CPU QoS utiliza las prioridades de programación de Linux mediante la función group identity para otorgar a los Pods LS una prioridad de programación del kernel superior a la de los Pods BE, lo que reduce la interferencia en escenarios de coubicación.

Para comprender los conceptos subyacentes, consulte Pod quality of service classes y Assign memory resources to containers and Pods en la documentación de Kubernetes.

Funcionamiento de CPU QoS

ack-koordinator asigna una identidad de grupo a cada cgroup de CPU. El kernel utiliza estas identidades para programar tareas con prioridades diferenciadas:

  • Programación más rápida para tareas LS: El sistema operativo programa las tareas de aplicaciones LS con mayor prioridad, lo que mejora la velocidad de respuesta y el throughput.

  • Sin apropiación por parte de tareas BE: Cuando se activa una tarea BE, no puede apropiarse de un proceso LS en ejecución.

  • Aislamiento SMT: En entornos de Simultaneous MultiThreading (SMT), las tareas BE no se ejecutan en paralelo con las tareas LS en el mismo núcleo físico, lo que previene la contención de recursos a nivel de hardware.

Elegir una clase de QoS

Clase de QoS

Prioridad de programación de CPU

LS (sensible a la latencia)

Alta (identidad de grupo: 2)

BE (mejor esfuerzo)

Baja (identidad de grupo: -1)

Los Pods etiquetados con koordinator.sh/qosClass: LS se tratan como alta prioridad. Los Pods etiquetados con koordinator.sh/qosClass: BE se tratan como baja prioridad. Para los Pods sin esta etiqueta, ack-koordinator recurre a la clase de QoS nativa de Kubernetes: los Pods BestEffort se asignan a BE y todos los demás se asignan a LS.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

  • Un clúster de ACK que ejecute la versión 1.18 o posterior. Para actualizar, consulte Manually update ACK clusters.

  • Alibaba Cloud Linux como sistema operativo del nodo. La función de identidad de grupo depende de parámetros del kernel específicos de este sistema operativo. Para conocer los requisitos de la versión del kernel, consulte Group identity feature.

  • ack-koordinator v0.8.0 o posterior instalado. Para obtener instrucciones de instalación, consulte ack-koordinator (FKA ack-slo-manager).

Si sus nodos no ejecutan Alibaba Cloud Linux, utilice CPU Suppress para limitar el uso de CPU de los Pods BE.

Facturación

La instalación y el uso de ack-koordinator son gratuitos. Pueden aplicarse costos adicionales en los siguientes casos:

  • Recursos de nodos worker: ack-koordinator es autogestionado y consume CPU y memoria de los nodos worker tras la instalación. Configure las solicitudes de recursos para cada módulo durante la instalación.

  • Monitoreo con Prometheus: Si habilita la opción Enable Prometheus Monitoring for ACK-Koordinator y utiliza Alibaba Cloud Prometheus, las métricas expuestas se facturan como custom metrics. Los costos dependen del tamaño del clúster y de la cantidad de aplicaciones. Revise la documentación sobre billing of Prometheus instances antes de habilitar esta opción y query usage data para monitorear su consumo.

Habilitar CPU QoS

Habilite CPU QoS a nivel de clúster mediante un ConfigMap y luego etiquete sus Pods con la clase de QoS correspondiente.

Paso 1: Aplicar el ConfigMap

  1. Cree un archivo llamado configmap.yaml con el siguiente contenido:

    Para aplicar CPU QoS a una carga de trabajo como un Deployment, agregue la etiqueta koordinator.sh/qosClass a la plantilla del Pod bajo template.metadata .
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      # Enable the CPU QoS feature for containers.
      resource-qos-config: |
        {
          "clusterStrategy": {
            "lsClass": {
              "cpuQOS": {
                "enable": true,
                "groupIdentity": 2
              }
            },
            "beClass": {
              "cpuQOS": {
                "enable": true,
                "groupIdentity": -1
              }
            }
          }
        }

    El campo lsClass configura los Pods LS; beClass configura los Pods BE. La siguiente tabla describe los parámetros clave bajo cpuQOS.

    Parámetro

    Tipo

    Valores válidos

    Descripción

    enable

    Booleano

    true / false

    true: habilita CPU QoS en todo el clúster. false: lo deshabilita.

    groupIdentity

    Entero

    De -1 a 2

    La prioridad de programación del kernel para el cgroup. Los valores más altos indican mayor prioridad. Valor predeterminado: 2 para Pods LS, -1 para Pods BE. Establezca este valor en 0 para deshabilitar la identidad de grupo para esa clase.

  2. Compruebe si el ConfigMap ack-slo-config ya existe en el namespace kube-system:

    • Si existe, ejecute el siguiente comando de parche para actualizarlo sin sobrescribir otros campos de configuración:

      kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
    • Si no existe, créelo:

      kubectl apply -f configmap.yaml

Paso 2: Desplegar un Pod LS y comprobar

  1. Cree un archivo llamado ls-pod-demo.yaml con el siguiente contenido:

    apiVersion: v1
    kind: Pod
    metadata:
      name: ls-pod-demo
      labels:
        koordinator.sh/qosClass: 'LS' # Specify the QoS class of the Pod as LS.
    spec:
      containers:
      - command:
        - httpd
        - -D
        - FOREGROUND
        image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1
        imagePullPolicy: Always
        name: apache
        resources:
          limits:
            cpu: "4"
            memory: 10Gi
          requests:
            cpu: "4"
            memory: 10Gi
      restartPolicy: Never
      schedulerName: default-scheduler
  2. Despliegue el Pod:

    kubectl apply -f ls-pod-demo.yaml
  3. En el nodo, compruebe la identidad de grupo asignada al cgroup del Pod LS:

    cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_ns

    Salida esperada:

    # The group identity of the LS Pod is 2, which indicates high priority.
    2

Paso 3: Desplegar un Pod BE y comprobar

  1. Cree un archivo llamado be-pod-demo.yaml con el siguiente contenido:

    apiVersion: v1
    kind: Pod
    metadata:
      name: be-pod-demo
      labels:
        koordinator.sh/qosClass: 'BE' # Specify the QoS class of the Pod as BE.
    spec:
      containers:
        - args:
            - '-c'
            - '1'
            - '--vm'
            - '1'
          command:
            - stress
          image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
          imagePullPolicy: Always
          name: stress
      restartPolicy: Always
      schedulerName: default-scheduler
  2. Despliegue el Pod:

    kubectl apply -f be-pod-demo.yaml
  3. En el nodo, compruebe la identidad de grupo asignada al cgroup del Pod BE:

    cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_ns

    Salida esperada:

    # The group identity of the BE Pod is -1, which indicates low priority.
    -1

El Pod LS tiene una identidad de grupo de 2 y el Pod BE tiene una identidad de grupo de -1. Esta diferencia confirma que CPU QoS está activo: el kernel prioriza los recursos de CPU para las cargas de trabajo LS sobre las cargas de trabajo BE.

Preguntas frecuentes

Compatibilidad de protocolos al actualizar a ack-koordinator

Las versiones anteriores de ack-slo-manager (v0.8.0 y anteriores) utilizaban la anotación alibabacloud.com/qosClass para configurar CPU QoS. ack-koordinator admite ambos protocolos, por lo que puede actualizar el componente y migrar sus Pods al protocolo koordinator.sh de forma incremental. Tenga en cuenta que la compatibilidad con el protocolo anterior alibabacloud.com finalizó el 30 de julio de 2023; actualice sus recursos al nuevo protocolo lo antes posible.

Versión del componente

**Protocolo alibabacloud.com**

**Protocolo koordinator.sh**

>= 0.5.2 y < 0.8.0

Compatible

No compatible

>= 0.8.0

Compatible

Compatible

Pasos siguientes