Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Enable the descheduling feature

Última atualização: Jun 27, 2026

Ative o Koordinator Descheduler para evacuar e rebalancear pods automaticamente quando houver alterações em taints de nós, regras de afinidade ou perfis de carga.

O procedimento a seguir usa o plug-in RemovePodsViolatingNodeTaints como exemplo.

Pré-requisitos

Verifique se:

O desescalonamento não tem suporte em nós virtuais.

Observações de uso

  • O Koordinator Descheduler apenas evacua pods, sem recriá-los. O controlador de workload (como um Deployment ou StatefulSet) recria os pods evacuados e o agendador padrão os posiciona.

  • Os pods antigos são evacuados antes da criação dos novos. Garanta que sua aplicação tenha replicas suficientes para manter a disponibilidade durante a evacuação.

  • O ack-descheduler foi descontinuado. Caso ainda o utilize, consulte Como migrar do ack-descheduler para o Koordinator Descheduler?

Escolha um plug-in de desescalonamento

Selecione o plug-in adequado ao seu cenário:

Cenário

Plug-in

Tipo de política

Pods permanecem em nós que receberam uma taint NoSchedule após o agendamento

RemovePodsViolatingNodeTaints

Deschedule

Pods violam regras de anti-afinidade entre pods

RemovePodsViolatingInterPodAntiAffinity

Deschedule

Pods deixam de satisfazer regras de afinidade de nó

RemovePodsViolatingNodeAffinity

Deschedule

Pods reiniciam com frequência excessiva

RemovePodsHavingTooManyRestarts

Deschedule

Pods excederam seu tempo de vida (TTL)

PodLifeTime

Deschedule

Pods estão no estado Failed

RemoveFailedPod

Deschedule

Pods replicados estão distribuídos de forma desigual pelos nós

RemoveDuplicates

Balance

Nós apresentam utilização desigual na alocação de recursos

LowNodeUtilization

Balance

Pods violam restrições de distribuição de topologia

RemovePodsViolatingTopologySpreadConstraint

Balance

Nós estão sobrecarregados devido à utilização real de recursos

LowNodeLoad

Balance

Os exemplos abaixo usam o RemovePodsViolatingNodeTaints. Leia os conceitos de desescalonamento e a comparação entre Koordinator Descheduler e Kubernetes Descheduler antes de iniciar.

Como funciona

O plug-in RemovePodsViolatingNodeTaints verifica periodicamente se há taints NoSchedule em cada nó, conforme o intervalo configurado. Se um pod em execução não tiver tolerância para a taint NoSchedule do nó, o plug-in o evacua. O controlador de workload recria o pod e o agendador o posiciona em um nó tolerável.

Use excludedTaints para isentar taints específicas. Quando a chave de uma taint ou o par key=value corresponder a uma entrada em excludedTaints, o plug-in a ignora.

Exemplo de cenário:

Um cluster com três nós executa um Deployment com um pod por nó. Um administrador adiciona taints NoSchedule a dois nós após a implantação:

  • O Nó A recebe deschedule=not-allow:NoSchedule. Como deschedule=not-allow consta em excludedTaints, essa taint é ignorada e o pod permanece.

  • O Nó B recebe deschedule=allow:NoSchedule. Essa taint não está excluída, portanto o pod é evacuado e reagendado para o Nó C (que não possui taint NoSchedule).

Etapa 1: Instale o ack-koordinator e ative o desescalonamento

Se o ack-koordinator já estiver instalado, verifique se a versão é 1.2.0-ack.2 ou superior.
  1. Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.

  2. Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, clique em Add-ons.

  3. Localize o ack-koordinator e clique em Install.

  4. Na caixa de diálogo de instalação, selecione Enable Descheduler for ACK-Koordinator e conclua a instalação.

O Koordinator Descheduler é implantado como um Deployment nos nós do cluster.

Etapa 2: Ative o plug-in RemovePodsViolatingNodeTaints

Configure o plug-in

Crie um arquivo chamado koord-descheduler-config.yaml. Este ConfigMap ativa o RemovePodsViolatingNodeTaints e exclui a taint deschedule=not-allow.

# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: koord-descheduler-config
  namespace: kube-system
data:
  koord-descheduler-config: |
    # Do not modify the following system configuration of koord-desheduler.
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    leaderElection:
      resourceLock: leases
      resourceName: koord-descheduler
      resourceNamespace: kube-system
    deschedulingInterval: 120s # The interval at which the descheduler runs. Set to 120 seconds here.
    dryRun: false # The global read-only mode. After you enable this mode, koord-descheduler does not perform any operations.
    # The preceding configuration is the system configuration.

    profiles:
    - name: koord-descheduler
      plugins:
        deschedule:
          enabled:
            - name: RemovePodsViolatingNodeTaints  # Enable the node taint verification plug-in.

      pluginConfig:
      - name: RemovePodsViolatingNodeTaints # Configure the node taint verification plug-in.
        args:
          excludedTaints:
          - deschedule=not-allow # Ignore nodes whose taint key is deschedule and taint value is not-allow.

      # Required for RemovePodsViolatingNodeTaints to take effect. Do not remove.
      - name: MigrationController # Configure the migration controller.
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly

Parâmetros do RemovePodsViolatingNodeTaints:

Parâmetro

Tipo

Padrão

Descrição

excludedTaints

list(string)

Chaves de taint ou pares key=value a serem ignorados. Pods em nós com essas taints não são evacuados.

includePreferNoSchedule

bool

false

Quando verdadeiro, verifica também taints com efeito PreferNoSchedule, além de NoSchedule.

namespaces.include

list(string)

Restringe o desescalonamento a namespaces específicos. Mutuamente exclusivo com namespaces.exclude.

namespaces.exclude

list(string)

Ignora o desescalonamento em namespaces específicos. Mutuamente exclusivo com namespaces.include.

labelSelector

map

Restringe o desescalonamento a pods que correspondem aos rótulos especificados.

Aplique a configuração

  1. Aplique o ConfigMap no cluster:

    kubectl apply -f koord-descheduler-config.yaml
  2. Reinicie o Koordinator Descheduler para carregar a nova configuração:

    kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0
    # Expected output:
    # deployment.apps/ack-koord-descheduler scaled
    kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1
    # Expected output:
    # deployment.apps/ack-koord-descheduler scaled

Etapa 3: Verifique o desescalonamento

Este exemplo usa um cluster com três nós.

  1. Crie um arquivo chamado stress-demo.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stress-demo
      namespace: default
      labels:
        app: stress-demo
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: stress-demo
      template:
        metadata:
          name: stress-demo
          labels:
            app: stress-demo
        spec:
          containers:
            - args:
                - '--vm'
                - '2'
                - '--vm-bytes'
                - '1600M'
                - '-c'
                - '2'
                - '--vm-hang'
                - '2'
              command:
                - stress
              image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
              imagePullPolicy: Always
              name: stress
              resources:
                limits:
                  cpu: '2'
                  memory: 4Gi
                requests:
                  cpu: '2'
                  memory: 4Gi
          restartPolicy: Always
  2. Implante o workload de teste:

    kubectl create -f stress-demo.yaml
  3. Aguarde até que os pods atinjam o estado Running:

    kubectl get pod -o wide

    Saída esperada:

    NAME                         READY   STATUS    RESTARTS   AGE    IP              NODE                        NOMINATED NODE   READINESS GATES
    stress-demo-5f6cddf9-9****   1/1     Running   0          10s    192.XX.XX.27   cn-beijing.192.XX.XX.247   <none>           <none>
    stress-demo-5f6cddf9-h****   1/1     Running   0          10s    192.XX.XX.20   cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Running   0          10s    192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
  4. Adicione taints NoSchedule a dois nós:

    • Adicione deschedule=not-allow:NoSchedule ao nó cn-beijing.192.XX.XX.247 (excluído por excludedTaints — o pod deve permanecer):

      kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoSchedule

      Saída esperada:

      node/cn-beijing.192.XX.XX.247 tainted
    • Adicione deschedule=allow:NoSchedule ao nó cn-beijing.192.XX.XX.248 (não excluído — o pod deve ser evacuado):

      kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoSchedule

      Saída esperada:

      node/cn-beijing.192.XX.XX.248 tainted
  5. Monitore as alterações nos pods. O desescalonador verifica as taints a cada deschedulingInterval (120 segundos):

    kubectl get pod -o wide -w

    Saída esperada:

    NAME                         READY   STATUS              RESTARTS   AGE     IP             NODE                    NOMINATED NODE   READINESS GATES
    stress-demo-5f6cddf9-9****   1/1     Running             0          5m34s   192.XX.XX.27   cn-beijing.192.XX.XX.247   <none>           <none>
    stress-demo-5f6cddf9-h****   1/1     Running             0          5m34s   192.XX.XX.20   cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Running             0          5m34s   192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Terminating         0          7m58s   192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
    stress-demo-5f6cddf9-j****   0/1     ContainerCreating   0          0s      <none>         cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-j****   1/1     Running             0          2s      192.XX.XX.32   cn-beijing.192.XX.XX.249   <none>           <none>

    A saída confirma que:

    • O pod em cn-beijing.192.XX.XX.248 (taint deschedule=allow:NoSchedule, não excluída) foi evacuado.

    • O pod em cn-beijing.192.XX.XX.247 (taint deschedule=not-allow:NoSchedule, excluída) continua em execução.

    • O pod evacuado foi reagendado para cn-beijing.192.XX.XX.249, que não possui taint NoSchedule.

  6. Verifique os eventos de evacuação do pod removido:

    kubectl get event | grep stress-demo-5f6cddf9-v****

    Saída esperada:

    3m24s       Normal    Evicting            podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798****   Pod "default/stress-demo-5f6cddf9-v****" evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints"
    2m51s       Normal    EvictComplete       podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798****   Pod "default/stress-demo-5f6cddf9-v****" has been evicted
    3m24s       Normal    Descheduled         pod/stress-demo-5f6cddf9-v****                         Pod evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints"
    3m24s       Normal    Killing             pod/stress-demo-5f6cddf9-v****                         Stopping container stress

    Cada evento corresponde a uma fase do ciclo de vida da migração:

    Evento

    Origem

    Significado

    Evicting

    PodMigrationJob

    O desescalonador iniciou um job de migração para evacuar o pod.

    Descheduled

    Pod

    O pod recebeu o sinal de evacuação.

    Killing

    Pod

    O runtime de contêineres interrompe o contêiner.

    EvictComplete

    PodMigrationJob

    O pod foi totalmente evacuado. O controlador de workload o recria.

    O pod em cn-beijing.192.XX.XX.248 não tinha tolerância para a taint deschedule=allow:NoSchedule (não presente em excludedTaints), por isso foi evacuado.

Configure parâmetros avançados

Defina o comportamento global e as configurações de modelo por meio de um ConfigMap.

Exemplo de configuração avançada

Este ConfigMap usa DeschedulerConfiguration para definições globais, habilita o RemovePodsViolatingNodeTaints como política de desescalonamento e usa o MigrationController como evacuador.

# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: koord-descheduler-config
  namespace: kube-system
data:
  koord-descheduler-config: |
    # Do not modify the following system configuration of koord-desheduler.
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    leaderElection:
      resourceLock: leases
      resourceName: koord-descheduler
      resourceNamespace: kube-system
    dryRun: false # The global read-only mode. After you enable this mode, koord-descheduler does not perform any operations.
    deschedulingInterval: 120s # The interval at which the descheduler runs. The interval is set to 120 seconds in this example.
    nodeSelector: # The nodes that are involved in descheduling. By default, all nodes are descheduled.
      matchLabels:
        alibabacloud.com/nodepool-id: nodepool-1 # Configure it based on your requirements.
    maxNoOfPodsToEvictPerNode: 10 # The maximum number of pods that can be evicted from a node. The limit takes effect on a global scale. By default, no limit is configured.
    maxNoOfPodsToEvictPerNamespace: 10 # The maximum number of pods that can be evicted from a namespace. The limit takes effect on a global scale. By default, no limit is configured.
    # The preceding configuration is the system configuration.

    # The template list.
    profiles:
    - name: koord-descheduler # The name of the template.

      # Scope: apply this template only to the specified nodes.
      # Method 1: Select nodes in one node pool.
      nodeSelector:
        matchLabels:
          alibabacloud.com/nodepool-id: nodepool-1 # Configure it based on your requirements
      # Method 2: Select nodes in multiple node pools.
      # nodeSelector:
      #   matchExpressions:
      #   - key: alibabacloud.com/nodepool-id
      #     operator: In
      #     values:
      #     - nodepool-1
      #     - nodepool-2

      plugins:
        deschedule: # All plug-ins are disabled by default. Specify the ones to enable.
          enabled:
            - name: RemovePodsViolatingNodeTaints  # Enable the node taint verification plug-in.
        balance: # All plug-ins are disabled by default.
          disabled:
            - name: "*" # Disable all Balance plug-ins.
        evict:
          enabled:
            - name: MigrationController # MigrationController is enabled by default.
        filter:
          enabled:
            - name: MigrationController # Use MigrationController's filtering policy by default.

      pluginConfig:
      - name: RemovePodsViolatingNodeTaints
        args:
          excludedTaints:
          - deschedule=not-allow # Ignore nodes whose taint key is deschedule and taint value is not-allow.
          - reserved # Ignore nodes whose taint key is reserved.
          includePreferNoSchedule: false # When false, only checks NoSchedule taints.
          namespaces:
            include: # Restrict descheduling to these namespaces.
              - "namespace1"
              - "namespace2"
            # exclude: # Alternatively, exclude these namespaces.
            #   - "namespace1"
            #   - "namespace2"
          labelSelector: # Only deschedule pods matching these labels.
            accelerator: nvidia-tesla-p100

      - name: MigrationController
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly
          evictLocalStoragePods: false # When false, pods using emptyDir or hostPath are not descheduled.
          maxMigratingPerNode: 1 # Maximum pods migrated simultaneously on a node.
          maxMigratingPerNamespace: 1  # Maximum pods migrated simultaneously in a namespace.
          maxMigratingPerWorkload: 1 # Maximum pods migrated simultaneously in a workload.
          maxUnavailablePerWorkload: 2 # Maximum unavailable replicated pods allowed in a workload.
          objectLimiters:
            workload: # Throttle workload-level migration. Default: only 1 pod per workload within 5 minutes.
              duration: 5m
              maxMigrating: 1
          evictionPolicy: Eviction # Use the Eviction API by default.

Configurações de sistema

Configure o comportamento global e de nível de sistema em DeschedulerConfiguration.

Parâmetro

Tipo

Valor válido

Descrição

Exemplo

dryRun

boolean

true / false (padrão: false)

Modo somente leitura. Quando ativado, nenhum pod é migrado.

false

deschedulingInterval

time.Duration

>0s

Frequência de execução do desescalonador.

120s

nodeSelector

Structure

Limita quais nós são elegíveis para desescalonamento. Aceita matchLabels (um node pool) ou matchExpressions (vários node pools). Consulte Kubernetes labelSelector.

Veja o exemplo YAML acima

maxNoOfPodsToEvictPerNode

int

≥0 (padrão: 0)

Máximo de pods evacuados de um único nó por ciclo de desescalonamento. 0 significa sem limite.

10

maxNoOfPodsToEvictPerNamespace

int

≥0 (padrão: 0)

Máximo de pods evacuados de um único namespace por ciclo de desescalonamento. 0 significa sem limite.

10

Configurações de modelo

Cada modelo (profiles) agrupa políticas de desescalonamento e evacuadores com os seguintes campos:

  • name: Identificador do modelo.

  • plugins: Ativa ou desativa políticas de desescalonamento (deschedule, balance), evacuadores (evict) e filtros pré-evacuação (filter).

  • pluginConfig: Argumentos por plug-in. Corresponda o campo name ao nome do plug-in e configure args. Consulte Configurar plug-ins de política e Configurar plug-ins de evacuador.

  • nodeSelector: Restringe o modelo a nós específicos. Se não definido, aplica-se a todos os nós.

O uso de nodeSelector no nível de modelo requer ack-koordinator v1.6.1-ack.1.16 ou superior.

Referência do campo plugins:

Campo

Plug-ins suportados

Descrição

deschedule

RemovePodsViolatingNodeTaints, RemovePodsViolatingInterPodAntiAffinity, RemovePodsViolatingNodeAffinity, RemovePodsHavingTooManyRestarts, PodLifeTime, RemoveFailedPod

Todos desativados por padrão. Especifique os plug-ins a serem ativados.

balance

RemoveDuplicates, LowNodeUtilization, HighNodeUtilization, RemovePodsViolatingTopologySpreadConstraint, LowNodeLoad

Todos desativados por padrão. Especifique os plug-ins a serem ativados.

evict

MigrationController, DefaultEvictor

O evacuador de pods. O MigrationController vem ativado por padrão. Não ative múltiplos plug-ins de evict simultaneamente.

filter

MigrationController, DefaultEvictor

Política de filtragem pré-evacuação. O MigrationController vem ativado por padrão. Não ative múltiplos plug-ins de filter simultaneamente.

Configure plug-ins de política

O Koordinator Descheduler oferece suporte a seis plug-ins de Deschedule e cinco de Balance do Kubernetes Descheduler. O LowNodeLoad é fornecido pelo Koordinator. Consulte Trabalhar com desescalonamento de hotspots ciente de carga.

Tipo de política

Plug-in

Descrição

Deschedule

RemovePodsViolatingInterPodAntiAffinity

Evacua pods que violam regras de anti-afinidade entre pods.

Deschedule

RemovePodsViolatingNodeAffinity

Evacua pods que não satisfazem mais as regras de afinidade de nó.

Deschedule

RemovePodsViolatingNodeTaints

Evacua pods incapazes de tolerar taints de nó.

Deschedule

RemovePodsHavingTooManyRestarts

Evacua pods que reiniciam com muita frequência.

Deschedule

PodLifeTime

Evacua pods cujo TTL expirou.

Deschedule

RemoveFailedPod

Evacua pods no estado Failed.

Balance

RemoveDuplicates

Distribui pods replicados uniformemente pelos nós.

Balance

LowNodeUtilization

Redistribui pods com base na alocação de recursos dos nós.

Balance

HighNodeUtilization

Consolida pods de nós subutilizados para nós com maior utilização.

Balance

RemovePodsViolatingTopologySpreadConstraint

Evacua pods que violam restrições de distribuição de topologia.

Configure plug-ins de evacuador

O Koordinator Descheduler oferece suporte a dois plug-ins de evacuador: DefaultEvictor e MigrationController.

MigrationController

O MigrationController fornece controle granular de evacuação e observabilidade por meio de jobs de migração.

Parâmetro

Tipo

Valor válido

Descrição

Exemplo

evictLocalStoragePods

boolean

true / false (padrão: false)

Quando falso, pods usando emptyDir ou hostPath não sofrem desescalonamento.

false

maxMigratingPerNode

int64

≥0 (padrão: 2)

Máximo de pods migrados simultaneamente em um nó. 0 significa sem limite.

2

maxMigratingPerNamespace

int64

≥0 (padrão: 0)

Máximo de pods migrados simultaneamente em um namespace. 0 significa sem limite.

1

maxMigratingPerWorkload

intOrString

≥0 (padrão: 10%)

Máximo de pods ou porcentagem migrados simultaneamente em um workload. 0 significa sem limite. Se um workload tiver apenas um pod, ele fica excluído do desescalonamento.

1 ou 10%

maxUnavailablePerWorkload

intOrString

≥0 e < contagem de réplicas (padrão: 10%)

Máximo de pods replicados indisponíveis permitidos em um workload. 0 significa sem limite.

1 ou 10%

objectLimiters.workload

Structure

Duration >0 (padrão: 5m); MaxMigrating ≥0 (padrão: 10%)

Limita a taxa de migração no nível de workload dentro de uma janela de tempo. Duration define a duração da janela. MaxMigrating define o máximo de pods migrados nessa janela.

duration: 5mmaxMigrating: 1

evictionPolicy

string

Eviction (padrão), Delete, Soft

Controla como os pods são evacuados. Eviction: chama a API Eviction para evacuação graceful. Delete: chama a API Delete. Soft: adiciona a anotação scheduling.koordinator.sh/soft-eviction para tratamento personalizado downstream.

Eviction

DefaultEvictor

O DefaultEvictor é o evacuador padrão do Kubernetes Descheduler. Consulte DefaultEvictor para detalhes de configuração.

MigrationController vs. DefaultEvictor

Capacidade

DefaultEvictor

MigrationController

Métodos de evacuação

Apenas API Eviction

API Eviction, API Delete ou anotação Soft

Limite de evacuação por nó

Suportado

Suportado

Limite de evacuação por namespace

Suportado

Suportado

Limite de evacuação por workload

Não suportado

Suportado

Limite de indisponibilidade por workload

Não suportado

Suportado

Controle de taxa de evacuação

Não suportado

Controle baseado em janela de tempo por workload

Observabilidade da evacuação

Apenas logs do componente

Logs do componente e eventos do Kubernetes com status de migração por pod

Próximos passos