Cargas de trabalho online geralmente reservam CPU e memória com base em estimativas de pico, mas o uso real costuma ser muito inferior. Isso gera um grande volume de recursos alocados, porém ociosos, que pods BestEffort padrão podem compartilhar — mas sem garantias de agendamento ou controles de justiça. O overcommitment dinâmico de recursos resolve ambos os problemas: o componente ack-koordinator monitora a carga do nó em tempo real, calcula a capacidade recuperável e a expõe como recursos estendidos Batch (kubernetes.io/batch-cpu e kubernetes.io/batch-memory) que pods BestEffort podem solicitar explicitamente.
Para aproveitar ao máximo este recurso, leia Classes de Qualidade de Serviço de Pods e Atribuir recursos de memória a contêineres e pods na documentação do Kubernetes.
Como funciona
O ack-koordinator rastreia continuamente a carga por nó e publica a capacidade recuperável como recursos estendidos em cada nó. Pods BestEffort declaram solicitações e limites explícitos para esses recursos Batch, permitindo que o agendador do ACK tome decisões informadas de alocação e aplique limites de recursos por meio da hierarquia de cgroups do nó.
O diagrama a seguir ilustra por que o overcommitment de recursos padrão é insuficiente:
Sem o overcommitment dinâmico, o agendador não tem visibilidade da carga real do nó e pode alocar pods BestEffort em nós já sobrecarregados. Além disso, não há como expressar quantidades diferentes de recursos por pod, impedindo a distribuição justa entre pods BestEffort.
O ack-koordinator introduz três termos para descrever a capacidade de recursos recuperados:
|
Termo |
Descrição |
|
Recuperado |
Recursos passíveis de overcommitment dinâmico no momento |
|
Em buffer |
Recursos reservados retidos para evitar recuperação excessiva |
|
Uso |
Consumo real de recursos |
Classes de QoS e recursos Batch
O Kubernetes atribui a cada pod uma classe de qualidade de serviço (QoS) com base em sua configuração de recursos. Os recursos Batch são projetados especificamente para a classe BestEffort:
|
Classe de QoS |
Configuração de recursos |
Caso de uso |
|
Guaranteed |
|
Serviços de produção sensíveis à latência |
|
Burstable |
|
Cargas de trabalho online gerais |
|
BestEffort |
Sem |
Jobs Batch e tarefas offline |
Para usar o overcommitment dinâmico de recursos, defina koordinator.sh/qosClass: "BE" no pod e substitua os campos de recursos padrão por kubernetes.io/batch-cpu e kubernetes.io/batch-memory.
Faturamento
Não há cobrança para instalar ou usar o componente ack-koordinator. Observe o seguinte:
O ack-koordinator é um componente não gerenciado. Após a instalação, ele ocupa recursos nos nós workers. Especifique as solicitações de recursos por módulo durante a instalação.
O ack-koordinator pode expor métricas do Prometheus para funcionalidades como perfilamento de recursos e agendamento refinado. Se você ativar as métricas do Prometheus para o ack-koordinator e usar o Managed Service for Prometheus, essas métricas serão contabilizadas como métricas personalizadas e faturadas adequadamente. Antes de ativar, revise o tópico Faturamento do Managed Service for Prometheus e leia Consultar a quantidade de dados observáveis e faturas para entender como os custos são calculados.
Pré-requisitos
Antes de começar, certifique-se de ter:
Um cluster ACK Pro. Para mais informações, consulte Criar um cluster ACK Pro.
O componente ack-koordinator instalado na versão 0.8.0 ou posterior. Para mais informações, consulte ack-koordinator.
Ativar overcommitment dinâmico de recursos
Ative e configure o recurso criando ou atualizando um ConfigMap no namespace kube-system.
Etapa 1: Criar o ConfigMap
Crie um arquivo chamado configmap.yaml com o seguinte conteúdo:
apiVersion: v1
kind: ConfigMap
metadata:
name: ack-slo-config
namespace: kube-system
data:
# colocation-config controls dynamic Batch resource calculation and updates.
# Related features: Dynamic resource overcommitment, load-aware scheduling.
colocation-config: |
{
"enable": true, # Required: enables Batch resource updates. Setting to false resets reclaimed resources to 0.
"metricAggregateDurationSeconds": 60, # How often (seconds) node metrics are aggregated. Use the default value.
"cpuReclaimThresholdPercent": 60, # Reclaim threshold for batch-cpu, as a % of allocatable CPU. Default: 65.
"memoryReclaimThresholdPercent": 70, # Reclaim threshold for batch-memory, as a % of allocatable memory. Default: 65.
"memoryCalculatePolicy": "usage" # How batch-memory capacity is calculated: "usage" (default) or "request".
}
Os valorescpuReclaimThresholdPercentememoryReclaimThresholdPercentneste exemplo (60 e 70) são valores de amostra. Os padrões reais são 65 para ambos os parâmetros.
A tabela a seguir descreve cada parâmetro em detalhes:
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
|
Booleano |
|
Ativa atualizações dinâmicas de recursos Batch. Definir como |
|
|
Inteiro |
|
Frequência (em segundos) com que o sistema agrega métricas do nó para recalcular a capacidade de recursos Batch. Use o valor padrão. |
|
|
Inteiro |
|
Limiar de recuperação para recursos batch-cpu, como porcentagem da CPU alocável. Consulte Calcular capacidade de recursos Batch. |
|
|
Inteiro |
|
Limiar de recuperação para recursos batch-memory, como porcentagem da memória alocável. Consulte Calcular capacidade de recursos Batch. |
|
|
String |
|
Método de cálculo da capacidade batch-memory. |
Calcular capacidade de recursos Batch
O ack-koordinator aplica a seguinte fórmula para calcular a quantidade de recursos Batch disponíveis em cada nó.
Cálculo baseado em uso (padrão, memoryCalculatePolicy: "usage"):
nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podUsage(non-BE) − systemUsage
Cálculo baseado em solicitação (memoryCalculatePolicy: "request", aplica-se apenas a batch-memory):
nodeBatchAllocatable = nodeAllocatable × thresholdPercent − podRequest(non-BE) − systemUsage
Onde:
|
Variável |
Descrição |
|
|
Total de CPU ou memória alocável no nó |
|
|
Porcentagem configurada do limiar de recuperação |
|
|
Uso real de recursos de pods Guaranteed e Burstable |
|
|
Soma das solicitações de recursos para pods Guaranteed e Burstable |
|
|
Consumo de recursos no nível do sistema no nó |
Etapa 2: Aplicar o ConfigMap
Verifique se o ConfigMap ack-slo-config já existe no namespace kube-system:
-
Se existir, use
kubectl patchpara mesclar suas alterações sem sobrescrever outras configurações:kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)" -
Se não existir, crie-o:
kubectl apply -f configmap.yaml
Solicitar recursos Batch
Após ativar o overcommitment dinâmico de recursos, configure os pods para solicitar recursos Batch.
Um pod não pode solicitar recursos Batch e recursos padrão simultaneamente.
Para Deployments ou outras cargas de trabalho, defina o rótulo em
template.metadata, e não no objeto da carga de trabalho em si.O ack-koordinator ajusta dinamicamente a capacidade Batch disponível com base na carga do nó em tempo real. Em casos raros, o kubelet pode demorar para relatar o status do nó, fazendo com que os pods falhem no agendamento devido a recursos insuficientes. Se isso ocorrer, exclua e recrie os pods afetados.
As quantidades de recursos Batch devem ser números inteiros. O batch-cpu usa a unidade millicore (1 core = 1000 millicores).
Etapa 1: Verificar recursos Batch disponíveis no nó
# Replace $nodeName with the actual node name.
kubectl get node $nodeName -o yaml
Procure a seção status.allocatable na saída:
status:
allocatable:
# Unit: millicore. The following example shows 50 cores available.
kubernetes.io/batch-cpu: 50000
# Unit: bytes. The following example shows 50 GB available.
kubernetes.io/batch-memory: 53687091200
Etapa 2: Configurar o pod para usar recursos Batch
Adicione o rótulo koordinator.sh/qosClass: "BE" aos metadados do pod e defina kubernetes.io/batch-cpu e kubernetes.io/batch-memory no campo resources do contêiner:
metadata:
labels:
# Required: sets the pod's QoS class to BestEffort.
koordinator.sh/qosClass: "BE"
spec:
containers:
- resources:
requests:
# Unit: millicore. "1k" = 1000 millicores = 1 core.
kubernetes.io/batch-cpu: "1k"
# Unit: bytes.
kubernetes.io/batch-memory: "1Gi"
limits:
kubernetes.io/batch-cpu: "1k"
kubernetes.io/batch-memory: "1Gi"
Exemplo
Este exemplo implanta um pod de teste BestEffort que usa recursos Batch e verifica se os limites de recursos são aplicados no cgroup do nó.
-
Verifique os recursos Batch disponíveis no nó:
kubectl get node $nodeName -o yamlSaída esperada:
status: allocatable: kubernetes.io/batch-cpu: 50000 kubernetes.io/batch-memory: 53687091200 -
Crie um arquivo chamado
be-pod-demo.yaml:apiVersion: v1 kind: Pod metadata: labels: koordinator.sh/qosClass: "BE" name: be-demo spec: containers: - command: - "sleep" - "100h" image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: Always name: be-demo resources: limits: kubernetes.io/batch-cpu: "50k" kubernetes.io/batch-memory: "10Gi" requests: kubernetes.io/batch-cpu: "50k" kubernetes.io/batch-memory: "10Gi" schedulerName: default-scheduler -
Implante o pod:
kubectl apply -f be-pod-demo.yaml -
Verifique se os limites de recursos estão refletidos no cgroup do nó. Confira o limite de CPU:
cat /sys/fs/cgroup/cpu,cpuacct/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8_042d_471c_b6ef_b7e0686a****.slice/cri-containerd-11111c202adfefdd63d7d002ccde8907d08291e706671438c4ccedfecba5****.scope/cpu.cfs_quota_usSaída esperada (50 cores):
5000000Confira o limite de memória:
cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8_042d_471c_b6ef_b7e0686a****.slice/cri-containerd-11111c202adfefdd63d7d002ccde8907d08291e706671438c4ccedfecba5****.scope/memory.limit_in_bytesSaída esperada (10 GB):
10737418240
Monitorar o uso de recursos Batch
Clusters ACK integram-se ao Managed Service for Prometheus. Para visualizar o uso de recursos Batch:
Faça login no console do ACK. No painel de navegação à esquerda, clique em console do ACKClusters.
Na página Clusters, clique no nome do cluster desejado. No painel à esquerda, escolha Operations > Prometheus Monitoring.
Clique na aba Others e, em seguida, na aba k8s-reclaimed-resource. Este painel mostra a receita mista do cluster e a capacidade de recursos nos níveis de cluster, nó e pod. Para mais informações, consulte Ativar o recurso de monitoramento de colocation.
Se você criou um painel personalizado do Prometheus, use as seguintes métricas para consultar dados de recursos Batch:
# Allocatable batch-cpu on the node
koordlet_node_resource_allocatable{resource="kubernetes.io/batch-cpu",node="$node"}
# batch-cpu already allocated on the node
koordlet_container_resource_requests{resource="kubernetes.io/batch-cpu",node="$node"}
# Allocatable batch-memory on the node
kube_node_status_allocatable{resource="kubernetes.io/batch-memory",node="$node"}
# batch-memory already allocated on the node
koordlet_container_resource_requests{resource="kubernetes.io/batch-memory",node="$node"}
Perguntas frequentes
Após atualizar do ack-slo-manager para o ack-koordinator, a configuração antiga de overcommitment ainda funciona?
Sim. O ack-koordinator é compatível com versões anteriores do protocolo ack-slo-manager. O agendador do cluster ACK Pro consegue calcular recursos solicitados e disponíveis usando os formatos de protocolo antigo e novo simultaneamente, permitindo a atualização sem reconfigurar cargas de trabalho existentes.
O protocolo anterior utiliza:
A anotação de pod
alibabacloud.com/qosClassO campo
alibabacloud.com/reclaimedpara solicitações e limites de recursos
O ack-koordinator oferece suporte a esses itens por meio de versões de protocolo datadas de até 30 de julho de 2023. Migre as cargas de trabalho existentes para o protocolo koordinator.sh quando for conveniente.
A tabela a seguir mostra a compatibilidade entre versões de componentes:
|
Versão do agendador |
ack-koordinator |
Protocolo alibabacloud.com |
Protocolo koordinator.sh |
|
≥1.18 e <1.22.15-ack-2.0 |
≥0.3.0 |
Suportado |
Não suportado |
|
≥1.22.15-ack-2.0 |
≥0.8.0 |
Suportado |
Suportado |
Por que o uso de memória aumenta abruptamente logo após o início do pod?
Sintoma: O uso de memória salta imediatamente após o início de um contêiner, excedendo o limite esperado de kubernetes.io/batch-memory.
Causa: Quando um contêiner é criado, o ack-koordinator define o limite de memória do cgroup com base em kubernetes.io/batch-memory. Algumas aplicações leem o limite do cgroup na inicialização para determinar quanta memória alocar internamente. Se a aplicação ler o cgroup antes que o ack-koordinator tenha gravado o limite, ela poderá alocar mais memória do que o pretendido. O sistema operacional não recupera essa memória imediatamente, então o uso permanece elevado até cair naturalmente abaixo do limite configurado.
Verificação: Execute o seguinte comando dentro do contêiner para confirmar se o limite de memória está definido corretamente:
# Unit: bytes
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# Expected output example
1048576000
Correção: Configure o limite de memória da aplicação em seu script de inicialização antes que o processo principal comece. Isso garante que o limite esteja definido antes que a aplicação leia o cgroup.
Por que um pod BestEffort permanece no estado Pending?
Sintoma: Um pod configurado com recursos Batch permanece no estado Pending e não pode ser agendado.
Verificação: Execute kubectl describe pod <pod-name> e procure eventos de falha de agendamento.
Causas comuns e correções:
|
Causa |
Correção |
|
Recursos Batch insuficientes em todos os nós |
Execute |
|
O kubelet ainda não sincronizou o status do nó |
Exclua e recrie o pod. O ack-koordinator ajusta dinamicamente a capacidade Batch, e o kubelet pode demorar para relatar os recursos alocáveis atualizados. |
|
O pod está solicitando recursos Batch e padrão simultaneamente |
Um pod não pode solicitar recursos Batch e recursos padrão ao mesmo tempo. Remova um dos conjuntos de campos de recursos. |
Próximos passos
O ack-koordinator fornece controles adicionais para proteger cargas de trabalho online contra interferências causadas por pods BestEffort. Consulte os seguintes tópicos: