Em ambientes de colocation, aplicações sensíveis à latência (LS) e de melhor esforço (BE) compartilham o mesmo nó. Somente as solicitações e os limites de CPU não impedem que cargas de trabalho BE interfiram nas cargas LS, especialmente sob alta demanda. A CPU QoS usa prioridades de agendamento do Linux por meio do recurso group identity para conceder aos Pods LS prioridade de agendamento no kernel superior à dos Pods BE, o que reduz a interferência em cenários de colocation.
Para compreender os conceitos subjacentes, consulte Pod quality of service classes e Assign memory resources to containers and Pods na documentação do Kubernetes.
Funcionamento da CPU QoS
O ack-koordinator atribui uma group identity a cada cgroup de CPU. O kernel usa essas identidades para agendar tarefas com prioridades diferenciadas:
Agendamento mais rápido para tarefas LS: o sistema operacional agenda tarefas de aplicações LS com maior prioridade, melhorando a velocidade de resposta e o throughput.
Sem preempção por tarefas BE: quando uma tarefa BE é ativada, ela não preempta um processo LS em execução.
Isolamento de SMT: em ambientes com Simultaneous MultiThreading (SMT), as tarefas BE não executam em paralelo com tarefas LS no mesmo núcleo físico, evitando contenção de recursos no nível de hardware.
Escolha uma classe de QoS
|
Classe de QoS |
Prioridade de agendamento de CPU |
|
LS (sensível à latência) |
Alta (group identity: |
|
BE (melhor esforço) |
Baixa (group identity: |
Pods rotulados com koordinator.sh/qosClass: LS têm tratamento de alta prioridade. Já os Pods rotulados com koordinator.sh/qosClass: BE têm tratamento de baixa prioridade. Para Pods sem esse rótulo, o ack-koordinator recorre à classe de QoS nativa do Kubernetes: Pods BestEffort mapeiam para BE e todos os demais mapeiam para LS.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster ACK executando a versão 1.18 ou posterior. Para atualizar, consulte Manually update ACK clusters.
Alibaba Cloud Linux como sistema operacional do nó. O recurso group identity depende de parâmetros de kernel específicos desse SO. Para requisitos de versão do kernel, consulte Group identity feature.
ack-koordinator v0.8.0 ou posterior instalado. Para instruções de instalação, consulte ack-koordinator (FKA ack-slo-manager).
Se seus nós não executarem Alibaba Cloud Linux, use o CPU Suppress para limitar o uso de CPU dos Pods BE.
Faturamento
A instalação e o uso do ack-koordinator são gratuitos. Custos adicionais podem ser aplicados nos seguintes casos:
Recursos de nós worker: o ack-koordinator é autogerenciado e consome CPU e memória dos nós worker após a instalação. Configure as solicitações de recursos para cada módulo durante a instalação.
Monitoramento com Prometheus: se você ativar a opção Enable Prometheus Monitoring for ACK-Koordinator e usar o Alibaba Cloud Prometheus, as métricas expostas serão cobradas como custom metrics. Os custos dependem do tamanho do cluster e da quantidade de aplicações. Revise a documentação sobre billing of Prometheus instances antes de ativar essa opção e query usage data para monitorar seu consumo.
Ative a CPU QoS
Ative a CPU QoS no nível do cluster usando um ConfigMap e, em seguida, rotule seus Pods com a classe de QoS apropriada.
Etapa 1: Aplique o ConfigMap
-
Crie um arquivo chamado
configmap.yamlcom o seguinte conteúdo:Para aplicar CPU QoS a uma carga de trabalho, como um Deployment, adicione o rótulo
koordinator.sh/qosClassao modelo de Pod emtemplate.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 } } } }O campo
lsClassconfigura Pods LS;beClassconfigura Pods BE. A tabela a seguir descreve os principais parâmetros emcpuQOS.Parâmetro
Tipo
Valores válidos
Descrição
enableBooleano
true/falsetrue: ativa a CPU QoS em todo o cluster.false: desativa o recurso.groupIdentityInteiro
-1a2Prioridade de agendamento do kernel para o cgroup. Valores maiores indicam maior prioridade. Padrão:
2para Pods LS,-1para Pods BE. Defina como0para desativar a group identity para essa classe. -
Verifique se o ConfigMap
ack-slo-configjá existe no namespacekube-system:-
Se existir, execute o comando patch a seguir para atualizá-lo sem sobrescrever outros campos de configuração:
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" -
Se não existir, crie-o:
kubectl apply -f configmap.yaml
-
Etapa 2: Implante um Pod LS e verifique
-
Crie um arquivo chamado
ls-pod-demo.yamlcom o seguinte conteúdo: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 -
Implante o Pod:
kubectl apply -f ls-pod-demo.yaml -
No nó, verifique a group identity atribuída ao cgroup do Pod LS:
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_nsSaída esperada:
# The group identity of the LS Pod is 2, which indicates high priority. 2
Etapa 3: Implante um Pod BE e verifique
-
Crie um arquivo chamado
be-pod-demo.yamlcom o seguinte conteúdo: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 -
Implante o Pod:
kubectl apply -f be-pod-demo.yaml -
No nó, verifique a group identity atribuída ao cgroup do Pod BE:
cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_nsSaída esperada:
# The group identity of the BE Pod is -1, which indicates low priority. -1
O Pod LS tem group identity 2 e o Pod BE tem group identity -1. Essa diferença confirma que a CPU QoS está ativa: o kernel prioriza recursos de CPU para cargas de trabalho LS em detrimento das cargas BE.
Perguntas frequentes
Compatibilidade de protocolo ao atualizar para ack-koordinator
Versões anteriores do ack-slo-manager (v0.8.0 e anteriores) usavam a anotação alibabacloud.com/qosClass para configurar a CPU QoS. O ack-koordinator suporta ambos os protocolos, permitindo atualizar o componente e migrar os Pods para o protocolo koordinator.sh incrementalmente. O suporte ao protocolo antigo alibabacloud.com foi encerrado em 30 de julho de 2023 — atualize seus recursos para o novo protocolo o mais breve possível.
|
Versão do componente |
**Protocolo |
**Protocolo |
|
>= 0.5.2 e < 0.8.0 |
Suportado |
Não suportado |
|
>= 0.8.0 |
Suportado |
Suportado |
Próximos passos
Ative a memory QoS para priorizar o acesso à memória de aplicações LS e manter uma alocação justa para todos os Pods. Consulte Enable memory QoS.
Isole o cache L3 e a largura de banda de memória entre cargas de trabalho LS e BE. Consulte Enable resource isolation based on the L3 cache and MBA.