For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/automatically-label-taint-node-pool.md.
Découvrez comment ajouter des labels, annotations et taints sur les nœuds grâce au template de pools de nœuds sur OVHcloud Managed Kubernetes
Objectif
Nous vous avons précédemment montré comment appliquer un taint, mettre en cordon (cordon) et vider (drain) des Nodes et Node Pools spécifiques. C'est utile, mais ce n'est pas très efficace dans le cas de l'autoscaling d'un cluster Kubernetes, lorsque vos nœuds sont créés et supprimés automatiquement.
Dans ce nouveau tutoriel, nous allons vous montrer comment effectuer certaines opérations (ajout de labels, d'annotations, de taints...) propagées à vos Nodes grâce au template des Node Pools, sur votre OVHcloud Managed Kubernetes Service.
Cela permet de nombreux scénarios d'ordonnancement, comme l'optimisation du coût d'un cluster hébergeant votre application en répartissant les Pods entre deux Node Pools labellisés (l'un en facturation mensuelle et l'autre en autoscaling).
Plus précisément, vous devez générer ces identifiants via la avec les droits suivants : GET, POST, PUT et DELETE sur /*.
Lorsque vous avez généré vos tokens OVHcloud avec succès, veillez à les enregistrer, car vous devrez les utiliser très prochainement.
La dernière information nécessaire est le service_name : il s'agit de l'identifiant de votre projet Public Cloud.
Comment l'obtenir ?
Dans la section Public Cloud, vous pouvez récupérer l'identifiant de votre service grâce au bouton Copier dans le presse-papier.
Vous utiliserez également cette information dans les fichiers de définition des ressources Terraform.
Instructions Terraform
Commencez par créer un fichier provider.tf avec la version minimale, l'endpoint européen (« ovh-eu ») et les clés précédemment récupérées dans ce guide.
Nous devons maintenant initialiser Terraform, générer un plan, puis l'appliquer.
$ terraform initInitializing the backend...Initializing provider plugins...- Finding latest version of ovh/ovh...- Finding latest version of hashicorp/local...- Installing ovh/ovh v0.19.1...- Installed ovh/ovh v0.19.1 (signed by a HashiCorp partner, key ID F56D1A6CBDAAADA5)- Installing hashicorp/local v2.2.3...- Installed hashicorp/local v2.2.3 (signed by HashiCorp)Partner and community providers are signed by their developers.If you'd like to know more about provider signing, you can read about it here:https://www.terraform.io/docs/cli/plugins/signing.htmlTerraform has created a lock file .terraform.lock.hcl to record the providerselections it made above. Include this file in your version control repositoryso that Terraform can guarantee to make the same selections by default whenyou run "terraform init" in the future.Terraform has been successfully initialized!You may now begin working with Terraform. Try running "terraform plan" to seeany changes that are required for your infrastructure. All Terraform commandsshould now work.If you ever set or change modules or backend configuration for Terraform,rerun this command to reinitialize your working directory. If you forget, othercommands will detect it and remind you to do so if necessary.
La commande init initialise votre répertoire de travail qui contient les fichiers de configuration .tf.
C'est la première commande à exécuter pour une nouvelle configuration, ou après avoir effectué un checkout d'une configuration existante depuis un dépôt git par exemple.
La commande init va :
Télécharger et installer les providers/plugins Terraform
Initialiser le backend (si défini)
Télécharger et installer les modules (si définis)
Nous pouvons maintenant générer notre plan :
$ terraform planTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + createTerraform will perform the following actions: # ovh_cloud_project_kube_nodepool.pool will be created + resource "ovh_cloud_project_kube_nodepool" "pool" { + anti_affinity = false + autoscale = false + available_nodes = (known after apply) + created_at = (known after apply) + current_nodes = (known after apply) + desired_nodes = 1 + flavor = (known after apply) + flavor_name = "b2-7" + id = (known after apply) + kube_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx" + max_nodes = 1 + min_nodes = 0 + monthly_billed = false + name = "my-node-pool" + project_id = (known after apply) + service_name = "xxxxxxxxxxxxx" + size_status = (known after apply) + status = (known after apply) + up_to_date_nodes = (known after apply) + updated_at = (known after apply) + template { + metadata { + annotations = { + "my-annotation" = "my-value" } + finalizers = [] + labels = { + "app" = "my-app" } } + spec { + taints = [ + { + "effect" = "PreferNoSchedule" + "key" = "k1" + "value" = "v1" }, ] + unschedulable = false } } }Plan: 1 to add, 0 to change, 0 to destroy.───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
Grâce à la commande plan, nous pouvons vérifier ce que Terraform souhaite créer, modifier ou supprimer.
Le plan nous convient, appliquons-le donc :
$ terraform applyTerraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + createTerraform will perform the following actions: # ovh_cloud_project_kube_nodepool.pool will be created + resource "ovh_cloud_project_kube_nodepool" "pool" { + anti_affinity = false + autoscale = false + available_nodes = (known after apply) + created_at = (known after apply) + current_nodes = (known after apply) + desired_nodes = 1 + flavor = (known after apply) + flavor_name = "b2-7" + id = (known after apply) + kube_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx" + max_nodes = 1 + min_nodes = 0 + monthly_billed = false + name = "my-node-pool" + project_id = (known after apply) + service_name = "xxxxxxxxxxxxx" + size_status = (known after apply) + status = (known after apply) + up_to_date_nodes = (known after apply) + updated_at = (known after apply) + template { + metadata { + annotations = { + "my-annotation" = "my-value" } + finalizers = [] + labels = { + "app" = "my-app" } } + spec { + taints = [ + { + "effect" = "PreferNoSchedule" + "key" = "k1" + "value" = "v1" }, ] + unschedulable = false } } }Plan: 1 to add, 0 to change, 0 to destroy.Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yesovh_cloud_project_kube_nodepool.pool: Creating...ovh_cloud_project_kube_nodepool.pool: Still creating... [10s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [20s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [30s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [40s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [50s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [1m0s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [1m10s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [1m20s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [1m30s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [1m40s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [1m50s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [2m0s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [2m10s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [2m20s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [2m30s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [2m40s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [2m50s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [3m0s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [3m10s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [3m20s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [3m30s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [3m40s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [3m50s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [4m0s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [4m10s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [4m20s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [4m30s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [4m40s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [4m50s elapsed]ovh_cloud_project_kube_nodepool.pool: Still creating... [5m0s elapsed]ovh_cloud_project_kube_nodepool.pool: Creation complete after 5m8s [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx]Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Vérifier que tout est correctement configuré
Pour effectuer certaines opérations sur vos nœuds via la CLI kubectl, nous vous invitons à suivre notre guide pour configurer les paramètres par défaut.
Une fois que vous pouvez accéder au cluster via la commande kubectl, affichons notre pool de nœuds :
$ kubectl get nodepoolNAME FLAVOR AUTOSCALED MONTHLYBILLED ANTIAFFINITY DESIRED CURRENT UP-TO-DATE AVAILABLE MIN MAX AGEmy-node-pool b2-7 false false false 1 1 1 1 0 1 8m13s
Notre pool de nœuds existe et nous pouvons voir sa configuration.
Examinons maintenant le template du pool de nœuds :
Le template que vous avez défini demandera à Kubernetes de propager cette configuration à tous les nœuds de ce pool de nœuds.
Affichons notre nœud. Nous devrions avoir 1 nœud en cours d'exécution :
$ kubectl get nodesNAME STATUS ROLES AGE VERSIONmy-node-pool-node-5781fa Ready `<none>` 7m55s v1.34.0
Vérifiez que le label, l'annotation et le taint que vous avez définis sont bien propagés au nœud :
$ kubectl describe node my-node-pool-node-5781fa
Et si vous modifiez la configuration du pool de nœuds pour activer l'autoscaling et le dimensionner à 3 nœuds par exemple, toutes les informations que vous avez définies seront propagées aux nouveaux nœuds.
Créer un template de pool de nœuds via l'API
Vous pouvez également créer un template de pool de nœuds via l'API. Vous pouvez utiliser l'Explorateur d'API par exemple pour interagir avec notre API.
Pour créer un pool de nœuds avec un template (labels, annotations, taints...), vous devez effectuer un appel sur :
Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.