Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Ativar overcommitment dinâmico de recursos

Última atualização: Jun 27, 2026

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:

image

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

image

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

requests == limits para todos os contêineres

Serviços de produção sensíveis à latência

Burstable

requests < limits para pelo menos um contêiner

Cargas de trabalho online gerais

BestEffort

Sem requests ou limits — use recursos Batch em vez disso

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 valores cpuReclaimThresholdPercent e memoryReclaimThresholdPercent neste 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

enable

Booleano

false

Ativa atualizações dinâmicas de recursos Batch. Definir como false redefine os recursos recuperáveis para 0.

metricAggregateDurationSeconds

Inteiro

60

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.

cpuReclaimThresholdPercent

Inteiro

65

Limiar de recuperação para recursos batch-cpu, como porcentagem da CPU alocável. Consulte Calcular capacidade de recursos Batch.

memoryReclaimThresholdPercent

Inteiro

65

Limiar de recuperação para recursos batch-memory, como porcentagem da memória alocável. Consulte Calcular capacidade de recursos Batch.

memoryCalculatePolicy

String

"usage"

Método de cálculo da capacidade batch-memory. "usage": inclui recursos não alocados e recursos alocados, mas ociosos (com base no uso real de pods Guaranteed e Burstable). "request": inclui apenas recursos não alocados (com base nas solicitações de memória de pods Guaranteed e Burstable).

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

nodeAllocatable

Total de CPU ou memória alocável no nó

thresholdPercent

Porcentagem configurada do limiar de recuperação

podUsage(non-BE)

Uso real de recursos de pods Guaranteed e Burstable

podRequest(non-BE)

Soma das solicitações de recursos para pods Guaranteed e Burstable

systemUsage

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 patch para 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.

Importante
  • 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ó.

  1. Verifique os recursos Batch disponíveis no nó:

    kubectl get node $nodeName -o yaml

    Saída esperada:

    status:
      allocatable:
        kubernetes.io/batch-cpu: 50000
        kubernetes.io/batch-memory: 53687091200
  2. 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
  3. Implante o pod:

    kubectl apply -f be-pod-demo.yaml
  4. 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_us

    Saída esperada (50 cores):

    5000000

    Confira 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_bytes

    Saí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:

  1. Faça login no console do ACK. No painel de navegação à esquerda, clique em console do ACKClusters.

  2. Na página Clusters, clique no nome do cluster desejado. No painel à esquerda, escolha Operations > Prometheus Monitoring.

  3. 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/qosClass

  • O campo alibabacloud.com/reclaimed para 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 kubectl get node <node> -o yaml e verifique status.allocatable para batch-cpu e batch-memory. Reduza as solicitações do pod ou aguarde a recuperação de recursos.

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: