Ce tutoriel décrit comment personnaliser les nœuds d'un cluster Google Kubernetes Engine (GKE) à l'aide de DaemonSets. Un DaemonSet garantit que tous les nœuds (ou les nœuds sélectionnés) exécutent une copie d'un pod. Cette approche vous permet d'orchestrer vos charges de travail à l'aide des mêmes outils que ceux que vous utilisez pour modifier vos nœuds GKE.
Si les outils et systèmes avec lesquels vous initialisez vos clusters sont différents de ceux avec lesquels vous exécutez vos charges de travail, l'effort nécessaire à la gestion de votre environnement augmente. Par exemple, si vous initialisez les nœuds de cluster à l'aide d'un outil de gestion des configurations, vous vous appuyez sur une procédure située en dehors de l'environnement d'exécution accueillant le reste de vos charges de travail.
L'objectif de ce tutoriel est d'aider les administrateurs système, les ingénieurs système et les opérateurs d'infrastructure à simplifier l'initialisation des clusters Kubernetes.
Avant de lire ce document, assurez-vous de connaître les éléments suivants :
Dans ce tutoriel, vous allez apprendre à utiliser les étiquettes et sélecteurs Kubernetes pour choisir la procédure d'initialisation à exécuter en fonction des étiquettes associées à un nœud. Vous allez pour cela déployer un DaemonSet ne s'exécutant que sur les nœuds associés au libellé default-init
. Toutefois, pour démontrer la flexibilité de ce mécanisme, vous pourriez également créer un autre pool de nœuds et appliquer le libellé alternative-init
aux nœuds de ce nouveau pool. Dans ce cluster, vous déploieriez alors un autre DaemonSet configuré pour ne s'exécuter que sur les nœuds associés au libellé alternative-init
.
Vous pourriez aussi exécuter non pas une, mais plusieurs procédures d'initialisation sur chaque nœud. Ce mécanisme permet de mieux structurer les procédures d'initialisation en séparant clairement les éléments source d'inquiétude.
Dans ce tutoriel, à titre d'exemple, la procédure d'initialisation permet d'effectuer les actions suivantes sur chaque nœud associé à l'étiquette default-init
:
- Association d'un disque supplémentaire au nœud
- Installation d'un ensemble de packages et bibliothèques à l'aide du gestionnaire de packages du système d'exploitation du nœud
- Chargement d'un ensemble de modules de noyau Linux
Objectifs
Dans ce tutoriel, vous allez effectuer les opérations suivantes :
- Provisionner et configurer un cluster GKE
- Préparer un descripteur DaemonSet afin d'initialiser les nœuds du cluster
- Déployer le DaemonSet dans le cluster
- Vérifier que les nœuds du cluster ont bien été initialisés
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
Amorcer l'environnement
Dans cette section, vous allez exécuter les opérations suivantes :
- Activer les API Cloud nécessaires
- Provisionner un compte de service ayant des droits limités sur les nœuds du cluster GKE
- Préparer le cluster GKE
- Accorder à l'utilisateur des droits d'administrateur sur le cluster
Activer API Cloud
Ouvrez Cloud Shell.
Sélectionnez le projet Google Cloud :
gcloud config set project project-id
Remplacez
project-id
par l'ID du projet Google Cloud créé ou sélectionné pour ce tutoriel.Activez l'API Google Kubernetes Engine :
gcloud services enable container.googleapis.com
Provisionner un compte de service pour gérer les clusters GKE
Dans cette section, vous allez créer un compte de service associé aux nœuds du cluster. Dans ce tutoriel, les nœuds GKE utilisent ce compte de service au lieu du compte de service par défaut. Nous vous recommandons de n'accorder au compte de service que les rôles et autorisations d'accès nécessaires pour exécuter l'application.
Les rôles requis pour le compte de service sont les suivants :
- Lecteur Monitoring (
roles/monitoring.viewer
). Ce rôle accorde un accès en lecture seule à l'API et à la console Cloud Monitoring. - Rédacteur de métriques de surveillance (
roles/monitoring.metricWriter
). Ce rôle permet d'écrire des données de surveillance. - Rédacteur de journaux (
roles/logging.logWriter
). Ce rôle n'accorde que le niveau d'autorisation suffisant pour écrire des journaux. - Utilisateur du compte de service (
roles/iam.serviceAccountUser
). Ce rôle donne accès aux comptes de service d'un projet. Dans ce tutoriel, la procédure d'initialisation emprunte l'identité du compte de service pour exécuter des opérations privilégiées. - Administrateur de Compute (
roles/compute.admin
). Ce rôle fournit un contrôle complet sur toutes les ressources Compute Engine. Dans ce tutoriel, le compte de service requiert ce rôle pour associer des disques supplémentaires aux nœuds du cluster.
Pour provisionner un compte de service, procédez comme suit :
Dans Cloud Shell, initialisez une variable d'environnement qui stocke le nom du compte de service :
GKE_SERVICE_ACCOUNT_NAME=ds-init-tutorial-gke
Créez un compte de service :
gcloud iam service-accounts create "$GKE_SERVICE_ACCOUNT_NAME" \ --display-name="$GKE_SERVICE_ACCOUNT_NAME"
Initialisez une variable d'environnement qui stocke le nom du compte de messagerie du compte de service :
GKE_SERVICE_ACCOUNT_EMAIL="$(gcloud iam service-accounts list \ --format='value(email)' \ --filter=displayName:"$GKE_SERVICE_ACCOUNT_NAME")"
Associez les rôles de gestion de l'authentification et des accès (IAM) au compte de service :
gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/compute.admin gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/monitoring.viewer gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/monitoring.metricWriter gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/logging.logWriter gcloud projects add-iam-policy-binding \ "$(gcloud config get-value project 2> /dev/null)" \ --member serviceAccount:"$GKE_SERVICE_ACCOUNT_EMAIL" \ --role roles/iam.serviceAccountUser
Préparer le cluster GKE
Dans cette section, vous allez lancer le cluster GKE, accorder des autorisations et terminer la configuration du cluster.
Ici, un cluster doté d'un nombre relativement faible de petits nœuds à usage général suffit à démontrer le concept de ce tutoriel. Vous allez tout d'abord créer un cluster avec un seul pool de nœuds (le pool par défaut), puis attribuer l'étiquette default-init
à tous les nœuds du pool.
Dans Cloud Shell, créez et lancez un cluster GKE régional :
gcloud container clusters create ds-init-tutorial \ --enable-ip-alias \ --image-type=ubuntu_containerd \ --machine-type=n1-standard-2 \ --metadata disable-legacy-endpoints=true \ --node-labels=app=default-init \ --node-locations us-central1-a,us-central1-b,us-central1-c \ --no-enable-basic-auth \ --no-issue-client-certificate \ --num-nodes=1 \ --region us-central1 \ --service-account="$GKE_SERVICE_ACCOUNT_EMAIL"
Déployer le DaemonSet
Dans cette section, vous allez exécuter les opérations suivantes :
- Créer le ConfigMap qui stocke la procédure d'initialisation.
- Déployer le DaemonSet qui programme et exécute la procédure d'initialisation.
Le DaemonSet effectue les opérations suivantes :
- Il configure un volume qui rend le contenu du ConfigMap disponible pour les conteneurs gérés par le DaemonSet.
- Il configure les volumes pour les zones de système de fichiers privilégiées du nœud de cluster sous-jacent. Ces zones permettent aux conteneurs programmés par le DaemonSet d'interagir directement avec le nœud qui les exécute.
- Il programme et exécute un conteneur d'initialisation qui effectue la procédure d'initialisation, puis s'arrête une fois l'opération terminée.
- Il programme et exécute un conteneur qui reste inactif et ne consomme aucune ressource.
Le conteneur inactif permet de s'assurer qu'un nœud n'est initialisé qu'une fois. Les objets DaemonSet sont conçus de façon que tous les nœuds éligibles exécutent une copie d'un pod. Si vous utilisez un conteneur standard, celui-ci exécute la procédure d'initialisation, puis s'arrête une fois l'opération terminée. De par sa conception, le DaemonSet reprogramme le pod. Pour éviter un phénomène de reprogrammation continue, le DaemonSet exécute d'abord la procédure d'initialisation dans un conteneur d'initialisation, puis laisse un conteneur en cours d'exécution.
La procédure d'initialisation suivante contient des opérations privilégiées et non privilégiées. En utilisant chroot
, vous pouvez exécuter des commandes comme si vous les exécutiez directement sur le nœud, plutôt qu'au sein d'un conteneur.
Nous vous conseillons d'examiner attentivement chaque procédure d'initialisation, car elles peuvent altérer l'état des nœuds de votre cluster. Comme ces procédures peuvent grandement affecter la disponibilité et la sécurité de vos clusters, seul un petit groupe de personnes doit être autorisé à les modifier.
Pour déployer le ConfigMap et le DaemonSet, procédez comme suit :
Dans Cloud Shell, définissez le répertoire de travail sur le répertoire
$HOME
:cd "$HOME"
Clonez le dépôt Git contenant les scripts et les fichiers manifestes pour déployer et configurer la procédure d'initialisation :
git clone https://github.com/GoogleCloudPlatform/solutions-gke-init-daemonsets-tutorial
Définissez le répertoire de travail sur le répertoire du dépôt cloné :
cd "$HOME"/solutions-gke-init-daemonsets-tutorial
Créez un ConfigMap pour contenir le script d'initialisation de nœud :
kubectl apply -f cm-entrypoint.yaml
Déployez le DaemonSet :
kubectl apply -f daemon-set.yaml
Vérifiez que l'initialisation du nœud est terminée :
kubectl get ds --watch
Attendez que le DaemonSet soit signalé comme étant prêt et à jour, comme indiqué dans le résultat suivant :
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE node-initializer 3 3 3 3 3 <none> 2h
Valider et vérifier la procédure d'initialisation
Une fois que chaque nœud du cluster associé au libellé default-init
a exécuté la procédure d'initialisation, vous pouvez vérifier les résultats.
Pour chaque nœud, la procédure vérifie si les conditions suivantes sont remplies :
- Un disque supplémentaire est associé et prêt à être utilisé.
- Le gestionnaire de packages du système d'exploitation du nœud a installé les packages et les bibliothèques.
- Les modules du noyau sont chargés.
Exécutez la procédure de vérification :
Dans Cloud Shell, exécutez le script de vérification :
kubectl get nodes -o=jsonpath='{range .items[?(@.metadata.labels.app=="default-init")]}{.metadata.name}{" "}{.metadata.labels.failure-domain\.beta\.kubernetes\.io/zone}{"\n"}{end}' | while IFS= read -r line ; do ./verify-init.sh $line < /dev/null; done
Attendez que le script s'exécute et vérifiez que chaque nœud a été correctement initialisé, comme indiqué dans le résultat suivant :
Verifying gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) configuration Disk configured successfully on gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) Packages installed successfully in gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) Kernel modules loaded successfully on gke-ds-init-tutorial-default-pool-5464b7e3-nzjm (us-central1-c) Verifying gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) configuration Disk configured successfully on gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) Packages installed successfully in gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) Kernel modules loaded successfully on gke-ds-init-tutorial-default-pool-65baf745-0gwt (us-central1-a) Verifying gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b) configuration Disk configured successfully on gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b) Packages installed successfully in gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b) Kernel modules loaded successfully on gke-ds-init-tutorial-default-pool-6b125c50-3xvl (us-central1-b)
Nettoyer
Pour éviter que les ressources utilisées ici soient facturées sur votre compte Google Cloud, vous pouvez supprimer le projet créé pour ce tutoriel. Si vous avez créé un projet dédié à ce tutoriel, vous pouvez le supprimer entièrement. Si vous avez utilisé un projet existant, mais que vous ne souhaitez pas le supprimer, procédez comme suit pour nettoyer le projet.
Nettoyer le projet
Pour nettoyer un projet sans le supprimer, vous devez supprimer les ressources que vous avez créées dans le cadre de ce tutoriel.
Dans Cloud Shell, supprimez le cluster GKE :
gcloud container clusters delete ds-init-tutorial --quiet --region us-central1
Supprimez les disques supplémentaires que vous avez créés pour cet exemple de procédure d'initialisation :
gcloud compute disks list --filter="name:additional" --format="csv[no-heading](name,zone)" | while IFS= read -r line ; do DISK_NAME="$(echo $line | cut -d',' -f1)"; ZONE="$(echo $line | cut -d',' -f2)"; gcloud compute disks delete "$DISK_NAME" --quiet --zone "$ZONE" < /dev/null; done
Supprimez le compte de service :
gcloud iam service-accounts delete "$GKE_SERVICE_ACCOUNT_EMAIL" --quiet
Supprimez le répertoire du dépôt cloné :
rm -rf "$HOME"/solutions-gke-init-daemonsets-tutorial
Supprimer le projet
Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Étape suivante
- Apprenez-en plus sur GKE.
- Mettez en œuvre une chaîne d'approvisionnement logicielle sécurisée.
- Découvrez comment renforcer la sécurité de votre cluster GKE.
- Découvrez des architectures de référence, des schémas et des bonnes pratiques concernant Google Cloud. Consultez notre Centre d'architecture cloud.