Los clústeres de ACS representan los nodos como nodos virtuales y exponen sus atributos —como la zona de disponibilidad, la región y el modelo de GPU— en forma de etiquetas de Kubernetes. Utilice nodeSelector o nodeAffinity en la especificación de su pod para programar pods en nodos virtuales con atributos específicos.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
-
kube-scheduler instalado en la versión mínima correspondiente a su clúster:
Versión del clúster de ACS
Versión mínima de kube-scheduler
1.31
v1.31.0-aliyun-1.2.0
1.30
v1.30.3-aliyun-1.1.1
1.28
v1.28.9-aliyun-1.1.0
acs-virtual-node instalado en la versión v2.12.0-acs.4 o posterior.
La opción Enable custom labels for GPU-HPN nodes and scheduler se habilita de forma predeterminada en las versiones más recientes de kube-scheduler. No se requiere ninguna configuración manual. Para más detalles, consulte kube-scheduler.
Elija un método de programación
|
Método |
Cuándo usarlo |
|
|
Fija los pods a nodos con una etiqueta específica. Es la opción más sencilla; úsela primero. |
|
|
Permite expresar reglas de programación más complejas, como varias condiciones de etiqueta o coincidencias basadas en operadores ( |
Etiquetas de nodo disponibles
Los nodos virtuales de ACS exponen las siguientes etiquetas para la programación:
|
Clave de etiqueta |
Descripción |
Valor de ejemplo |
|
|
Zona de disponibilidad |
|
|
|
Región |
|
|
|
Nombre del nodo virtual |
|
nodeSelector
nodeSelector asocia los pods con los nodos virtuales mediante etiquetas. Agregue la etiqueta de destino dentro de nodeSelector en la especificación de su pod. Para ver un ejemplo práctico, consulte Programar pods en una zona específica.
nodeAffinity
nodeAffinity admite la misma asociación basada en etiquetas que nodeSelector, pero con una sintaxis más expresiva. Cuenta con dos modos:
|
Modo |
Comportamiento |
|
|
El programador coloca el pod únicamente en un nodo que cumpla la regla. Si no existe ningún nodo coincidente, el pod no se programa. |
|
|
El programador intenta encontrar un nodo coincidente. Si no hay ninguno disponible, el pod se programa de todos modos en cualquier nodo elegible. |
Si especifica tanto nodeSelector como nodeAffinity en el mismo pod, ambas condiciones deben cumplirse para que este se programe. Dentro de nodeSelectorTerms, varios términos se evalúan con lógica OR: el pod se programa si coincide al menos uno. En cambio, dentro de un solo término, varias entradas de matchExpressions se evalúan con lógica AND, por lo que todas las expresiones deben coincidir.
Restricciones para pods de GPU-HPN
A continuación se describen las restricciones aplicables cuando se cumplen las tres condiciones siguientes:
El pod utiliza el tipo de cómputo GPU-HPN (GPU con red de alto rendimiento).
El valor de
schedulerNamedel pod esdefault-scheduler.La opción Enable Custom Tags And Scheduler For GPU-HPN Nodes no está seleccionada en la configuración del componente de programación.
|
Campo |
Restricción |
|
|
En |
|
|
No compatible. |
Para los tipos de instancia de uso general, optimizadas para cómputo y de GPU, nodeAffinity no presenta estas restricciones.
Programar pods en una zona específica
En este ejemplo se usa nodeSelector para programar un Deployment en la zona cn-hangzhou-j.
-
Enumere los nodos virtuales de su clúster.
kubectl get nodeResultado esperado:
NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-hangzhou-i Ready agent 5h42m v1.28.3-xx virtual-kubelet-cn-hangzhou-j Ready agent 5h42m v1.28.3-xx -
Cree un archivo llamado
dep-node-selector-demo.yamlcon el siguiente contenido.apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 4 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo spec: containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" # Pin pods to the cn-hangzhou-j zone nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-j -
Aplique el manifiesto.
kubectl apply -f dep-node-selector-demo.yaml -
Compruebe que todos los pods se hayan programado en la zona
cn-hangzhou-j.kubectl get pod -o wideResultado esperado:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-node-selector-demo-b4578576b-cgpfq 1/1 Running 0 112s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-fs8kl 1/1 Running 0 110s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-nh8zm 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-rpp8l 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none>Los cuatro pods se ejecutan en
virtual-kubelet-cn-hangzhou-j, lo que confirma que la programación a nivel de zona funciona correctamente.