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.
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.
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 |
|
|
Límite superior estricto para el contenedor |
Kubernetes (desde |
|
|
Umbral de limitación: la recuperación comienza aquí |
|
|
|
Activador de recuperación asíncrona |
|
|
|
Base de memoria no recuperable |
|
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):
Anotación de pod (
koordinator.sh/memoryQOS)ConfigMap a nivel de namespace (
ack-slo-pod-config)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.
-
Cree el archivo
configmap.yamlcon 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 } } } } -
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' -
Aplique el ConfigMap:
Si
ack-slo-configya existe enkube-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``
(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.
-
Cree el archivo
ack-slo-pod-config.yamlcon 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-nsyblock-nscon los nombres reales de los namespaces. -
Aplique el ConfigMap:
kubectl patch cm -n kube-system ack-slo-pod-config --patch "$(cat ack-slo-pod-config.yaml)" (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
-
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 -
Despliegue Redis:
kubectl apply -f redis-demo.yaml -
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. -
Despliegue la carga de trabajo de estrés:
kubectl apply -f stress-demo.yaml -
Compruebe la marca de agua mínima global antes de ejecutar la prueba de rendimiento.
ImportanteEn 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_kbytesSalida esperada:
4000000 -
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. -
Revise los resultados de la prueba de rendimiento:
kubectl logs -f memtier-demo -
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
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 |
|
|
51.32 ms |
47.25 ms |
|
|
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.
Las columnas Annotation y ConfigMap indican si el parámetro se puede configurar mediante anotaciones y el ConfigMap.
indica que es compatible y
indica que no es compatible.
|
Parámetro |
Tipo |
Rango de valores |
Descripción |
Anotación de pod |
ConfigMap |
|
|
Booleano |
- |
- |
|
|
|
|
Cadena |
- |
- |
|
|
|
|
Entero |
0~100 |
Unidad: %. Valor predeterminado: Fórmula: |
|
|
|
|
Entero |
0~100 |
Unidad: %. Valor predeterminado: |
|
|
|
|
Entero |
0~100 |
Unidad: %. Valor predeterminado: |
|
|
|
|
Entero |
0~100 |
Unidad: %. Valor predeterminado: |
|
|
|
|
Entero |
-25~50 |
Unidad: %. El valor predeterminado es |
|
|
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 QoSalibabacloud.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:
Uso de recursos del nodo: ack-koordinator es un componente no gestionado que se ejecuta en los nodos worker. Puede configurar las solicitudes de recursos para cada módulo durante la instalación.
Métricas de Prometheus: Si habilita las métricas de Prometheus para ack-koordinator y utiliza Managed Service for Prometheus, las métricas se facturan como métricas personalizadas. Antes de habilitar esta función, revise las reglas de facturación de Managed Service for Prometheus. Para supervisar el uso, consulte Consulta de la cantidad de datos observables y facturas.
Siguientes pasos
Overview of kernel features and interfaces — funciones del kernel requeridas por el QoS de memoria de ACK
Enable CPU QoS for containers — limite y expulse recursos recuperados para proteger cargas de trabajo sensibles a la latencia