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.

Ajouter des labels et taints sur un pool de nœuds (template de pool de nœuds)

Voir en Markdown

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

Grâce au template du Node Pool, vous allez :

  • ajouter des labels sur les nœuds
  • ajouter des annotations sur les nœuds
  • appliquer un taint sur les nœuds
  • marquer des nœuds comme unschedulable
  • ...

Prérequis

En pratique

Créer un cluster Kubernetes

Vous pouvez suivre le guide étape par étape de création d'un cluster Kubernetes si vous souhaitez le créer via l'espace client ou via Terraform.

Créer un template de pool de nœuds avec Terraform

Depuis la version 0.19 et supérieures de notre provider Terraform OVH, vous pouvez également ajouter des restrictions IP via Terraform.

Récupérer les informations de votre cluster et de vos tokens API

Le « provider OVH » doit être configuré avec un ensemble d'identifiants :

  • une application_key
  • un application_secret
  • une consumer_key

Pourquoi ?

Parce que, en arrière-plan, le « provider Terraform OVH » effectue des requêtes vers les API OVHcloud.

Pour récupérer ces informations nécessaires, suivez notre tutoriel Premiers pas avec les API OVHcloud.

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.

Copier-coller le nom du service

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.

Terraform 0.13 et versions ultérieures :

terraform {
  required_providers {
    ovh = {
      source  = "ovh/ovh"
    }
  }
}

provider "ovh" {
  endpoint           = "ovh-eu"
  application_key    = "<your_access_key>"
  application_secret = "<your_application_secret>"
  consumer_key       = "<your_consumer_key>"
}

Terraform 0.12 et versions antérieures :

# Configure the OVHcloud Provider
provider "ovh" {
  endpoint           = "ovh-eu"
  application_key    = "<your_access_key>"
  application_secret = "<your_application_secret>"
  consumer_key       = "<your_consumer_key>"
}

Les clés secrètes peuvent également être récupérées depuis votre environnement.

  • OVH_ENDPOINT
  • OVH_APPLICATION_KEY
  • OVH_APPLICATION_SECRET
  • OVH_CONSUMER_KEY

Cette dernière méthode (ou une alternative similaire) est recommandée pour éviter de stocker des données secrètes dans un dépôt source.

Nous avons ici défini l'endpoint ovh-eu, car nous souhaitons appeler l'API OVHcloud Europe, mais d'autres endpoints existent selon vos besoins :

  • ovh-eu pour l'API OVHcloud Europe
  • ovh-us pour l'API OVHcloud US
  • ovh-ca pour l'API OVHcloud Amérique du Nord

Ensuite, définissez les ressources que vous souhaitez créer dans un nouveau fichier nommé ovh_kube_cluster_nodepool.tf :

resource "ovh_cloud_project_kube_nodepool" "pool" {
    service_name  = "`<service_name>`"
    kube_id       = "`<cluster_id>`"
    name          = "my-node-pool"
    flavor_name   = "b2-7"
    desired_nodes = 1
    min_nodes     = 0
    max_nodes     = 1
    template {
        metadata {
            annotations = {
                my-annotation = "my-value"
            }
            labels = {
                app = "my-app"
            }
        }
        spec {
            unschedulable = false
            taints = [
                {
                    effect = "PreferNoSchedule"
                    key    = "k1"
                    value  = "v1"
                }
            ]
        }
    }
}
Info

N'oubliez pas de remplacer <service_name> et <cluster_id> par les données réelles.

Dans cette configuration de ressources, nous demandons à Terraform d'ajouter un pool de nœuds avec un template à votre cluster Kubernetes.

Info

Consultez la documentation du provider Terraform ovh pour voir la définition de la ressource ovh_cloud_project_kube_nodepool.

Nous devons maintenant initialiser Terraform, générer un plan, puis l'appliquer.

$ terraform init

Initializing 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.html

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should 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, other
commands 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 plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:

  + create

Terraform 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 apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:

  + create

Terraform 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: yes

ovh_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 nodepool
NAME           FLAVOR   AUTOSCALED   MONTHLYBILLED   ANTIAFFINITY   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   MIN   MAX   AGE
my-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 :

$ kubectl describe nodepool my-node-pool
Name:         my-node-pool
Namespace:
Labels:       id=xxxxxxxx-xxxxx-xxxx-xxxx-xxxxxxxxxxx
Annotations:  `<none>`
API Version:  kube.cloud.ovh.com/v1alpha1
Kind:         NodePool
...
Spec:
  Anti Affinity:  false
  Autoscale:      false
  ...
  Template:
    Metadata:
      Annotations:
        My - Annotation:  my-value
      Finalizers:
      Labels:
        App:  my-app
    Spec:
      Taints:
        Effect:       PreferNoSchedule
        Key:          k1
        Value:        v1
      Unschedulable:  false
Status:
...

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 nodes
NAME                       STATUS   ROLES    AGE     VERSION
my-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

Node's labels annotations and taints

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 :

avec les informations suivantes :

{
    "serviceName": "`<service_name>`",
    "kubeId": "`<cluster_id>`",
    "ProjectKubeNodePoolCreation": {
      "name": "my-node-pool",
      "flavorName": "b2-7",
      "desiredNodes": 1,
      "minNodes": 0,
      "maxNodes": 1,
      "template": {
        "metadata": {
          "annotations": {
            "my-annotation": "my-value"
          },
          "labels": {
            "app": "my-app"
          }
        },
        "spec": {
          "unschedulable": false,
          "taints": [
            {
              "effect": "PreferNoSchedule",
              "key": "k1",
              "value": "v1"
            }
          ]
        }
      }
    }
  }

Suppression

Supprimer le pool de nœuds via Terraform

Si vous souhaitez supprimer le pool de nœuds que vous avez ajouté via Terraform, exécutez la commande terraform destroy :

$ terraform destroy
ovh_cloud_project_kube_nodepool.pool: Refreshing state... [id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx]

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  # ovh_cloud_project_kube_nodepool.pool will be destroyed
  - resource "ovh_cloud_project_kube_nodepool" "pool" {
      - anti_affinity    = false -> null
      - autoscale        = false -> null
      - available_nodes  = 1 -> null
      - created_at       = "2022-07-28T11:58:01Z" -> null
      - current_nodes    = 1 -> null
      - desired_nodes    = 1 -> null
      - flavor           = "b2-7" -> null
      - flavor_name      = "b2-7" -> null
      - id               = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx" -> null
      - kube_id          = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx" -> null
      - max_nodes        = 1 -> null
      - min_nodes        = 0 -> null
      - monthly_billed   = false -> null
      - name             = "my-node-pool" -> null
      - project_id       = "xxxxxxxxxxxx" -> null
      - service_name     = "xxxxxxxxxxxx" -> null
      - size_status      = "CAPACITY_OK" -> null
      - status           = "READY" -> null
      - up_to_date_nodes = 1 -> null
      - updated_at       = "2022-07-28T12:02:56Z" -> null

      - template {
          - metadata {
              - annotations = {
                  - "my-annotation" = "my-value"
                } -> null
              - finalizers  = [] -> null
              - labels      = {
                  - "app" = "my-app"
                } -> null
            }

          - spec {
              - taints        = [
                  - {
                      - "effect" = "PreferNoSchedule"
                      - "key"    = "k1"
                      - "value"  = "v1"
                    },
                ] -> null
              - unschedulable = false -> null
            }
        }
    }

Plan: 0 to add, 0 to change, 1 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

ovh_cloud_project_kube_nodepool.pool: Destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx]ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 10s elapsed]
ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 20s elapsed]
ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 30s elapsed]
ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 40s elapsed]
ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 50s elapsed]
ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 1m0s elapsed]
ovh_cloud_project_kube_nodepool.pool: Still destroying... [id=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx, 1m10s elapsed]
ovh_cloud_project_kube_nodepool.pool: Destruction complete after 1m18s

Destroy complete! Resources: 1 destroyed.

Supprimer le pool de nœuds via l'API

Pour supprimer un pool de nœuds avec l'API, utilisez l'appel suivant :

avec les informations suivantes :

  • serviceName : l'identifiant de votre projet Public Cloud
  • kubeId : l'identifiant de votre cluster
  • nodePoolId : l'identifiant du pool de nœuds à supprimer

Aller plus loin

Pour obtenir une vue d'ensemble du service OVHcloud Managed Kubernetes, consultez la page OVHcloud Managed Kubernetes.

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

  • Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?