Empêcher l'auto-enregistrement des nœuds dans les clusters GKE

Par défaut, les nœuds Google Kubernetes Engine (GKE) utilisent le processus kubelet sur chaque nœud pour enregistrer les objets Node auprès du serveur d'API Kubernetes. Ce document vous explique comment empêcher cette auto-inscription pour les nœuds GKE protégés et exiger à la place qu'un composant de plan de contrôle GKE de confiance effectue les opérations d'inscription. Les ingénieurs en sécurité et les administrateurs de plate-forme peuvent utiliser la création de nœuds de plan de contrôle pour limiter les privilèges des nœuds.

Vous devez déjà connaître les concepts suivants :

Modes de création de nœuds dans GKE

Les nœuds GKE protégés, qui sont activés dans tous les clusters GKE, appliquent la vérification cryptographique des identités de nœud lors du processus d'enregistrement des nœuds. Cette vérification permet de s'assurer que seuls les nœuds légitimes peuvent s'enregistrer auprès du serveur d'API Kubernetes et exécuter des charges de travail.

Le workflow d'enregistrement par défaut des clusters GKE, dans lequel kubelet sur chaque nœud crée et modifie son objet Node dans le serveur d'API, crée un risque si un nœud est compromis. Par exemple, dans CVE-2025-5187, une faille de sécurité permettait aux utilisateurs de nœuds de supprimer les objets Node correspondants et d'enregistrer les nœuds compromis.

Création de nœuds du plan de contrôle

Dans GKE version 1.35.3-gke.1189000 et ultérieure, vous pouvez éventuellement exiger qu'un composant de plan de contrôle GKE de confiance nommé gcp-controller-manager crée des objets Node au lieu d'autoriser le kubelet à enregistrer lui-même les nœuds. Une fois que kubelet a configuré une connexion TLS avec le serveur d'API à l'aide de l'identité de nœud cryptographiquement vérifiée, le composant gcp-controller-manager crée l'objet Node. Un contrôleur d'admission rejette toute demande de kubelet visant à créer l'objet Node. En utilisant le composant du plan de contrôle pour créer des objets Node, vous pouvez réduire le risque qu'un nœud potentiellement compromis crée des objets Node arbitraires ou manipule sa spécification Node.

Pour modifier le comportement par défaut de création et d'enregistrement des nœuds, effectuez l'une des opérations suivantes lorsque vous créez un cluster Standard ou Autopilot :

  • Google Cloud CLI : spécifiez la valeur CONTROL_PLANE dans le flag --node-creation-mode.
  • API Kubernetes Engine : spécifiez la valeur VIA_CONTROL_PLANE dans le champ node-creation-mode de la méthode NodeCreationConfig.

Limites

Il existe un bref délai entre le moment où gcp-controller-manager crée un objet Node dans l'API Kubernetes et celui où kubelet met à jour cet objet Node avec l'ensemble complet des libellés et annotations de nœud. Toutes les charges de travail ou tous les contrôleurs qui dépendent d'un ensemble complet d'étiquettes ou d'annotations immédiatement après la création du nœud peuvent présenter un comportement inattendu. Certains libellés et annotations peuvent être réconciliés à un moment différent de l'enregistrement kubelet. Vérifiez que vos charges de travail et DaemonSets utilisent des vérifications de présence de libellés et d'annotations avant d'agir.

  • Évitez de déployer des DaemonSets et des charges de travail qui tolèrent tous les rejets de nœuds, car cela pourrait entraîner l'exécution de pods sur des nœuds qui ne sont pas prêts.
  • Utilisez un initContainer pour vérifier les libellés de nœud avant d'autoriser l'exécution des conteneurs principaux.

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 la Google Cloud CLI pour cette tâche, installez et initialisez la 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 la gcloud CLI ne permettent pas d'exécuter les commandes de ce document.

Activer la création de nœuds de plan de contrôle

Vous pouvez activer la création de nœuds à l'aide du composant gcp-controller-manager lorsque vous créez un cluster ou mettez à jour un cluster existant. Pour les clusters existants, la mise à jour n'affecte que les nouveaux nœuds du cluster. Les nœuds existants ne sont pas affectés par ce changement.

La commande suivante active le mode de création de nœuds du plan de contrôle pour un cluster existant :

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=CONTROL_PLANE \
    --location=CONTROL_PLANE_LOCATION \

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du cluster
  • CONTROL_PLANE_LOCATION : région ou zone de votre plan de contrôle du cluster.

Vous pouvez également spécifier l'indicateur --node-creation-mode dans la commande clusters create et dans la commande clusters create-auto.

Désactiver la création de nœuds de plan de contrôle

Vous pouvez revenir au comportement GKE par défaut dans lequel kubelet crée des nœuds à tout moment en spécifiant la valeur KUBELET dans l'option --node-creation-mode de Google Cloud CLI ou VIA_KUBELET dans la méthode NodeCreationConfig de l'API GKE. Pour les clusters existants, cette modification n'affecte que les nouveaux nœuds de ce cluster.

La commande suivante met à jour un cluster pour désactiver la création de nœuds de plan de contrôle :

gcloud container clusters update CLUSTER_NAME \
    --node-creation-mode=KUBELET \
    --location=CONTROL_PLANE_LOCATION \

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du cluster
  • CONTROL_PLANE_LOCATION : région ou zone de votre plan de contrôle du cluster.

Étapes suivantes