Utilice tolerancias y afinidad de nodos para programar pods en Elastic Compute Service (ECS), en ECI o en ambos. También puede configurar un respaldo basado en prioridades.
Conceptos clave
Taint: regla de un nodo que impide la programación de ciertos pods en él.
Toleration: configuración de un pod que le permite ignorar los taints de un nodo.
-
Afinidad de nodos: propiedad de un pod que lo atrae hacia nodos con etiquetas específicas. Existen dos tipos:
requiredDuringSchedulingIgnoredDuringExecution: requisito obligatorio. Los pods se programan únicamente en nodos que cumplen la condición.preferredDuringSchedulingIgnoredDuringExecution: preferencia opcional. El programador intenta cumplir la regla, pero programa el pod en otro lugar si no encuentra coincidencias.
Consulte Taints and Tolerations y Node affinity.
Requisitos previos
Un clúster administrado Pro de ACK que ejecute Kubernetes v1.22 o una versión posterior.
La versión 2.10.0 o posterior del complemento ack-virtual-node (consulte Virtual nodes).
-
La versión 5.9 o posterior del componente kube-scheduler, con la política de programación de nodos virtuales habilitada.
En la página Add-ons, busque Kube Scheduler, haga clic en Configuration y confirme que Enable Virtual Node-based Pod Scheduling esté seleccionado.
Ejemplos de configuración
Los nodos virtuales de los clústeres de ACK tienen el taint virtual-kubelet.io/provider=alibabacloud:NoSchedule de forma predeterminada. Para programar pods en nodos virtuales (ECI), agregue una tolerancia para este taint.
Ejemplo:
tolerations:
- key: virtual-kubelet.io/provider
operator: Equal
value: alibabacloud
effect: NoSchedule
Combine tolerancias y afinidad de nodos para crear políticas de programación según sus necesidades de recursos.
Preferir ECS: usa ECS de forma predeterminada y recurre a ECI cuando la capacidad de ECS es insuficiente.
Usar solo ECI: utiliza exclusivamente recursos de ECI.
Usar solo ECS: emplea únicamente los recursos de ECS existentes.
Preferir ECS
Agregue una tolerancia para el taint predeterminado. Después, utilice preferredDuringSchedulingIgnoredDuringExecution para dar prioridad a los nodos sin la etiqueta type: virtual-kubelet (nodos de 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
Consideraciones sobre la afinidad de nodos:
Varios elementos
nodeSelectorTermsse combinan con OR. Un pod se programa si coincide alguna expresión dematchExpressions. Las expresiones dentro de un mismo bloquematchExpressionsse combinan con AND, por lo que todas deben coincidir.preferredDuringSchedulingIgnoredDuringExecutionno garantiza que el respaldo sea exclusivo para ECI. Los pods podrían programarse en ECI incluso si hay capacidad suficiente en ECS. Para un control más estricto, combine esta opción conrequiredDuringSchedulingIgnoredDuringExecution.
El siguiente archivo YAML da prioridad a los nodos de ECS con una etiqueta específica (como label_1=key_1). Si se requiere más capacidad, recurre a los nodos virtuales.
Usar solo ECI
Agregue una tolerancia para el taint predeterminado de los nodos virtuales. Luego, use requiredDuringSchedulingIgnoredDuringExecution para exigir nodos con la etiqueta 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 solo ECS
De forma predeterminada, los pods se programan únicamente en nodos de ECS porque los nodos virtuales tienen un taint. No se requiere configuración adicional.
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