Todos los productos
Search
Centro de documentos

Container Compute Service:Node Affinity Scheduling

Última actualización: Sep 17, 2026

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.

Nota

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

nodeSelector

Fija los pods a nodos con una etiqueta específica. Es la opción más sencilla; úsela primero.

nodeAffinity

Permite expresar reglas de programación más complejas, como varias condiciones de etiqueta o coincidencias basadas en operadores (In, NotIn, Exists).

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

topology.kubernetes.io/zone

Zona de disponibilidad

cn-hangzhou-j

topology.kubernetes.io/region

Región

cn-hangzhou

kubernetes.io/hostname

Nombre del nodo virtual

virtual-kubelet-cn-hangzhou-j

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

requiredDuringSchedulingIgnoredDuringExecution (afinidad estricta)

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.

preferredDuringSchedulingIgnoredDuringExecution (afinidad flexible)

El programador intenta encontrar un nodo coincidente. Si no hay ninguno disponible, el pod se programa de todos modos en cualquier nodo elegible.

Nota

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 schedulerName del pod es default-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

requiredDuringSchedulingIgnoredDuringExecution

En nodeSelectorTerms, solo se permiten las etiquetas de afinidad compatibles dentro de matchExpressions. No es posible especificar matchFields.

preferredDuringSchedulingIgnoredDuringExecution

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.

  1. Enumere los nodos virtuales de su clúster.

    kubectl get node

    Resultado 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
  2. Cree un archivo llamado dep-node-selector-demo.yaml con 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
  3. Aplique el manifiesto.

    kubectl apply -f dep-node-selector-demo.yaml
  4. Compruebe que todos los pods se hayan programado en la zona cn-hangzhou-j.

    kubectl get pod -o wide

    Resultado 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.

Pasos siguientes