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:
Um cluster ACK gerenciado Pro foi criado.
O kubectl está conectado ao cluster.
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
replicassuficientes 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 |
|
Deschedule |
|
Pods violam regras de anti-afinidade entre pods |
|
Deschedule |
|
Pods deixam de satisfazer regras de afinidade de nó |
|
Deschedule |
|
Pods reiniciam com frequência excessiva |
|
Deschedule |
|
Pods excederam seu tempo de vida (TTL) |
|
Deschedule |
|
Pods estão no estado Failed |
|
Deschedule |
|
Pods replicados estão distribuídos de forma desigual pelos nós |
|
Balance |
|
Nós apresentam utilização desigual na alocação de recursos |
|
Balance |
|
Pods violam restrições de distribuição de topologia |
|
Balance |
|
Nós estão sobrecarregados devido à utilização real de recursos |
|
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. Comodeschedule=not-allowconsta emexcludedTaints, 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 taintNoSchedule).
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.
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, clique em Add-ons.
Localize o ack-koordinator e clique em Install.
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 |
|
|
list(string) |
— |
Chaves de taint ou pares |
|
|
bool |
false |
Quando verdadeiro, verifica também taints com efeito |
|
|
list(string) |
— |
Restringe o desescalonamento a namespaces específicos. Mutuamente exclusivo com |
|
|
list(string) |
— |
Ignora o desescalonamento em namespaces específicos. Mutuamente exclusivo com |
|
|
map |
— |
Restringe o desescalonamento a pods que correspondem aos rótulos especificados. |
Aplique a configuração
-
Aplique o ConfigMap no cluster:
kubectl apply -f koord-descheduler-config.yaml -
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
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 |
|
|
boolean |
true / false (padrão: false) |
Modo somente leitura. Quando ativado, nenhum pod é migrado. |
false |
|
|
time.Duration |
>0s |
Frequência de execução do desescalonador. |
120s |
|
|
Structure |
— |
Limita quais nós são elegíveis para desescalonamento. Aceita |
Veja o exemplo YAML acima |
|
|
int |
≥0 (padrão: 0) |
Máximo de pods evacuados de um único nó por ciclo de desescalonamento. 0 significa sem limite. |
10 |
|
|
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 camponameao nome do plug-in e configureargs. 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 |
|
|
|
Todos desativados por padrão. Especifique os plug-ins a serem ativados. |
|
|
|
Todos desativados por padrão. Especifique os plug-ins a serem ativados. |
|
|
|
O evacuador de pods. O |
|
|
|
Política de filtragem pré-evacuação. O |
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 |
Evacua pods que violam regras de anti-afinidade entre pods. |
|
|
Deschedule |
Evacua pods que não satisfazem mais as regras de afinidade de nó. |
|
|
Deschedule |
Evacua pods incapazes de tolerar taints de nó. |
|
|
Deschedule |
Evacua pods que reiniciam com muita frequência. |
|
|
Deschedule |
Evacua pods cujo TTL expirou. |
|
|
Deschedule |
Evacua pods no estado Failed. |
|
|
Balance |
Distribui pods replicados uniformemente pelos nós. |
|
|
Balance |
Redistribui pods com base na alocação de recursos dos nós. |
|
|
Balance |
Consolida pods de nós subutilizados para nós com maior utilização. |
|
|
Balance |
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 |
|
|
boolean |
true / false (padrão: false) |
Quando falso, pods usando |
false |
|
|
int64 |
≥0 (padrão: 2) |
Máximo de pods migrados simultaneamente em um nó. 0 significa sem limite. |
2 |
|
|
int64 |
≥0 (padrão: 0) |
Máximo de pods migrados simultaneamente em um namespace. 0 significa sem limite. |
1 |
|
|
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% |
|
|
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% |
|
|
Structure |
|
Limita a taxa de migração no nível de workload dentro de uma janela de tempo. |
|
|
|
string |
|
Controla como os pods são evacuados. |
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
Desescalonamento — conceitos, recursos e fluxo de trabalho.
Está usando o Kubernetes Descheduler da comunidade? Consulte Koordinator Descheduler e Kubernetes Descheduler para entender as diferenças e o processo de migração.
Configure o desescalonamento ciente de carga com
LowNodeLoad: Trabalhar com desescalonamento de hotspots ciente de carga.Analise o uso de recursos do cluster e obtenha recomendações de economia de custos: Cost Insight.
Solução de problemas: Perguntas frequentes sobre agendamento.
Notas de versão e visão geral dos componentes: ack-koordinator (ack-slo-manager).