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é
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. |
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
schedulerNamedu pod est défini surdefault-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.
-
Listez les nœuds virtuels de votre cluster.
kubectl get nodeRé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 -
Créez un fichier nommé
dep-node-selector-demo.yamlavec 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 -
Appliquez le manifeste.
kubectl apply -f dep-node-selector-demo.yaml -
Vérifiez que tous les pods sont bien planifiés dans la zone
cn-hangzhou-j.kubectl get pod -o wideRé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.