Esegui la migrazione da Docker alle immagini dei nodi containerd


Questa pagina mostra come eseguire la migrazione del cluster Google Kubernetes Engine (GKE) Standard e dei pool di nodi da Docker alle immagini dei nodi che utilizzano il runtime del container containerd.

Panoramica

I nodi Kubernetes utilizzano il runtime del container per avviare, gestire e arrestare i container in esecuzione nei pod. Il runtime containerd è un runtime dei container standard di settore supportato da GKE.

Il runtime containerd fornisce l'astrazione di layering che consente l'implementazione di un ricco set di funzionalità come gVisor e Image Streaming per estendere la funzionalità di GKE. Il runtime Containerd è considerato più efficiente e sicuro del runtime Docker.

Per eseguire la migrazione del runtime del container:

  • Identificare i nodi che utilizzano il runtime Docker
  • Verificare l'impatto della migrazione
  • Modificare l'immagine del nodo

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.

Identificare i nodi che utilizzano il runtime Docker

Puoi controllare quali nodi utilizzano immagini dei nodi basate su Docker utilizzando i seguenti metodi:

  • Utilizza uno script per scorrere tutti i nodi di tutti i cluster GKE nel tuo progetto Google Cloud .
  • Utilizza Google Cloud CLI, kubectl o la console Google Cloud per identificare le immagini dei nodi.
  • Utilizza approfondimenti e consigli sul ritiro per identificare cluster e nodi in zone o regioni specifiche di un progettoGoogle Cloud .

Ti consigliamo di utilizzare uno script per identificare rapidamente tutti i nodi di cui devi eseguire la migrazione.

Utilizzare uno script per identificare i nodi Docker

Il seguente script esegue l'iterazione su ogni nodo di ogni cluster nei tuoi progetti disponibili e ti fornisce consigli pratici, ad esempio:

  • Se il provisioning automatico dei nodi è configurato per le immagini Docker
  • Equivalenti suggeriti dell'immagine del nodo containerd per la migrazione
  • Versioni dell'immagine nodo suggerite per la migrazione
  • Comandi suggeriti da eseguire per eseguire la migrazione dei nodi e delle impostazioni identificati

Lo script ignora i cluster GKE Autopilot, che utilizzano per impostazione predefinita l'immagine del nodo Container-Optimized OS con Containerd.

Esegui questo script:

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
#

Identificare le immagini dei nodi utilizzando Google Cloud

Puoi controllare le immagini dei nodi esistenti utilizzando Google Cloud CLI,kubectl o la console Google Cloud .

gcloud

Esegui questo comando:

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

Sostituisci CLUSTER_NAME con il nome del cluster.

L'output è simile al seguente:

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

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da verificare.

  3. Seleziona la scheda Nodi.

  4. Nella sezione Pool di nodi, controlla il valore nella colonna Tipo di immagine.

kubectl

Esegui questo comando:

kubectl get nodes -o wide

L'output è simile al seguente:

# 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

Il valore nella colonna CONTAINER-RUNTIME mostra il runtime e la versione.

Identificare i cluster utilizzando approfondimenti e suggerimenti sul ritiro

GKE rileva l'utilizzo di alcune funzionalità e API deprecate, incluse le immagini dei nodi basate su Docker. Per saperne di più, consulta la sezione Deprecazione di funzionalità e API.

Nell'ambito del rilevamento dell'utilizzo di funzionalità ritirate, GKE genera approfondimenti e consigli che identificano l'utilizzo di immagini dei nodi basate su Docker con il sottotipo di approfondimento DEPRECATION_K8S_1_24_DOCKERSHIM.

Una coppia di insight e suggerimenti identifica un cluster con nodi che utilizzano immagini dei nodi basate su Docker. Ogni approfondimento e consiglio fornisce un elenco dei pool di nodi specifici in un cluster che utilizzano immagini dei nodi basate su Docker e devono essere migrati a immagini dei nodi basate su containerd.

Per iniziare, segui le istruzioni per visualizzare approfondimenti e consigli sul ritiro. Per i comandi gcloud CLI, utilizza il seguente flag per visualizzare solo gli approfondimenti relativi a questo ritiro:

--filter="insightSubtype:DEPRECATION_K8S_1_24_DOCKERSHIM"

Una volta identificati i pool di nodi del cluster che utilizzano immagini dei nodi basate su Docker, segui le istruzioni per modificare l'immagine del nodo in un'immagine del nodo containerd.

Verificare l'impatto della migrazione

Prima di eseguire la migrazione dei cluster di produzione e dei pool di nodi alle immagini dei nodi che utilizzano containerd, ti consigliamo vivamente di testare l'impatto della migrazione in un ambiente di staging per ridurre al minimo il rischio di problemi.

Ti consigliamo di eseguire la migrazione dei nodi in modo indipendente dall'upgrade, in modo da poter isolare le variabili durante la verifica del funzionamento dei carichi di lavoro con la nuova configurazione. Inoltre, se esegui l'upgrade del pool di nodi alla versione 1.24 contemporaneamente, non puoi eseguire il rollback della modifica perché la versione 1.24 non supporta i nodi Docker e non puoi eseguire il downgrade delle versioni secondarie.

Modifica l'immagine del nodo in un'immagine containerd

Se hai utilizzato lo script per identificare i nodi Docker, puoi utilizzare i comandi suggeriti restituiti dallo script per modificare le impostazioni di provisioning automatico dei nodi e le immagini dei nodi con gli equivalenti containerd.

Puoi anche eseguire la migrazione dei nodi da un tipo di immagine Docker a un tipo di immagine containerd aggiornando il pool di nodi e impostando un'immagine diversa utilizzando la gcloud CLI o la console Google Cloud .

GKE utilizza la strategia di upgrade dei nodi selezionata e la configurazione per eseguire la migrazione dell'immagine di un nodo. Per questa migrazione, ti consigliamo di utilizzare la strategia di upgrade blue-green perché, se i tuoi carichi di lavoro riscontrano problemi con la nuova immagine del nodo durante l'upgrade, puoi eseguire il rollback all'ambiente precedente con la configurazione dell'immagine del nodo originale.

gcloud

Esegui questo comando:

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

Sostituisci quanto segue:

  • NODE_IMAGE: l'immagine del nodo che vuoi che i nodi utilizzino.
  • POOL_NAME: il nome del pool di nodi di cui eseguire la migrazione.
  • NODE_VERSION: la versione esistente del node pool. Ti consigliamo di impostare questo flag perché altrimenti GKE tenta di eseguire l'upgrade della versione del pool di nodi alla versione del control plane e di aggiornare l'immagine del nodo nella stessa operazione. Se il control plane esegue la versione 1.24, il comando non va a buon fine. Se il piano di controllo esegue la versione 1.23, il comando ha esito positivo, il che impedisce di testare le due modifiche (upgrade della versione e aggiornamento dell'immagine) in isolamento.

L'output è simile al seguente:

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

Console

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da verificare.

  3. Fai clic sulla scheda Nodi.

  4. Nella sezione Pool di nodi, fai clic sul nome del pool di nodi che vuoi modificare.

  5. Nella pagina Dettagli del pool di nodi, fai clic su Modifica.

  6. Nella sezione Nodi, fai clic su Cambia in Tipo di immagine.

  7. Seleziona uno dei tipi di immagini containerd.

  8. Fai clic su Cambia.

Esegui il rollback alle immagini dei nodi Docker

Se è stata eseguita la migrazione automatica o manuale dei nodi a nodi containerd e si è verificato un problema con i workload, segui questi passaggi per ripristinare le immagini dei nodi Docker:

  1. Scegli il passaggio successivo in base allo stato dell'operazione:
  2. Configura un'esclusione della manutenzione per impedire temporaneamente a GKE di riprovare la migrazione.
  3. Indaga sulla causa principale del problema per poter eseguire la migrazione da Docker e assicurarti che il cluster esegua una versione supportata di GKE.
  4. Riprova a modificare l'immagine del nodo in un'immagine containerd. Se rimuovi l'esclusione della manutenzione, GKE attiverà di nuovo l'operazione.

Aggiorna le configurazioni dello strumento Infrastructure as Code (IaC)

Se utilizzi strumenti IaC come Terraform, Ansible o Pulumi per gestire i cluster GKE, assicurati di aggiornare le configurazioni in modo da utilizzare le immagini dei nodi containerd per impedire agli strumenti di riconciliare lo stato precedentemente desiderato con il nuovo stato effettivo. Ad esempio, il provider Terraform GKE supporta tipi di immagini configurabili.

Aggiorna le configurazioni in modo che lo strumento non aggiorni nuovamente l'immagine del nodo a un'immagine del nodo basata su Docker dopo la migrazione alle immagini dei nodi containerd.

Modifica l'immagine del nodo predefinita per il provisioning automatico dei nodi

Se utilizzi il provisioning automatico dei nodi nel cluster, modifica il tipo di immagine predefinito in un'immagine del nodo containerd. La modifica del tipo di immagine predefinito si applica solo ai nuovi node pool di cui è stato eseguito il provisioning automatico. Devi modificare manualmente l'immagine del nodo per i pool di nodi con provisioning automatico esistenti.

Puoi modificare il tipo di immagine di provisioning automatico dei nodi predefinito utilizzando gcloud CLI o un file di configurazione.

gcloud

Esegui questo comando:

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

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del cluster da aggiornare.
  • IMAGE_TYPE: il tipo di immagine del nodo, che può essere uno dei seguenti:

    • cos_containerd
    • ubuntu_containerd

File

Puoi utilizzare un file di configurazione YAML per modificare il tipo di immagine del nodo predefinito per il provisioning automatico dei nodi. Quando utilizzi un file, devi specificare anche i valori massimi per le risorse di CPU e memoria.

  1. Salva il seguente file YAML:

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

    Sostituisci IMAGE_TYPE con il tipo di immagine containerd.

  2. Applica la configurazione:

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

    Sostituisci FILE_NAME con il percorso del file di configurazione.

Risoluzione dei problemi

Per la risoluzione dei problemi e per i problemi noti con soluzioni alternative, consulta Risoluzione dei problemi del runtime del container.

Passaggi successivi