Appliquer des ComputeClasses aux pods par défaut

Ce document explique comment appliquer des ComputeClasses par défaut aux pods Google Kubernetes Engine (GKE) qui ne sélectionnent pas explicitement de ComputeClass. Cette page explique comment définir une ComputeClass par défaut dans un espace de noms et pour un cluster entier. Ce document s'adresse aux administrateurs de clusters qui souhaitent réduire les frais généraux manuels causés par la configuration individuelle des charges de travail et des nœuds.

Vous devez déjà connaître les ComputeClasses personnalisées.

À propos des ComputeClasses par défaut

Vous pouvez configurer des clusters GKE ou des espaces de noms spécifiques pour qu'ils disposent d'une ComputeClass par défaut. La classe par défaut que vous configurez s'applique à tous les pods de ce cluster ou de cet espace de noms qui ne sélectionnent pas une autre ComputeClass. Lorsque vous déployez un pod qui ne sélectionne pas de ComputeClass, GKE applique les ComputeClass par défaut dans l'ordre suivant :

  1. Si l'espace de noms possède une ComputeClass par défaut, GKE modifie la spécification du pod pour sélectionner cette ComputeClass.
  2. Si l'espace de noms ne possède pas de ComputeClass par défaut, la classe par défaut au niveau du cluster s'applique. GKE ne modifie pas la spécification du pod.

Si le champ activeMigration.optimizeRulePriority de votre ComputeClass par défaut est défini sur true, ce paramètre peut affecter les charges de travail de vos clusters. Pour en savoir plus, consultez Migration active dans les ComputeClasses par défaut.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Activez l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Si vous souhaitez utiliser Google Cloud CLI pour cette tâche, installez puis initialisez gcloud CLI. Si vous avez déjà installé la gcloud CLI, obtenez la dernière version en exécutant la commande gcloud components update. Il est possible que les versions antérieures de gcloud CLI ne permettent pas d'exécuter les commandes de ce document.
  • Disposer d'un cluster GKE Autopilot ou Standard qui exécute une version permettant de définir une ComputeClass par défaut au niveau du cluster ou de l'espace de noms. Pour en savoir plus, consultez la section Exigences.
  • Si vous utilisez un cluster en mode standard, assurez-vous de remplir l'une des conditions suivantes :

  • Si vous souhaitez définir une ComputeClass personnalisée comme classe par défaut pour un espace de noms, déployez une ComputeClass personnalisée.

Conditions requises

  • Pour définir une ComputeClass comme valeur par défaut au niveau du cluster, celui-ci doit exécuter GKE version 1.33.1-gke.1744000 ou ultérieure.
  • Pour définir une ComputeClass comme valeur par défaut au niveau de l'espace de noms uniquement pour les pods non DaemonSet, le cluster doit exécuter GKE version 1.33.1-gke.1788000 ou ultérieure.

Rôles et autorisations requis

Pour obtenir les autorisations nécessaires pour configurer des ComputeClasses par défaut au niveau du cluster ou de l'espace de noms, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet Google Cloud  :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Ces rôles prédéfinis contiennent les autorisations requises pour configurer des ComputeClasses par défaut au niveau du cluster ou de l'espace de noms. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Vous devez disposer des autorisations suivantes pour configurer les ComputeClasses par défaut au niveau du cluster ou de l'espace de noms :

  • container.customResourceDefinitions.create
  • container.customResourceDefinitions.update
  • container.customResourceDefinitions.get
  • container.customResourceDefinitions.list
  • container.namespaces.get
  • container.namespaces.list
  • container.pods.get
  • container.nodes.get
  • container.nodes.list
  • container.deployments.create
  • container.deployments.get
  • Ajoutez des libellés aux espaces de noms : container.namespaces.update
  • Activez la ComputeClass par défaut au niveau du cluster : container.clusters.update

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Configurer une ComputeClass par défaut pour un espace de noms

Vous pouvez annoter n'importe quel espace de noms Kubernetes de votre cluster avec le nom d'une ComputeClass à utiliser par défaut. Si un pod déployé dans cet espace de noms ne sélectionne pas déjà une ComputeClass, GKE modifie la spécification du pod pour sélectionner la classe par défaut dans l'espace de noms. Vous pouvez définir n'importe quelle ComputeClass personnalisée ou intégrée comme classe par défaut.

  • Pour appliquer une ComputeClass à tous les pods d'un espace de noms par défaut, ajoutez le libellé cloud.google.com/default-compute-class à cet espace de noms :

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME
    

    Remplacez les éléments suivants :

    • NAMESPACE_NAME : nom de l'espace de noms à mettre à jour.
    • COMPUTECLASS_NAME : nom de la ComputeClass à définir comme valeur par défaut pour l'espace de noms.

    Si la commande échoue et affiche le message d'erreur suivant, l'espace de noms dispose déjà d'une ComputeClass par défaut :

    error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is false
    

    Pour résoudre cette erreur, mettez à jour la ComputeClass par défaut pour l'espace de noms.

  • Pour appliquer une ComputeClass à tous les pods non DaemonSet d'un espace de noms par défaut, ajoutez le libellé cloud.google.com/default-compute-class-non-daemonset à cet espace de noms :

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME
    

    Si la commande échoue et affiche le message d'erreur suivant, cela signifie que l'espace de noms dispose déjà d'une ComputeClass par défaut pour les pods non DaemonSet :

    error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is false
    

    Pour résoudre cette erreur, mettez à jour la ComputeClass par défaut pour l'espace de noms.

Vos modifications s'appliquent à tous les nouveaux pods de cet espace de noms. Les pods existants ne sont pas affectés.

Mettre à jour la ComputeClass par défaut existante dans un espace de noms

Pour remplacer la ComputeClass par défaut existante pour un espace de noms, exécutez l'une des commandes suivantes :

  • Mettez à jour la ComputeClass par défaut pour tous les pods de l'espace de noms :

    kubectl label namespaces NAMESPACE_NAME   \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME \
        --overwrite
    

    Remplacez les éléments suivants :

    • NAMESPACE_NAME : nom de l'espace de noms à mettre à jour.
    • COMPUTECLASS_NAME : nom de la ComputeClass à définir comme nouvelle valeur par défaut pour l'espace de noms.
  • Remplacez la ComputeClass par défaut pour les pods non DaemonSet dans l'espace de noms :

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \
        --overwrite
    

Vos modifications s'appliquent à tous les nouveaux pods de cet espace de noms. Les pods existants ne sont pas affectés.

Configurer une ComputeClass par défaut pour un cluster

Cette section vous explique comment définir une ComputeClass par défaut pour votre cluster. Pour les ComputeClasses par défaut au niveau du cluster, ne spécifiez pas manuellement les rejets de nœuds ni les étiquettes de nœuds pour les pools de nœuds existants dans le cluster. GKE ne met pas à l'échelle les pools de nœuds qui présentent des rejets de nœuds pour les classes de calcul. Si vous ajoutez manuellement un libellé pour la ComputeClass default, GKE peut mettre à l'échelle ce pool de nœuds. Toutefois, cette configuration manuelle n'est pas nécessaire pour utiliser une ComputeClass par défaut au niveau du cluster.

  1. Pour activer la définition d'une ComputeClass par défaut au niveau du cluster, exécutez la commande gcloud container clusters update avec l'indicateur --enable-default-compute-class :

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-default-compute-class
    

    Remplacez les éléments suivants :

    • CLUSTER_NAME : nom du cluster
    • CONTROL_PLANE_LOCATION : emplacement du plan de contrôle de votre cluster, par exemple us-central1.

    Vous pouvez également spécifier cet indicateur lorsque vous créez un cluster Autopilot ou Standard.

  2. Enregistrez le fichier manifeste suivant, qui définit un ComputeClass nommé default :

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: default
    spec:
      priorities:
      - machineFamily: n4
      - machineFamily: n2
      whenUnsatisfiable: ScaleUpAnyway
      nodePoolAutoCreation:
        enabled: true
    

    Cet exemple de fichier manifeste demande des nœuds qui utilisent des instances N4. Si les instances N4 ne sont pas disponibles, les requêtes ComputeClass demandent des instances N2 à la place. Vous pouvez configurer la default ComputeClass avec l'un des champs disponibles dans la définition de ressource personnalisée ComputeClass.

  3. Appliquez le fichier manifeste à votre cluster :

    kubectl apply -f PATH_TO_MANIFEST
    

    Remplacez PATH_TO_MANIFEST par le chemin d'accès au fichier manifeste de ComputeClass.

Une fois que vous avez défini une ComputeClass par défaut au niveau du cluster, GKE met à l'échelle les pools de nœuds qui répondent aux deux exigences suivantes :

  • La configuration des nœuds est identique à celle de la ComputeClass default.
  • Le pool de nœuds ne comporte aucun rejet ni aucune étiquette pour une autre ComputeClass. GKE peut mettre à l'échelle les pools de nœuds qui comportent un rejet et une étiquette pour la classe de calcul default.

Par exemple, si la classe de calcul default spécifie la série de machines N4, GKE peut mettre à l'échelle un pool de nœuds existant qui utilise des instances N4 et ne comporte pas de taints ni de libellés pour une autre classe de calcul.

Vos modifications s'appliquent à tous les nouveaux pods du cluster qui n'ont pas encore de ComputeClass. Les pods existants peuvent être affectés en fonction des paramètres de migration actifs de la ComputeClass par défaut au niveau du cluster. Pour en savoir plus, consultez Migration active dans les ComputeClasses par défaut.

Vérifier le comportement par défaut de ComputeClass

Pour vérifier que la ComputeClass par défaut que vous avez définie pour un espace de noms ou pour un cluster fonctionne comme prévu, procédez comme suit :

  1. Consultez l'exemple de déploiement suivant :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
          tier: web
      template:
        metadata:
          labels:
            app: hello
            tier: web
        spec:
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: 200m

    Ce déploiement ne demande pas explicitement de ComputeClass.

  2. Créez le déploiement :

    kubectl apply --namespace=NAMESPACE_NAME \
        -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/refs/heads/main/quickstarts/hello-app/manifests/helloweb-deployment.yaml
    

    Remplacez NAMESPACE_NAME par l'un des éléments suivants, selon ce que vous souhaitez vérifier :

    • Nom d'un espace de noms qui possède une ComputeClass par défaut.
    • Nom d'un espace de noms qui ne possède pas de ComputeClass par défaut.

    La création de nœuds pour exécuter les pods peut prendre un certain temps.

  3. Identifiez les nœuds qui exécutent les pods à partir de l'exemple de déploiement :

    kubectl get pods --namespace=NAMESPACE_NAME \
        --selector=app=hello -o=wide
    

    Le résultat ressemble à ce qui suit :

    NAME                        READY   STATUS    RESTARTS   AGE     IP          NODE                                                  NOMINATED NODE   READINESS GATES
    helloweb-7795fbf856-58n5l   1/1     Running   0          9m21s   10.52.2.3   gke-cluster-1-nap-n2-highcpu-2-3muqi8-f213e529-rx7d   <none>           <none>
    
  4. Obtenez les libellés de nœuds :

    kubectl get node NODE_NAME --show-labels \
        | grep "cloud.google.com/compute-class"
    

    Remplacez NODE_NAME par le nom du nœud obtenu à l'étape précédente.

    Le résultat ressemble à ce qui suit :

    NODE_NAME   Ready    <none>   22m   v1.32.4-gke.1236007
    # lines are omitted from this output
    cloud.google.com/compute-class=COMPUTECLASS_NAME,cloud.google.com/gke-boot-disk=pd-balanced,cloud.google.com/gke-container-runtime=containerd
    

    La valeur de COMPUTECLASS_NAME est l'une des suivantes :

    • ComputeClass par défaut au niveau du cluster : default pour les nœuds créés par GKE Autopilot ou par la création automatique de pools de nœuds. Il est possible que les nœuds des pools de nœuds existants créés manuellement ne comportent pas le libellé cloud.google.com/compute-class.
    • ComputeClass par défaut au niveau de l'espace de noms : nom de la ComputeClass que vous avez configurée comme valeur par défaut de l'espace de noms.

Désactiver la ComputeClass par défaut

Pour désactiver la ComputeClass par défaut dans un espace de noms ou un cluster, procédez de l'une des manières suivantes :

  • Pour désactiver la ComputeClass par défaut au niveau de l'espace de noms pour tous les pods, supprimez l'étiquette cloud.google.com/default-compute-class de l'espace de noms :

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-
    

    Le caractère - à la fin de la clé de libellé supprime tous les libellés associés à cette clé de l'objet Namespace dans l'API Kubernetes.

  • Pour désactiver la ComputeClass par défaut au niveau de l'espace de noms pour les pods non DaemonSet, supprimez l'étiquette cloud.google.com/default-compute-class-non-daemonset de l'espace de noms :

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-non-daemonset-
    
  • Pour désactiver la ComputeClass par défaut au niveau du cluster, utilisez la commande gcloud container clusters update avec l'option --no-enable-default-compute-class :

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --no-enable-default-compute-class
    

Étapes suivantes