Migrer depuis Docker vers des images de nœuds containerd


Cette page explique comment migrer vos clusters et pools de nœuds standards Google Kubernetes Engine (GKE) vers des images de nœuds utilisant l'environnement d'exécution des conteneurs containerd.

Présentation

Les nœuds Kubernetes utilisent l'environnement d'exécution de conteneurs pour lancer, gérer et arrêter les conteneurs s'exécutant dans les pods. L'environnement d'exécution containerd est un environnement d'exécution de conteneur standard compatible avec GKE.

L'environnement d'exécution containerd fournit l'abstraction de couche qui permet la mise en œuvre d'un ensemble complet de fonctionnalités telles que gVisor et le streaming d'images pour étendre les fonctionnalités de GKE. L'environnement d'exécution containerd est considéré comme étant plus économe en ressources et plus sécurisé que l'environnement d'exécution Docker.

Pour migrer l'environnement d'exécution du conteneur, procédez comme suit:

  • Identifier les nœuds qui utilisent l'environnement d'exécution Docker
  • Vérifier l'impact de la migration
  • Modifier l'image de nœud

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é gcloud CLI, assurez-vous de disposer de la dernière version en exécutant la commande gcloud components update.

Identifier les nœuds qui utilisent l'environnement d'exécution Docker

Vous pouvez vérifier les nœuds qui utilisent des images de nœud basées sur Docker à l'aide des méthodes suivantes:

  • Utilisez un script pour effectuer une itération sur tous les nœuds de tous les clusters GKE de votre projet Google Cloud.
  • Utilisez Google Cloud CLI, kubectl ou Google Cloud Console pour identifier les images de nœuds.
  • Utilisez les insights et recommandations d'obsolescence pour identifier les clusters et les nœuds dans des zones ou des régions spécifiques d'un projet Google Cloud.

Nous vous recommandons d'utiliser un script pour identifier rapidement tous les nœuds que vous devez migrer.

Utiliser un script pour identifier les nœuds Docker

Le script suivant effectue une itération sur tous les nœuds de chaque cluster dans vos projets disponibles et vous fournit des recommandations exploitables, telles que:

Le script ignore les clusters GKE Autopilot, qui utilisent par défaut Container-Optimized OS avec l'image de nœud containerd.

Exécutez le script suivant :

for project in $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId: $project"
  for clusters in $( \
    gcloud container clusters list \
      --project $project \
      --format="csv[no-heading](name,location,autopilot.enabled,currentMasterVersion,autoscaling.enableNodeAutoprovisioning,autoscaling.autoprovisioningNodePoolDefaults.imageType)")
  do
    IFS=',' read -r -a clustersArray <<< "$clusters"
    cluster_name="${clustersArray[0]}"
    cluster_zone="${clustersArray[1]}"
    cluster_isAutopilot="${clustersArray[2]}"
    cluster_version="${clustersArray[3]}"
    cluster_minorVersion=${cluster_version:0:4}
    cluster_autoprovisioning="${clustersArray[4]}"
    cluster_autoprovisioningImageType="${clustersArray[5]}"

    if [ "$cluster_isAutopilot" = "True" ]; then
      echo "  Cluster: $cluster_name (autopilot) (zone: $cluster_zone)"
      echo "    Autopilot clusters are running Containerd."
    else
      echo "  Cluster: $cluster_name (zone: $cluster_zone)"

      if [ "$cluster_autoprovisioning" = "True" ]; then
        if [ "$cluster_minorVersion"  \< "1.20" ]; then
          echo "    Node autoprovisioning is enabled, and new node pools will have image type 'COS'."
          echo "    This settings is not configurable on the current version of a cluster."
          echo "    Please upgrade you cluster and configure the default node autoprovisioning image type."
          echo "    "
        else
          if [ "$cluster_autoprovisioningImageType" = "COS" ]; then
            echo "    Node autoprovisioning is configured to create new node pools of type 'COS'."
            echo "    Run the following command to update:"
            echo "    gcloud container clusters update '$cluster_name' --project '$project' --zone '$cluster_zone' --enable-autoprovisioning --autoprovisioning-image-type='COS_CONTAINERD'"
            echo "    "
          fi

          if [ "$cluster_autoprovisioningImageType" = "UBUNTU" ]; then
            echo "    Node autoprovisioning is configured to create new node pools of type 'UBUNTU'."
            echo "    Run the following command to update:"
            echo "    gcloud container clusters update '$cluster_name' --project '$project' --zone '$cluster_zone' --enable-autoprovisioning --autoprovisioning-image-type='UBUNTU_CONTAINERD'"
            echo "    "
          fi
        fi
      fi

      for nodepools in $( \
        gcloud container node-pools list \
          --project $project \
          --cluster $cluster_name \
          --zone $cluster_zone \
          --format="csv[no-heading](name,version,config.imageType)")
      do
        IFS=',' read -r -a nodepoolsArray <<< "$nodepools"
        nodepool_name="${nodepoolsArray[0]}"
        nodepool_version="${nodepoolsArray[1]}"
        nodepool_imageType="${nodepoolsArray[2]}"

        nodepool_minorVersion=${nodepool_version:0:4}

        echo "    Nodepool: $nodepool_name, version: $nodepool_version ($nodepool_minorVersion), image: $nodepool_imageType"

        minorVersionWithRev="${nodepool_version/-gke./.}"
        linuxGkeMinVersion="1.14"
        windowsGkeMinVersion="1.21.1.2200"

        suggestedImageType="COS_CONTAINERD"

        if [ "$nodepool_imageType" = "UBUNTU" ]; then
          suggestedImageType="UBUNTU_CONTAINERD"
        elif [ "$nodepool_imageType" = "WINDOWS_LTSC" ]; then
          suggestedImageType="WINDOWS_LTSC_CONTAINERD"
        elif [ "$nodepool_imageType" = "WINDOWS_SAC" ]; then
          suggestedImageType="WINDOWS_SAC_CONTAINERD"
        fi

        tab=$'\n      ';
        nodepool_message="$tab Please update the nodepool to use Containerd."
        nodepool_message+="$tab Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues."
        nodepool_message+="$tab Run the following command to upgrade:"
        nodepool_message+="$tab "
        nodepool_message+="$tab gcloud container clusters upgrade '$cluster_name' --project '$project' --zone '$cluster_zone' --image-type '$suggestedImageType' --node-pool '$nodepool_name'"
        nodepool_message+="$tab "

        # see https://cloud.google.com/kubernetes-engine/docs/concepts/node-images
        if [ "$nodepool_imageType" = "COS_CONTAINERD" ] || [ "$nodepool_imageType" = "UBUNTU_CONTAINERD" ] ||
           [ "$nodepool_imageType" = "WINDOWS_LTSC_CONTAINERD" ] || [ "$nodepool_imageType" = "WINDOWS_SAC_CONTAINERD" ]; then
          nodepool_message="$tab Nodepool is using Containerd already"
        elif ( [ "$nodepool_imageType" = "WINDOWS_LTSC" ] || [ "$nodepool_imageType" = "WINDOWS_SAC" ] ) &&
               [ "$(printf '%s\n' "$windowsGkeMinVersion" "$minorVersionWithRev" | sort -V | head -n1)" != "$windowsGkeMinVersion" ]; then
          nodepool_message="$tab Upgrade nodepool to the version that supports Containerd for Windows"
        elif [ "$(printf '%s\n' "$linuxGkeMinVersion" "$minorVersionWithRev" | sort -V | head -n1)" != "$linuxGkeMinVersion" ]; then
          nodepool_message="$tab Upgrade nodepool to the version that supports Containerd"
        fi
        echo "$nodepool_message"
      done
    fi # not autopilot
  done
done

# Sample output:
#
# ProjectId:  my-project-id
#  Cluster: autopilot-cluster-1 (autopilot) (zone: us-central1)
#    Autopilot clusters are running Containerd.
#  Cluster: cluster-1 (zone: us-central1-c)
#    Nodepool: default-pool, version: 1.18.12-gke.1210 (1.18), image: COS
#
#       Please update the nodepool to use Containerd.
#       Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues.
#       Run the following command to upgrade:
#
#       gcloud container clusters upgrade 'cluster-1' --project 'my-project-id' --zone 'us-central1-c' --image-type 'COS_CONTAINERD' --node-pool 'default-pool'
#
#    Nodepool: pool-1, version: 1.18.12-gke.1210 (1.18), image: COS
#
#       Please update the nodepool to use Containerd.
#       Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues.
#       Run the following command to upgrade:
#
#       gcloud container clusters upgrade 'cluster-1' --project 'my-project-id' --zone 'us-central1-c' --image-type 'COS_CONTAINERD' --node-pool 'pool-1'
#
#    Nodepool: winpool, version: 1.18.12-gke.1210 (1.18), image: WINDOWS_SAC
#
#       Upgrade nodepool to the version that supports Containerd for Windows
#
#  Cluster: another-test-cluster (zone: us-central1-c)
#    Nodepool: default-pool, version: 1.20.4-gke.400 (1.20), image: COS_CONTAINERD
#
#      Nodepool is using Containerd already
#

Identifier les images de nœuds à l'aide de Google Cloud

Vous pouvez vérifier les images de nœuds des nœuds existants à l'aide de Google Cloud CLI, de kubectl ou de la console Google Cloud.

gcloud

Exécutez la commande suivante :

gcloud container node-pools list \
    --cluster=CLUSTER_NAME \
    --format="table(name,version,config.imageType)"

Remplacez CLUSTER_NAME par le nom de votre cluster.

Le résultat ressemble à ce qui suit :

NAME          NODE_VERSION    IMAGE_TYPE
default-pool  1.19.6-gke.600  UBUNTU

Console

  1. Accédez à la page Google Kubernetes Engine dans Google Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez vérifier.

  3. Sélectionnez l'onglet Nœuds.

  4. Dans la section Pools de nœuds, vérifiez la valeur indiquée dans la colonne Type d'image.

kubectl

Exécutez la commande suivante :

kubectl get nodes -o wide

Le résultat ressemble à ce qui suit :

# For Docker runtime
NAME         STATUS   VERSION             OS-IMAGE                             CONTAINER-RUNTIME
gke-node-1   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
gke-node-2   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
gke-node-3   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1

La valeur de la colonne CONTAINER-RUNTIME indique l'environnement d'exécution et la version.

Identifier les clusters à l'aide des insights et recommandations concernant les abandons

GKE détecte l'utilisation de certaines fonctionnalités et API obsolètes, y compris les images de nœuds basées sur Docker. Pour en savoir plus, consultez la page Abandons de GKE.

Dans le cadre de la détection de l'utilisation des abandons, GKE génère des insights et des recommandations qui identifient l'utilisation des images de nœuds basées sur Docker avec le sous-type d'insights DEPRECATION_K8S_1_24_DOCKERSHIM.

Une combinaison d'insight et de recommandation identifie un cluster comportant des nœuds qui utilisent des images de nœud basées sur Docker. Chaque insight et recommandation fournit une liste des pools de nœuds spécifiques d'un cluster qui utilisent des images de nœuds basées sur Docker et doivent être migrés vers des images de nœuds containerd.

Pour commencer, suivez les instructions permettant d'afficher les insights et recommandations liés aux abandons. Pour les commandes de gcloud CLI, utilisez l'option suivante pour n'afficher que les insights sur cet abandon:

--filter="insightSubtype:DEPRECATION_K8S_1_24_DOCKERSHIM"

Une fois que vous avez identifié les pools de nœuds du cluster qui utilisent des images de nœuds basées sur Docker, suivez les instructions pour remplacer l'image de nœud par une image de nœud containerd.

Vérifier l'impact de la migration

Avant de migrer vos clusters et pools de nœuds de production vers des images de nœuds utilisant containerd, nous vous recommandons vivement de tester l'impact de la migration dans un environnement de préproduction afin de minimiser le risque de problèmes.

Lorsque vous migrez les nœuds, nous vous recommandons de séparer la migration de la mise à niveau des nœuds, afin de pouvoir isoler les variables au moment de vérifier le bon fonctionnement de la charge de travail avec la nouvelle configuration. En outre, si vous effectuez en même temps la mise à niveau du pool de nœuds vers la version 1.24, tout rollback de ce changement devient impossible, car la version 1.24 n'est pas compatible avec les nœuds Docker et vous ne pouvez pas rétrograder les versions mineures.

Remplacer l'image de nœud par une image containerd

Si vous avez utilisé le script pour identifier vos nœuds Docker, vous pouvez utiliser les commandes suggérées renvoyées par le script pour modifier les paramètres de provisionnement automatique des nœuds et les images de nœud vers les équivalents containerd.

Vous pouvez également migrer des nœuds depuis un type d'image Docker vers un type d'image containerd en mettant à jour le pool de nœuds et en définissant une autre image à l'aide de gcloud CLI ou de la console Google Cloud.

GKE utilise la stratégie et la configuration sélectionnées de mise à niveau de nœuds pour migrer l'image d'un nœud. Pour cette migration, nous vous recommandons d'utiliser la stratégie de mise à niveau bleu-vert : si vos charges de travail rencontrent des problèmes avec la nouvelle image de nœud lors de la mise à niveau, vous pouvez effectuer un rollback vers l'environnement précédent avec la configuration d'origine de l'image de nœud.

gcloud

Exécutez la commande ci-dessous.

gcloud container clusters upgrade CLUSTER_NAME \
    --image-type=NODE_IMAGE \
    --node-pool=POOL_NAME \
    --cluster-version=NODE_VERSION

Remplacez les éléments suivants :

  • NODE_IMAGE: image de nœud que les nœuds doivent utiliser.
  • POOL_NAME : nom du pool de nœuds à migrer.
  • NODE_VERSION : version existante du pool de nœuds. Il est recommandé d'activer cette option car, dans le cas contraire, GKE tente de mettre à niveau la version du pool de nœuds vers la version du plan de contrôle et de mettre à jour l'image du nœud au cours de la même opération. Si le plan de contrôle exécute la version 1.24, la commande échoue. Si le plan de contrôle exécute la version 1.23, la commande aboutit, ce qui vous empêche de tester les deux modifications (mise à niveau de la version et mise à jour de l'image) de manière isolée.

Le résultat ressemble à ce qui suit :

NAME          NODE_VERSION    IMAGE_TYPE
default-pool  1.23.6-gke.600  UBUNTU_CONTAINERD

Console

  1. Accédez à la page Google Kubernetes Engine dans Google Cloud Console.

    Accéder à Google Kubernetes Engine

  2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez vérifier.

  3. Cliquez sur l'onglet Nœuds.

  4. Dans la section Pools de nœuds, cliquez sur le nom du pool de nœuds que vous souhaitez modifier.

  5. Sur la page Détails du pool de nœuds, cliquez sur Modifier.

  6. Dans la section Nœuds, sous Type d'image, cliquez sur Modifier.

  7. Sélectionnez l'un des types d'images containerd.

  8. Cliquez sur Modifier.

Effectuer un rollback vers les images de nœuds Docker

Si vos nœuds ont été migrés automatiquement ou manuellement vers des nœuds containerd et que vous avez constaté un problème avec vos charges de travail, procédez comme suit pour revenir aux images de nœuds Docker :

  1. Choisissez l'étape suivante en fonction de l'état de l'opération :
  2. Configurez une exclusion de maintenance pour empêcher temporairement GKE de relancer la migration.
  3. Examinez la cause première du problème afin de pouvoir migrer depuis Docker et vous assurer que votre cluster exécute une version compatible de GKE.
  4. Essayez à nouveau de remplacer l'image de nœud par une image containerd. Si vous supprimez l'exclusion de maintenance, GKE déclenche à nouveau l'opération.

Mettre à jour les configurations des outils IaC (Infrastructure as Code)

Si vous utilisez des outils IaC tels que Terraform, Ansible ou Pulumi pour gérer les clusters GKE, veillez à mettre à jour vos configurations pour qu'elles utilisent des images de nœuds containerd, afin d'empêcher les outils de rapprocher l'état précédemment souhaité avec nouvel état réel. Par exemple, le fournisseur Terraform pour GKE accepte les types d'images configurables.

Mettez à jour les configurations afin que l'outil ne rétablisse pas l'image de nœud vers une image de nœud basée sur Docker après avoir migré vers des images de nœuds containerd.

Modifier l'image de nœud par défaut pour le provisionnement automatique des nœuds

Si vous utilisez le provisionnement automatique des nœuds dans votre cluster, remplacez le type d'image par défaut par une image de nœud containerd. La modification du type d'image par défaut ne s'applique qu'aux nouveaux pools de nœuds provisionnés automatiquement. Vous devez modifier manuellement l'image de nœud pour les pools de nœuds provisionnés automatiquement existants.

Vous pouvez modifier le type d'image de provisionnement automatique des nœuds par défaut à l'aide de gCloud CLI ou d'un fichier de configuration.

gcloud

Exécutez la commande ci-dessous.

gcloud container clusters update CLUSTER_NAME \
    --enable-autoprovisioning \
    --autoprovisioning-image-type=IMAGE_TYPE

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du cluster à mettre à jour.
  • IMAGE_TYPE : le type d'image de nœud, qui peut être l'un des éléments suivants :

    • cos_containerd
    • ubuntu_containerd

Fichier

Vous pouvez utiliser un fichier de configuration YAML pour modifier le type d'image de nœud par défaut pour le provisionnement automatique des nœuds. Lorsque vous utilisez un fichier, vous devez également spécifier des valeurs maximales pour les ressources de processeur et de mémoire.

  1. Enregistrez le fichier YAML suivant:

    resourceLimits:
      - resourceType: 'cpu'
          minimum: 4
          maximum: 10
      - resourceType: 'memory'
          maximum: 64
    autoprovisioningNodePoolDefaults:
      imageType: 'IMAGE_TYPE'
    

    Remplacez IMAGE_TYPE par le type d'image containerd.

  2. Appliquez la configuration :

    gcloud container clusters update CLUSTER_NAME \
        --enable-autoprovisioning \
        --autoprovisioning-config-file=FILE_NAME
    

    Remplacez FILE_NAME par le chemin d'accès au fichier de configuration.

Dépannage

Pour le dépannage et les problèmes connus liés aux solutions de contournement, reportez-vous à la section Dépannage de l'environnement d'exécution des conteneurs.

Étape suivante