Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Enable container memory QoS

Última actualización: Sep 04, 2026

Utilice ack-koordinator para priorizar la memoria de los contenedores sensibles a la latencia y reducir los errores OOM durante la contención de recursos.

Nota

Antes de utilizar QoS de memoria, consulte Pod Quality of Service Classes y Assign Memory Resources to Containers and Pods en la documentación de Kubernetes.

Funcionamiento

Kubernetes asigna a cada pod una solicitud y un límite de memoria. Bajo presión de memoria, pueden ocurrir dos modos de fallo:

  • Presión a nivel de contenedor: Cuando el uso de memoria de un contenedor (incluida la caché de páginas) se acerca a su límite, el sistema operativo activa la recuperación directa a nivel de memcg, lo que bloquea los procesos. Si la asignación supera la recuperación, un error OOM finaliza el pod.

  • Presión a nivel de nodo: Cuando los límites totales de memoria de los contenedores exceden la memoria física del nodo, el kernel recupera memoria entre los contenedores sin distinción. Esto degrada el rendimiento y puede desencadenar errores OOM.

image

ack-koordinator aborda ambos problemas mediante la configuración del grupo de control de memoria (memcg) por contenedor. Para ello, utiliza tres funciones del kernel de Alibaba Cloud Linux (Alinux):

  • Memcg QoS: reserva una cantidad mínima de memoria para que los contenedores de alta prioridad conserven su conjunto de trabajo.

  • Memcg backend asynchronous reclamation: recupera memoria de forma proactiva antes de alcanzar el límite, lo que evita el bloqueo por recuperación directa.

  • Memcg global minimum watermark rating: ajusta el umbral de recuperación por contenedor para que los contenedores sensibles a la latencia (LS) sean los últimos en liberar recursos.

Esto genera una distribución de memoria más equitativa y una menor latencia durante el sobrecompromiso de recursos.

Ventajas frente al QoS de memoria de Kubernetes de código abierto

La función memory QoS de Kubernetes upstream (Kubernetes 1.22+) solo admite cgroup v2, requiere configuración manual de kubelet y carece de granularidad por pod o por namespace.

ack-koordinator mejora la implementación upstream en dos aspectos:

  • Mayor compatibilidad con el kernel: Admite cgroup v1 y v2, respaldado por funciones del kernel de Alinux como la recuperación asíncrona de backend de memcg y la clasificación de marca de agua mínima. Consulte Overview of kernel features and interfaces.

  • Configuración detallada: Configure el QoS de memoria por pod, namespace o clúster mediante anotaciones de pod o ConfigMaps.

Mecanismo de configuración

ack-koordinator utiliza cuatro parámetros de cgroup para el QoS de memoria. Cada uno se asigna a opciones de configuración en Advanced parameters:

cgroup parameter

Controls

Configured by

memory.limit_in_bytes

Límite superior estricto para el contenedor

Kubernetes (desde limits.memory)

memory.high

Umbral de limitación: la recuperación comienza aquí

throttlingPercent

memory.wmark_high

Activador de recuperación asíncrona

wmarkRatio

memory.min

Base de memoria no recuperable

minLimitPercent / lowLimitPercent

image.svg

Prioridad de configuración

Cuando varias fuentes de configuración aplican al mismo pod, ack-koordinator utiliza el siguiente orden de prioridad (de mayor a menor):

  1. Anotación de pod (koordinator.sh/memoryQOS)

  2. ConfigMap a nivel de namespace (ack-slo-pod-config)

  3. ConfigMap a nivel de clúster (ack-slo-config)

Asignación de clases de QoS

Si un pod no tiene la etiqueta koordinator.sh/qosClass, ack-koordinator asigna automáticamente las clases de QoS de Kubernetes:

Kubernetes QoS class

koordinator QoS class

Guaranteed

Configuración predeterminada de QoS de memoria

Burstable

LS (sensible a la latencia)

BestEffort

BE (mejor esfuerzo)

Requisitos previos

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

  • Un clúster ACK que ejecute Kubernetes 1.18 o superior. Consulte Manually update ACK clusters.

  • Alinux como sistema operativo de los nodos. Algunos parámetros avanzados dependen de funciones del kernel de Alinux. Consulte Advanced parameters.

  • ack-koordinator 0.8.0 o superior instalado. Consulte ack-koordinator.

Habilitar QoS de memoria para un pod específico

Agregue la siguiente anotación a la especificación del pod:

annotations:
  # Enable memory QoS with recommended settings
  koordinator.sh/memoryQOS: '{"policy": "auto"}'
  # Disable memory QoS
  # koordinator.sh/memoryQOS: '{"policy": "none"}'

Habilitar QoS de memoria para un clúster

Utilice el ConfigMap ack-slo-config para aplicar QoS de memoria a todos los pods del clúster.

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

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      resource-qos-config: |-
        {
          "clusterStrategy": {
            "lsClass": {
              "memoryQOS": {
                "enable": true
              }
            },
            "beClass": {
              "memoryQOS": {
                "enable": true
              }
            }
          }
        }
  2. Establezca la clase de QoS de cada pod con la etiqueta koordinator.sh/qosClass:

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-demo
      labels:
        koordinator.sh/qosClass: 'LS'
  3. Aplique el ConfigMap:

    • Si ack-slo-config ya existe en kube-system, actualícelo para conservar otras configuraciones: ``bash kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" ``

    • Si no existe, créelo: ``bash kubectl apply -f configmap.yaml ``

  4. (Opcional) Configure advanced parameters.

Habilitar QoS de memoria para un namespace

Utilice el ConfigMap ack-slo-pod-config para habilitar o deshabilitar el QoS de memoria en pods de namespaces específicos.

  1. Cree el archivo ack-slo-pod-config.yaml con el siguiente contenido:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-pod-config
      namespace: kube-system
    data:
      memory-qos: |
        {
          "enabledNamespaces": ["allow-ns"],
          "disabledNamespaces": ["block-ns"]
        }

    Reemplace allow-ns y block-ns con los nombres reales de los namespaces.

  2. Aplique el ConfigMap:

    kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)"
  3. (Opcional) Configure advanced parameters.

Ejemplo: Redis bajo sobrecompromiso de memoria

Este ejemplo muestra cómo el QoS de memoria reduce la latencia de Redis y aumenta el throughput bajo condiciones de sobrecompromiso de memoria. La prueba utiliza:

  • Un clúster ACK Pro con dos nodos (8 vCPU y 32 GB cada uno)

  • Un nodo dedicado a Redis y otro para la prueba de estrés

Ejecutar la prueba

  1. Cree el archivo redis-demo.yaml:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: redis-demo-config
    data:
      redis-config: |
        appendonly yes
        appendfsync no
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: redis-demo
      labels:
        koordinator.sh/qosClass: 'LS'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "auto"}'
    spec:
      containers:
      - name: redis
        image: redis:5.0.4
        command:
          - redis-server
          - "/redis-master/redis.conf"
        env:
        - name: MASTER
          value: "true"
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "2"
            memory: "6Gi"
          requests:
            cpu: "2"
            memory: "2Gi"
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
      volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: redis-demo-config
            items:
            - key: redis-config
              path: redis.conf
      nodeName: # Set to the name of the node running Redis.
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: redis-demo
    spec:
      ports:
      - name: redis-port
        port: 6379
        protocol: TCP
        targetPort: 6379
      selector:
        name: redis-demo
      type: ClusterIP
  2. Despliegue Redis:

    kubectl apply -f redis-demo.yaml
  3. Simule el sobrecompromiso de memoria con la herramienta Stress. Cree el archivo stress-demo.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: stress-demo
      labels:
        koordinator.sh/qosClass: 'BE'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "auto"}'
    spec:
      containers:
        - args:
            - '--vm'
            - '2'
            - '--vm-bytes'
            - 11G
            - '-c'
            - '2'
            - '--vm-hang'
            - '2'
          command:
            - stress
          image: polinux/stress
          imagePullPolicy: Always
          name: stress
      restartPolicy: Always
      nodeName: # Set to the same node as redis-demo.
  4. Despliegue la carga de trabajo de estrés:

    kubectl apply -f stress-demo.yaml
  5. Compruebe la marca de agua mínima global antes de ejecutar la prueba de rendimiento.

    Importante

    En escenarios de sobrecompromiso de memoria, una marca de agua mínima global baja provoca que el eliminador OOM se ejecute antes de la recuperación de memoria. Para un nodo de 32 GB, establezca este valor en 4,000,000 KB como mínimo.

    cat /proc/sys/vm/min_free_kbytes

    Salida esperada:

    4000000
  6. Despliegue memtier-benchmark para enviar solicitudes al pod de Redis:

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        name: memtier-demo
      name: memtier-demo
    spec:
      containers:
        - command:
            - memtier_benchmark
            - '-s'
            - 'redis-demo'
            - '--data-size'
            - '200000'
            - "--ratio"
            - "1:4"
          image: 'redislabs/memtier_benchmark:1.3.0'
          name: memtier
      restartPolicy: Never
      nodeName: # Set to the name of the node sending requests.
  7. Revise los resultados de la prueba de rendimiento:

    kubectl logs -f memtier-demo
  8. Para comparar, deshabilite el QoS de memoria en ambos pods y repita la prueba:

    apiVersion: v1
    kind: Pod
    metadata:
      name: redis-demo
      labels:
        koordinator.sh/qosClass: 'LS'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "none"}'
    spec:
      ...
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: stress-demo
      labels:
        koordinator.sh/qosClass: 'BE'
      annotations:
        koordinator.sh/memoryQOS: '{"policy": "none"}'

Resultados de la prueba

Importante

Los resultados son solo de referencia. Los valores reales dependen de la configuración del clúster y de la carga de trabajo.

Metric

Memory QoS disabled

Memory QoS enabled

Latency-avg

51.32 ms

47.25 ms

Throughput-avg

149.0 MB/s

161.9 MB/s

Habilitar el QoS de memoria redujo la latencia de Redis en un 7.9% y aumentó el throughput en un 8.7% bajo condiciones de sobrecompromiso de memoria.

Parámetros avanzados

Configure estos parámetros en las anotaciones del pod o en el ConfigMap ack-slo-config. Las anotaciones del pod tienen prioridad.

Nota

Las columnas Annotation y ConfigMap indican si el parámetro se puede configurar mediante anotaciones y el ConfigMap. Supported indica que es compatible y Not supported indica que no es compatible.

Parámetro

Tipo

Rango de valores

Descripción

Anotación de pod

ConfigMap

enable

Booleano

- true- false

- true: habilita el QoS de memoria para todos los contenedores con la configuración recomendada de memcg.- false: deshabilita el QoS de memoria para todos los contenedores y restaura la configuración predeterminada de memcg.

Not supported

Supported

policy

Cadena

- auto- default- none

- auto: habilita el QoS de memoria con la configuración recomendada y anula el ConfigMap ack-slo-pod-config.- default: hereda la configuración del ConfigMap ack-slo-pod-config.- none: deshabilita el QoS de memoria y restaura la configuración predeterminada de memcg, lo que anula el ConfigMap ack-slo-pod-config.

Supported

Not supported

minLimitPercent

Entero

0~100

Unidad: %. Valor predeterminado: 0 (deshabilitado). Proporción no recuperable de la solicitud de memoria del pod. Utilice esta opción para almacenar archivos en caché para aplicaciones sensibles a la caché de páginas. Consulte Memcg QoS feature of the cgroup v1 interface.

Fórmula: memory.min = request × minLimitPercent/100. Por ejemplo, con Memory Request=100MiB y minLimitPercent=100, el valor de memory.min es 104857600.

Supported

Supported

lowLimitPercent

Entero

0~100

Unidad: %. Valor predeterminado: 0 (deshabilitado). Proporción relativamente no recuperable de la solicitud de memoria del pod. Consulte Memcg QoS feature of the cgroup v1 interface. Fórmula: memory.low = request × lowLimitPercent/100. Por ejemplo, con Memory Request=100MiB y lowLimitPercent=100, el valor de memory.low es 104857600.

Supported

Supported

throttlingPercent

Entero

0~100

Unidad: %. Valor predeterminado: 0 (deshabilitado). Umbral de limitación de memoria como proporción del uso del contenedor respecto al límite. Al superarse, se recupera memoria. Evita errores OOM a nivel de cgroup en escenarios de sobrecompromiso. Consulte Memcg QoS feature of the cgroup v1 interface. Fórmula: memory.high = limit × throttlingPercent/100. Por ejemplo, con Memory Limit=100MiB y throttlingPercent=80, el valor de memory.high es 83886080(80 MiB).

Supported

Supported

wmarkRatio

Entero

0~100

Unidad: %. Valor predeterminado: 95. 0 deshabilita este parámetro. Cuando el uso supera el umbral, se activa la recuperación asíncrona de backend de memcg. Umbral de recuperación asíncrona: proporción del uso respecto al límite, o del uso respecto a memory.high. Consulte Memcg backend asynchronous reclaim. Si throttlingPercent está deshabilitado, la fórmula es: Valor de memory.wmark_high = Límite de memoria × wmarkRatio/100. Si throttlingPercent está habilitado, la fórmula es: memory.wmark_high = memory.high × wmarkRatio/100. Por ejemplo, con Memory Limit=100MiB y wmarkRatio=95,throttlingPercent=80: memory.high es 83886080 (80 MiB), memory.wmark_ratio es 95, y memory.wmark_high es 79691776 (76 MiB).

Supported

Supported

wmarkMinAdj

Entero

-25~50

Unidad: %. El valor predeterminado es -25 para la clase de QoS LS y 50 para la clase de QoS BE. 0 deshabilita este parámetro. Ajusta la marca de agua mínima global por contenedor. Los valores negativos posponen la recuperación; los valores positivos la aceleran. Consulte Memcg global minimum watermark rating. Por ejemplo, un pod LS tiene como valor predeterminado memory.wmark_min_adj=-25, lo que disminuye la marca de agua mínima en un 25%.

Supported

Supported

Preguntas frecuentes

¿Sigue siendo válida la configuración de QoS de memoria de ack-slo-manager después de actualizar a ack-koordinator?

Sí. ack-koordinator es retrocompatible con el protocolo basado en anotaciones utilizado en ack-slo-manager 0.8.0 y versiones anteriores:

  • alibabacloud.com/qosClass — establece la clase de QoS

  • alibabacloud.com/memoryQOS — configura el QoS de memoria

La siguiente tabla muestra qué protocolos admite cada versión:

Component version

alibabacloud.com protocol

koordinator.sh protocol

≥ 0.3.0 y < 0.8.0

✓

×

≥ 0.8.0

✓

✓

El soporte para el protocolo alibabacloud.com finalizó el 30 de julio de 2023. Migre al protocolo koordinator.sh.

Facturación

No se cobra ninguna tarifa por instalar o utilizar el componente ack-koordinator. Sin embargo, pueden generarse costos en los siguientes casos:

Siguientes pasos