Tous les produits
Search
Centre de documentation

Container Compute Service:Node Affinity Scheduling

Dernière mise à jour :Aug 12, 2026

Les clusters ACS représentent les nœuds sous forme de nœuds virtuels et exposent leurs attributs (zone de disponibilité, région, modèle de GPU, etc.) en tant que libellés Kubernetes. Utilisez nodeSelector ou nodeAffinity dans la spécification de vos pods pour les planifier sur des nœuds virtuels possédant des attributs spécifiques.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • kube-scheduler installé dans la version minimale requise pour votre cluster :

    Version du cluster ACS Version minimale 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 v2.12.0-acs.4 ou ultérieure installé

Remarque

L'option Enable custom labels for GPU-HPN nodes and scheduler est activée par défaut dans les versions récentes de kube-scheduler. Aucune configuration manuelle n'est nécessaire. Pour plus de détails, consultez kube-scheduler.

Choisir une méthode de planification

Méthode Cas d'utilisation
nodeSelector Assignez des pods à des nœuds portant un libellé spécifique. Il s'agit de l'option la plus simple ; privilégiez-la en premier lieu.
nodeAffinity Définissez des règles de planification plus avancées, telles que des conditions multi-libellés ou une correspondance basée sur des opérateurs (In, NotIn, Exists).

Libellés de nœud disponibles

Les nœuds virtuels ACS exposent les libellés suivants pour la planification :

Clé du libellé Description Exemple de valeur
topology.kubernetes.io/zone Zone de disponibilité cn-hangzhou-j
topology.kubernetes.io/region Région cn-hangzhou
kubernetes.io/hostname Nom du nœud virtuel virtual-kubelet-cn-hangzhou-j

nodeSelector

nodeSelector associe les pods aux nœuds virtuels par le biais de libellés. Ajoutez le libellé cible sous nodeSelector dans la spécification de votre pod. Pour un exemple complet, reportez-vous à la section Planifier des pods dans une zone spécifique.

nodeAffinity

nodeAffinity prend en charge la même correspondance basée sur les libellés que nodeSelector, mais offre une syntaxe plus expressive. Ce mécanisme comporte deux modes :

Mode Comportement
requiredDuringSchedulingIgnoredDuringExecution (affinité stricte) Le planificateur place le pod uniquement sur un nœud satisfaisant la règle. En l'absence de nœud correspondant, le pod n'est pas planifié.
preferredDuringSchedulingIgnoredDuringExecution (affinité souple) Le planificateur tente de trouver un nœud correspondant. Si aucun n'est disponible, le pod est tout de même planifié sur n'importe quel nœud éligible.
Remarque

Si vous spécifiez à la fois nodeSelector et nodeAffinity sur le même pod, les deux conditions doivent être satisfaites pour que la planification aboutisse. Au sein de nodeSelectorTerms, plusieurs termes sont évalués avec une logique OU : le pod est planifié si au moins l'un des termes correspond. À l'intérieur d'un terme unique, plusieurs entrées matchExpressions sont évaluées avec une logique ET : toutes les expressions doivent correspondre.

Contraintes pour les pods GPU-HPN

Les contraintes suivantes s'appliquent lorsque les trois conditions ci-dessous sont réunies :

  • Le pod utilise un type de calcul GPU-HPN (GPU avec réseau haute performance).

  • Le champ schedulerName du pod est défini sur default-scheduler.

  • L'option Enable Custom Tags And Scheduler For GPU-HPN Nodes n'est pas sélectionnée dans la configuration du composant de planification.

Champ Contrainte
requiredDuringSchedulingIgnoredDuringExecution Dans nodeSelectorTerms, seuls les libellés d'affinité pris en charge sont autorisés dans matchExpressions. La spécification de matchFields est interdite.
preferredDuringSchedulingIgnoredDuringExecution Non pris en charge.

Pour les types d'instances à usage général, optimisées pour le calcul et dotées de GPU, nodeAffinity ne présente aucune contrainte de ce type.

Planifier des pods dans une zone spécifique

Cet exemple utilise nodeSelector pour planifier un déploiement dans la zone cn-hangzhou-j.

  1. Listez les nœuds virtuels de votre cluster.

    kubectl get node

    Résultat attendu :

    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. Créez un fichier nommé dep-node-selector-demo.yaml avec le contenu suivant.

    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. Appliquez le manifeste.

    kubectl apply -f dep-node-selector-demo.yaml
  4. Vérifiez que tous les pods sont bien planifiés dans la zone cn-hangzhou-j.

    kubectl get pod -o wide

    Résultat attendu :

    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>

    Les quatre pods s'exécutent sur virtual-kubelet-cn-hangzhou-j, ce qui confirme le bon fonctionnement de la planification au niveau de la zone.

Étapes suivantes