Migre do Docker para imagens de nós do containerd

Esta página mostra como migrar o cluster Standard e os node pools do Google Kubernetes Engine (GKE) do Docker para imagens de nós que usam o tempo de execução de contentores containerd.

Vista geral

Os nós do Kubernetes usam o tempo de execução do contentor para iniciar, gerir e parar contentores em execução em Pods. O tempo de execução do containerd é um tempo de execução de contentores em conformidade com a norma da indústria suportado pelo GKE.

O tempo de execução do containerd oferece a abstração de camadas que permite a implementação de um conjunto avançado de funcionalidades, como o gVisor e o streaming de imagens, para expandir a funcionalidade do GKE. O motor de execução do containerd é considerado mais eficiente em termos de recursos e mais seguro do que o motor de execução do Docker.

Para migrar o tempo de execução do contentor:

  • Identifique os nós que usam o tempo de execução do Docker
  • Valide o impacto da migração
  • Altere a imagem do nó

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Identifique os nós que usam o tempo de execução do Docker

Pode verificar que nós usam imagens de nós baseadas no Docker através dos seguintes métodos:

  • Use um script para iterar todos os nós em todos os clusters do GKE no seu Google Cloud projeto.
  • Use a CLI do Google Cloud, kubectl, ou a consola para identificar imagens de nós. Google Cloud
  • Use estatísticas e recomendações de descontinuação para identificar clusters e nós em zonas ou regiões específicas num Google Cloud projeto.

Recomendamos que use um script para identificar rapidamente todos os nós que precisa de migrar.

Use um script para identificar nós do Docker

O script seguinte itera todos os nós em todos os clusters nos seus projetos disponíveis e fornece recomendações acionáveis, como:

O script ignora os clusters do GKE Autopilot, que usam a imagem do nó do SO otimizado para contentores com o containerd por predefinição.

Execute o seguinte guião:

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
#

Identifique imagens de nós com Google Cloud

Pode verificar as imagens dos nós dos nós existentes através da CLI do Google Cloud, kubectl, ou da Google Cloud consola.

gcloud

Execute o seguinte comando:

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

Substitua CLUSTER_NAME pelo nome do seu cluster.

O resultado é semelhante ao seguinte:

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

Consola

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que quer validar.

  3. Selecione o separador Nós.

  4. Na secção Pools de nós, verifique o valor na coluna Tipo de imagem.

kubectl

Execute o seguinte comando:

kubectl get nodes -o wide

O resultado é semelhante ao seguinte:

# 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

O valor na coluna CONTAINER-RUNTIME mostra o tempo de execução e a versão.

Identifique clusters através de estatísticas e recomendações de descontinuação

O GKE deteta a utilização de algumas funcionalidades e APIs descontinuadas, incluindo imagens de nós baseadas no Docker. Para saber mais, consulte o artigo Descontinuações de funcionalidades e APIs.

Como parte da deteção da utilização de descontinuações, o GKE gera estatísticas e recomendações que identificam a utilização de imagens de nós baseadas no Docker com o subtipo de estatísticas DEPRECATION_K8S_1_24_DOCKERSHIM.

Uma combinação de estatísticas e recomendações identifica um cluster com nós que estão a usar imagens de nós baseadas no Docker. Cada estatística e recomendação fornece uma lista dos node pools específicos num cluster que estão a usar imagens de nós baseadas no Docker e têm de ser migrados para imagens de nós do containerd.

Para começar, siga as instruções para ver estatísticas e recomendações de descontinuação. Para os comandos da CLI gcloud, use a seguinte flag para ver apenas estatísticas sobre esta descontinuação:

--filter="insightSubtype:DEPRECATION_K8S_1_24_DOCKERSHIM"

Depois de identificar os conjuntos de nós do cluster que estão a usar imagens de nós baseadas no Docker, siga as instruções para alterar a imagem de nó para uma imagem de nó do containerd.

Valide o impacto da migração

Antes de migrar os clusters de produção e os conjuntos de nós para imagens de nós que usam o containerd, recomendamos vivamente que teste o impacto da migração num ambiente de preparação para minimizar o risco de problemas.

Recomendamos que, quando migrar os nós, o faça independentemente da atualização dos nós, para poder isolar as variáveis quando verificar se as cargas de trabalho funcionam com a nova configuração. Além disso, se atualizar o conjunto de nós para a versão 1.24 ao mesmo tempo, não pode reverter a alteração, uma vez que a versão 1.24 não suporta nós do Docker e não pode reverter versões secundárias.

Altere a imagem do nó para uma imagem do Containerd

Se usou o script para identificar os seus nós do Docker, pode usar os comandos sugeridos devolvidos pelo script para alterar as definições de aprovisionamento automático dos nós e as imagens dos nós para os equivalentes do containerd.

Também pode migrar nós de um tipo de imagem do Docker para um tipo de imagem do containerd atualizando o conjunto de nós e definindo uma imagem diferente através da CLI gcloud ou da Google Cloud consola.

O GKE usa a estratégia de atualização de nós selecionada e a configuração para migrar a imagem de um nó. Para esta migração, recomendamos que use a estratégia de atualização azul-verde porque, se as suas cargas de trabalho tiverem problemas com a nova imagem do nó durante a atualização, pode reverter para o ambiente anterior com a configuração original da imagem do nó.

gcloud

Execute o seguinte comando:

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

Substitua o seguinte:

  • NODE_IMAGE: a imagem do nó que quer que os nós usem.
  • POOL_NAME: o nome do node pool a migrar.
  • NODE_VERSION: a versão existente do conjunto de nós. Recomendamos que defina esta flag porque, caso contrário, o GKE tenta atualizar a versão do conjunto de nós para a versão do plano de controlo e atualizar a imagem do nó na mesma operação. Se o plano de controlo estiver a executar a versão 1.24, o comando falha. Se o plano de controlo estiver a ser executado na versão 1.23, o comando é bem-sucedido, o que impede que teste as duas alterações (atualização da versão e atualização da imagem) isoladamente.

O resultado é semelhante ao seguinte:

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

Consola

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceder ao Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que quer validar.

  3. Clique no separador Nós.

  4. Na secção Conjuntos de nós, clique no nome do conjunto de nós que quer modificar.

  5. Na página Detalhes do conjunto de nós, clique em Editar.

  6. Na secção Nodes, em Tipo de imagem, clique em Alterar.

  7. Selecione um dos tipos de imagens do containerd.

  8. Clique em Alterar.

Reverta para imagens de nós do Docker

Se os seus nós foram migrados automática ou manualmente para nós do containerd e detetou um problema com as suas cargas de trabalho, siga os passos abaixo para reverter para imagens de nós do Docker:

  1. Escolha o passo seguinte consoante o estado da operação:
  2. Configure uma exclusão de manutenção para impedir temporariamente que o GKE volte a tentar a migração.
  3. Investigue a causa principal do problema para poder migrar do Docker e garantir que o cluster está a executar uma versão suportada do GKE.
  4. Tente novamente alterar a imagem do nó para uma imagem do containerd. Se remover a exclusão de manutenção, o GKE aciona novamente a operação.

Atualize as configurações da ferramenta de infraestrutura como código (IaC)

Se usar ferramentas de IaC, como Terraform, Ansible ou Pulumi, para gerir clusters do GKE, certifique-se de que atualiza as suas configurações para usar imagens de nós do containerd, de modo a impedir que as ferramentas reconciliem o estado desejado anteriormente com o novo estado real. Por exemplo, o fornecedor do Terraform do GKE suporta tipos de imagens configuráveis.

Atualize todas as configurações para que a ferramenta não atualize novamente a imagem do nó para uma imagem do nó baseada no Docker depois de migrar para imagens do nó do containerd.

Altere a imagem do nó predefinida para o aprovisionamento automático dos nós

Se usar o aprovisionamento automático de nós no seu cluster, altere o tipo de imagem predefinido para uma imagem de nó do containerd. A alteração do tipo de imagem predefinido aplica-se apenas a novos conjuntos de nós aprovisionados automaticamente. Tem de alterar manualmente a imagem do nó para os conjuntos de nós aprovisionados automaticamente existentes.

Pode alterar o tipo de imagem de aprovisionamento automático de nós predefinido através da CLI gcloud ou de um ficheiro de configuração.

gcloud

Execute o seguinte comando:

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

Substitua o seguinte:

  • CLUSTER_NAME: o nome do cluster a atualizar.
  • IMAGE_TYPE: o tipo de imagem do nó, que pode ser um dos seguintes:

    • cos_containerd
    • ubuntu_containerd

Ficheiro

Pode usar um ficheiro de configuração YAML para alterar o tipo de imagem do nó predefinido para o aprovisionamento automático de nós. Quando usa um ficheiro, também tem de especificar os valores máximos para os recursos de CPU e memória.

  1. Guarde o seguinte ficheiro YAML:

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

    Substitua IMAGE_TYPE pelo tipo de imagem do containerd.

  2. Aplique a configuração:

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

    Substitua FILE_NAME pelo caminho para o ficheiro de configuração.

Resolução de problemas

Para a resolução de problemas e problemas conhecidos com soluções alternativas, consulte o artigo Resolução de problemas do tempo de execução do contentor.

O que se segue?