Para agendar uma aplicação em nós com configuração específica, defina rótulos no node pool e configure nodeSelector ou nodeAffinity na especificação do pod da aplicação.
Escolha um método de agendamento
|
Método |
Como funciona |
Quando usar |
|
|
Correspondência exata de rótulo |
Agendamento simples, de condição única |
|
|
Expressões de rótulo com regras rígidas e flexíveis |
Agendamento com múltiplas condições ou quando é necessário comportamento de fallback |
Como funciona
O ACK utiliza o mecanismo nativo de agendamento do Kubernetes para associar pods a nós com base em rótulos. O processo ocorre da seguinte forma:
-
Defina os rótulos do node pool. Um node pool gerencia um grupo de nós com a mesma configuração. Ao configurar Node Labels para um node pool, o ACK sincroniza esses rótulos com todos os nós do pool, incluindo novos nós adicionados durante o scale-out.
Após abrir a Configuração do Node Pool e selecione Update Labels and Taints of Existing Nodes , o ACK também sincroniza os rótulos com os nós existentes.
Defina uma regra de agendamento. Na especificação do pod, use nodeSelector ou nodeAffinity para especificar os rótulos obrigatórios nos nós de destino.
(Opcional) Configure acesso exclusivo. Adicione um taint ao node pool para que apenas pods com uma toleration correspondente sejam agendados nele.
Agendamento automático. O scheduler do Kubernetes posiciona os pods nos nós que satisfazem as regras acima.
O ACK cria automaticamente um rótulo globalmente único, alibabacloud.com/nodepool-id , para cada node pool. Use esse rótulo para direcionar um node pool específico com correspondência exata.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster ACK com pelo menos um node pool
kubectlconfigurado para se conectar ao seu cluster
Etapa 1: Definir rótulos em um node pool
Faça logon no console do ACK. No painel de navegação à esquerda, clique em ACK consoleClusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Nodes > Node Pools.
-
Na coluna Actions do node pool desejado, clique em Edit. Expanda a seção de opções avançadas e configure Node Labels:
Campo
Requisito
Detalhes
Key (parte do nome)
Obrigatório
1–63 caracteres; começa e termina com
[a-z0-9A-Z]; permite letras, dígitos, hifens (-), sublinhados (_) e pontos (.)Key (parte do prefixo)
Opcional
Um subdomínio DNS de até 253 caracteres, terminando com
/. O prefixokubernetes.io/é reservado — usekubelet.kubernetes.io/ounode.kubernetes.io/em seu lugar.Value
Opcional
Até 63 caracteres; começa e termina com
[a-z0-9A-Z]; permite letras, dígitos, hifens, sublinhados e pontos Se necessário, selecione Update Labels and Taints of Existing Nodes para sincronizar os rótulos com os nós que já estão no pool.
No painel de navegação à esquerda, escolha Nodes > Nodes. Clique em Manage Labels and Taints e verifique os rótulos na aba Labels.
Etapa 2: Configurar uma regra de agendamento
Após definir os rótulos do node pool, configure nodeSelector ou nodeAffinity na especificação do pod do seu Deployment.
Opção 1: nodeSelector
O nodeSelector agenda pods em nós que possuem correspondência exata de rótulo. Esta é a opção mais simples entre as duas.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-basic
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
pod: nginx # The node must have this label for the pod to be scheduled there.
containers:
- name: nginx
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
ports:
- containerPort: 80
# Declare resource requests and limits in production to guarantee Quality of Service (QoS).
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
Opção 2: nodeAffinity
O nodeAffinity suporta expressões de rótulo (como In, NotIn e Exists) e dois modos de agendamento:
Afinidade rígida (
requiredDuringSchedulingIgnoredDuringExecution): O pod deve ser colocado em um nó correspondente. Se não houver correspondência, o pod permanece em Pending.Afinidade flexível (
preferredDuringSchedulingIgnoredDuringExecution): O scheduler prioriza nós correspondentes, mas recorre a qualquer nó disponível caso nenhuma correspondência seja encontrada.
O exemplo a seguir usa afinidade rígida para garantir que o pod execute em um nó com o rótulo pod: nginx:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-with-affinity
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
# Hard affinity: the pod is not scheduled if no node matches.
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: pod # The node label key
operator: In
values:
- nginx # The node label value
containers:
- name: nginx-with-affinity
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
ports:
- containerPort: 80
# Declare resource requests and limits in production to guarantee Quality of Service (QoS).
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
Etapa 3: Implantar e verificar
-
Aplique o Deployment:
kubectl apply -f deployment.yaml -
Verifique o status do pod e o resultado do agendamento. A flag
-o widemostra em qual nó cada pod foi agendado:kubectl get pods -l app=nginx -o wideVerifique na saída se o pod foi agendado no nó de destino.
Próximos passos
Para definir rótulos em nós individuais e obter um agendamento mais granular, consulte Gerenciar rótulos de nó.
Caso um pod permaneça em Pending após a aplicação da regra de agendamento, consulte Solucionar problemas de exceções de pod.
Para opções avançadas de agendamento — incluindo scale-out sequencial e agendamento consciente de carga — consulte Políticas de agendamento fornecidas pelo ACK.
Se a afinidade rígida não encontrar nós correspondentes, o ACK poderá realizar scale-out automaticamente de nós a partir de um node pool que possua os rótulos correspondentes e o auto scaling ativado.
Para clusters criados antes da introdução dos node pools, consulte Migrar nós não gerenciados para um node pool.