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: |
|
BE (mejor esfuerzo) |
Baja (identidad de grupo: |
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
-
Cree un archivo llamado
configmap.yamlcon el siguiente contenido:Para aplicar CPU QoS a una carga de trabajo como un Deployment, agregue la etiqueta
koordinator.sh/qosClassa la plantilla del Pod bajotemplate.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
lsClassconfigura los Pods LS;beClassconfigura los Pods BE. La siguiente tabla describe los parámetros clave bajocpuQOS.Parámetro
Tipo
Valores válidos
Descripción
enableBooleano
true/falsetrue: habilita CPU QoS en todo el clúster.false: lo deshabilita.groupIdentityEntero
De
-1a2La prioridad de programación del kernel para el cgroup. Los valores más altos indican mayor prioridad. Valor predeterminado:
2para Pods LS,-1para Pods BE. Establezca este valor en0para deshabilitar la identidad de grupo para esa clase. -
Compruebe si el ConfigMap
ack-slo-configya existe en el namespacekube-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
-
Cree un archivo llamado
ls-pod-demo.yamlcon 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 -
Despliegue el Pod:
kubectl apply -f ls-pod-demo.yaml -
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_nsSalida esperada:
# The group identity of the LS Pod is 2, which indicates high priority. 2
Paso 3: Desplegar un Pod BE y comprobar
-
Cree un archivo llamado
be-pod-demo.yamlcon 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 -
Despliegue el Pod:
kubectl apply -f be-pod-demo.yaml -
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_nsSalida 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 |
**Protocolo |
|
>= 0.5.2 y < 0.8.0 |
Compatible |
No compatible |
|
>= 0.8.0 |
Compatible |
Compatible |
Pasos siguientes
Habilite Memory QoS para priorizar el acceso a memoria de las aplicaciones LS y mantener una asignación equitativa para todos los Pods. Consulte Enable memory QoS.
Aísle la caché L3 y el ancho de banda de memoria entre las cargas de trabajo LS y BE. Consulte Enable resource isolation based on the L3 cache and MBA.