Política de CPU aprimorada
O Kubernetes fornece duas políticas de CPU: none e static.
- none: a política de CPU é desabilitada por padrão, indicando o comportamento de agendamento existente.
- static: a política de vinculação de núcleo da CPU estática está ativada. Essa política permite que pods com certas características de recurso recebam afinidade e exclusividade aprimoradas da CPU no nó.
Com base na política estática do Kubernetes, a política de CPU aprimorada (estática aprimorada) suporta pods intermitentes (cujas solicitações e limites de CPU devem ser inteiros positivos) e permite que eles usem preferencialmente determinadas CPUs, garantindo a estabilidade da aplicação. Exemplo:
... spec: containers: - name: nginx image: nginx resources: limits: memory: "300Mi" cpu: "2" requests: memory: "200Mi" cpu: "1"
Esse recurso é construído sobre o agendamento otimizado da CPU no kernel do Huawei Cloud EulerOS 2.0. Quando o uso de CPU preferencialmente usado por um contêiner excede 85%, o contêiner é automaticamente alocado para outras CPUs com baixo uso para garantir a capacidade de resposta das aplicações.
- Quando a política aprimorada de CPU está ativada, o desempenho da aplicação é melhor do que o da política none, mas pior do que o da política static.
- A CPU não seria usada exclusivamente por pods rebentáveis, ela ainda está no pool de CPUs compartilhado. Quando os pods estouráveis estão na maré baixa, outros pods podem compartilhar essa CPU.
Restrições
Para usar esse recurso, as seguintes condições devem ser atendidas:
- A versão do cluster é v1.23 ou posterior.
- O sistema operacional do nó é o Huawei Cloud EulerOS 2.0.
Procedimento
- Efetue logon no console do CCE.
- Clique no nome do cluster para acessar o console do cluster. Escolha Nodes no painel de navegação e clique na guia Node Pools à direita.
- Selecione um pool de nós cujo SO seja o Huawei Cloud EulerOS 2.0 e escolha More > Manage na coluna Operation.
- Na janelaManage Components exibida, altere o valor de cpu-manager-policy do componente kubelet para enhanced-static.
- Clique em OK.
Verificação
Pegue um nó com 8 vCPUs e 32 GB de memória como exemplo. Implemente uma carga de trabalho cuja solicitação de CPU é 1 e o limite é 2 no cluster com antecedência.
- Faça logon em um nó no pool de nós e visualize a saída /var/lib/kubelet/cpu_manager_state.
cat /var/lib/kubelet/cpu_manager_state
Saída do comando:
{"policyName":"enhanced-static","defaultCpuSet":"0,2-7","entries":{"6739f6f2-ebe5-48ae-945a-986d5d8919b9":{"container-1":"0-7,10001"}},"checksum":1638128523}
- Se o valor de policyName for enhanced-static, a política está configurada com êxito.
- 10000 é usado como base para o ID da CPU. Neste exemplo, 10001 indica que o ID de CPU de afinidade usado pelo contêiner é CPU 1, e 0-7 indica o conjunto de CPUs que pode ser usado pelo contêiner no pod.
- Verifique a configuração cgroup de cpuset.preferred_cpus do contêiner. A saída é o ID da CPU que é usada preferencialmente.
cat /sys/fs/cgroup/cpuset/kubepods/burstable/pod {pod uid} / {Container ID} /cpuset.preferred_cpus
- {pod uid} indica o UID do pod, que pode ser obtido executando o seguinte comando no host que foi conectado ao cluster usando kubectl:
kubectl get po {pod name} -n {namespace} -ojsonpath='{.metadata.uid}{"\n"}'
No comando anterior, {pod name} e {namespace} indicam o nome do pod e o namespace ao qual o pod pertence.
- {Container id} deve ser um ID de contêiner completo. Você pode executar o seguinte comando no nó em que o contêiner está sendo executado para obter o ID do contêiner:
Pool de nós do Docker:
docker ps --no-trunc | grep {pod name} | grep -v cce-pause | awk '{print $1}'
Pool de nós de containerd:
crictl ps --no-trunc | grep {pod name} | grep -v cce-pause | awk '{print $1}'
Um exemplo completo é o seguinte:
cat /sys/fs/cgroup/cpuset/kubepods/burstable/pod6739f6f2-ebe5-48ae-945a-986d5d8919b9/5ba5603434b95fd22d36fba6a5f1c44eba83c18c2e1de9b52ac9b52e93547a13/cpuset.preferred_cpus
Se a saída do comando a seguir for exibida, a CPU 1 será usada preferencialmente.
1
- {pod uid} indica o UID do pod, que pode ser obtido executando o seguinte comando no host que foi conectado ao cluster usando kubectl: