J'ai créé plusieurs piles (groupes de nœuds) dans mon cluster EKS , et chaque groupe s'exécute sur un type d'instance différent (par exemple, un groupe s'exécute sur des instances GPU). J'ai ajouté une entrée dans mapRoles du fichier aws-auth-cm.yaml pour chacun des groupes de nœuds. Maintenant, je voudrais déployer certains déploiements sur un autre. Les fichiers de déploiement ressemblent à ceci:
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-1 spec: replicas: 1 selector: matchLabels: component: component-1 template: metadata: labels: component: component-1 spec: containers: - name: d1 image: docker-container ports: - containerPort: 83
La documentation montre que je peux exécuter la commande standard kubectl apply . Existe-t-il un moyen de spécifier le groupe? Peut-être quelque chose comme
kubectl apply -f server-deployment.yaml -group node-group-1
3 Réponses :
Malheureusement, quelque chose que vous avez mentionné n'existe pas, mais vous pouvez lire sur Affinity et cela devrait résoudre votre problème.
TL; DR vous devez ajouter des étiquettes ou utiliser des étiquettes existantes sur les nœuds et utiliser ces étiquettes pour attribuer des pods aux nœuds corrects.
En supposant que vous ayez l'étiquette beta.kubernetes.io/instance-type=highmem
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/instance-typ operator: In values: - highmem replicas: 1 selector: matchLabels: component: component-1 template: metadata: labels: component: component-1 spec: containers: - name: d1 image: docker-container ports: - containerPort: 83
Vous pouvez utiliser des teintes et des tolérances pour vous assurer que vos pods se retrouvent sur les bons nœuds. Lorsque vous avez des nœuds hétérogènes, c'est une bonne pratique.
Par exemple, dans mon déploiement, nous avons 2 classes de nœuds, ceux qui ont un SSD NVMe attaché et ceux qui n'en ont pas. Ils sont tous deux souillés différemment et les déploiements qui s'exécutent en haut spécifient des tolérances qui garantissent qu'ils ne se retrouvent que sur les nœuds qui ont cette souillure particulière.
Par exemple, le nœud aurait:
spec: tolerations: - effect: NoSchedule key: role operator: Equal value: gpu-instance
et un pod qui doit planifier sur l'un de ces nœuds doit avoir:
spec: ... taints: - effect: NoSchedule key: role value: gpu-instance
Une fois que vous avez cette configuration, vous pouvez simplement faire une kubectl apply
régulière et les pods seront correctement ciblés sur les nœuds. Notez qu'il s'agit d'une approche plus flexible que les sélecteurs de nœuds et les étiquettes, car elle peut vous offrir un contrôle plus fin et un comportement d'éviction configurable.
si cette approche est adoptée, rien ne doit être spécifié dans le fichier yaml de déploiement?
Vous devez spécifier la tolérance sous le modèle de pod dans le déploiement YAML.
nodeSelector devrait également fonctionner pour cela, tant que vous avez étiqueté vos nœuds
Exemples et plus d'informations ici: https://eksworkshop.com/beginner/140_assigning_pods/node_selector/ et ici https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector