Use tolerâncias e afinidade de nó para agendar pods no Elastic Compute Service (ECS), no ECI ou em ambos, com fallback baseado em prioridade.
Conceitos principais
Taint: regra aplicada a um nó que impede o agendamento de determinados pods nele.
Toleration: configuração no pod que permite ignorar as taints de um nó.
-
Afinidade de nó: propriedade do pod que o atrai para nós com rótulos específicos. Existem dois tipos:
requiredDuringSchedulingIgnoredDuringExecution: requisito obrigatório. Os pods são agendados apenas em nós correspondentes.preferredDuringSchedulingIgnoredDuringExecution: preferência opcional. O agendador tenta atender à regra, mas agenda o pod em outro local caso não encontre correspondência.
Consulte Taints e Tolerations e Afinidade de nó.
Pré-requisitos
Um cluster ACK gerenciado Pro executando Kubernetes v1.22 ou superior.
Versão 2.10.0 ou superior do add-on ack-virtual-node (consulte Virtual nodes).
-
Versão 5,9 ou superior do componente kube-scheduler, com a política de agendamento de nó virtual ativada.
Na página Add-ons, localize Kube Scheduler, clique em Configuration e confirme se Enable Virtual Node-based Pod Scheduling está selecionado.
Exemplos de configuração
Os nós virtuais em clusters ACK têm a taint virtual-kubelet.io/provider=alibabacloud:NoSchedule por padrão. Para agendar pods em nós virtuais (ECI), adicione uma tolerância para essa taint.
Exemplo:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
Combine tolerâncias e afinidade de nó para criar políticas de agendamento adequadas a diferentes necessidades de recursos.
Preferir ECS: usa ECS por padrão e recorre ao ECI quando a capacidade do ECS for insuficiente.
Usar apenas ECI: restringe o uso exclusivamente a recursos ECI.
Usar apenas ECS: limita a execução aos recursos ECS existentes.
Preferir ECS
Adicione uma tolerância para a taint padrão e use preferredDuringSchedulingIgnoredDuringExecution para dar preferência a nós sem o rótulo type: virtual-kubelet (nós ECS).
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-prefer
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
Sobre afinidade de nó:
Múltiplos
nodeSelectorTermssão combinados com OR — o pod é agendado se qualquermatchExpressionscorresponder. Várias expressões dentro de um únicomatchExpressionsusam AND — todas devem corresponder.O uso de
preferredDuringSchedulingIgnoredDuringExecutionnão garante fallback exclusivo para ECI — os pods ainda podem ser alocados no ECI mesmo com capacidade suficiente no ECS. Para um controle mais rigoroso, combine comrequiredDuringSchedulingIgnoredDuringExecution.
O YAML abaixo dá preferência a nós ECS com um rótulo específico (como label_1=key_1) e recorre a nós virtuais quando houver necessidade de capacidade adicional.
Usar apenas ECI
Adicione uma tolerância para a taint padrão do nó virtual e use requiredDuringSchedulingIgnoredDuringExecution para exigir nós com o rótulo type: virtual-kubelet.
apiVersion: apps/v1
kind: Deployment
metadata:
name: eci-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
Usar apenas ECS
Por padrão, os pods são agendados apenas em nós ECS, pois os nós virtuais têm uma taint. Nenhuma configuração adicional é necessária.
apiVersion: apps/v1
kind: Deployment
metadata:
name: ecs-only
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6