Migre imagens de contentores de um registo de terceiros

Se extrair algumas imagens de contentores diretamente de registos de terceiros para implementar em Google Cloud ambientes como o Google Kubernetes Engine ou o Cloud Run, os limites de taxa nas extrações de imagens ou as indisponibilidades de terceiros podem interromper as suas compilações e implementações. Esta página descreve como identificar e copiar essas imagens para o Artifact Registry para uma gestão de imagens de contentores consolidada e consistente.

O Artifact Registry não monitoriza registos de terceiros para atualizações de imagens que copia para o Artifact Registry. Se quiser incorporar uma versão mais recente de uma imagem no seu pipeline, tem de enviá-la para o Artifact Registry.

Vista geral da migração

A migração das suas imagens de contentores inclui os seguintes passos:

  1. Configure os pré-requisitos.
  2. Identifique as imagens a migrar.
    • Pesquise referências a registos de terceiros nos seus ficheiros Dockerfile e manifestos de implementação
    • Determine a frequência de obtenção de imagens de registos de terceiros através do Cloud Logging e do BigQuery.
  3. Copie imagens identificadas para o Artifact Registry.
  4. Verifique se as autorizações para o registo estão configuradas corretamente, especialmente se o Artifact Registry e o seu ambiente de implementação Google Cloud estiverem em projetos diferentes.
  5. Atualize os manifestos para as suas implementações.
  6. Volte a implementar as suas cargas de trabalho.

Antes de começar

  1. 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.
  2. Install the Google Cloud CLI.

  3. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  8. Install the Google Cloud CLI.

  9. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

  10. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  11. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  14. Se não tiver um repositório do Artifact Registry, então: crie um repositório e configure a autenticação para clientes de terceiros que requerem acesso ao repositório.
  15. Valide as suas autorizações. Tem de ter a função do IAM de proprietário ou editor nos projetos para os quais está a migrar imagens para o Artifact Registry.
  16. Exporte as seguintes variáveis de ambiente:
    export PROJECT=$(gcloud config get-value project)
  17. Verifique se tem a versão 1.13 ou mais recente do Go instalada.
    go version
    Se precisar de instalar ou atualizar o Go, consulte a documentação de instalação do Go.
  18. Custos

    Este guia usa os seguintes componentes faturáveis do Google Cloud:

    Identifique imagens a migrar

    Pesquise nos ficheiros que usa para criar e implementar as suas imagens de contentores referências a registos de terceiros e, em seguida, verifique a frequência com que extrai as imagens.

    Identifique referências em Dockerfiles

    Execute este passo numa localização onde os seus Dockerfiles estão armazenados. É possível que seja aqui que o seu código é verificado localmente ou no Cloud Shell se os ficheiros estiverem disponíveis numa VM.

    No diretório com os seus Dockerfiles, execute o comando:

    grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    

    O resultado tem o seguinte aspeto:

    ./code/build/baseimage/Dockerfile:1:FROM debian:stretch
    ./code/build/ubuntubase/Dockerfile:1:FROM ubuntu:latest
    ./code/build/pythonbase/Dockerfile:1:FROM python:3.5-buster
    

    Este comando pesquisa todos os Dockerfiles no seu diretório e identifica a linha "FROM". Ajuste o comando conforme necessário para corresponder à forma como armazena os seus Dockerfiles.

    Identifique referências em manifestos

    Execute estes passos numa localização onde os seus manifestos do GKE ou do Cloud Run estão armazenados. É possível que seja aqui que o código é verificado localmente ou no Cloud Shell se os ficheiros estiverem disponíveis numa VM.
    1. No diretório com os seus manifestos do GKE ou do Cloud Run, execute o seguinte comando:
      grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
      O resultado é semelhante ao seguinte:
          ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc
          ./code/deploy/k8s/master.yaml:26:      image: kubernetes/redis:v1
          
      Este comando analisa todos os ficheiros YAML no seu diretório e identifica a linha image:. Ajuste o comando conforme necessário para funcionar com a forma como os seus manifestos são armazenados
    2. Para apresentar uma lista de imagens em execução num cluster, execute o seguinte comando:
      kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
      Este comando devolve todos os objetos em execução no cluster do Kubernetes selecionado e obtém os respetivos nomes de imagens. O resultado é semelhante ao seguinte:
          - image: nginx
            image: nginx:latest
              - image: nginx
              - image: nginx
          

    Execute os comandos anteriores para todos os clusters do GKE em todos os Google Cloud projetos para uma cobertura total.

    Identifique a frequência de obtenção de dados de um registo de terceiros

    Em projetos que extraem de registos de terceiros, use informações sobre a frequência de extração de imagens para determinar se a sua utilização está perto ou acima de quaisquer limites de taxa que o registo de terceiros aplique.

    Recolha dados de registo

    Crie um destino de registos para exportar dados para o BigQuery. Um destino de registos inclui um destino e uma consulta que seleciona as entradas de registo a exportar. Pode criar um destino consultando projetos individuais ou usar um script para recolher dados em vários projetos.

    Para criar um destino para um único projeto:

    1. Na Google Cloud consola, aceda à página Explorador de registos:

      Aceda ao Explorador de registos

      Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cuja legenda é Registo.

    2. Escolha um Google Cloud projeto.

    3. No separador Criador de consultas, introduza a seguinte consulta:

        resource.type="k8s_pod"
        jsonPayload.reason="Pulling"
      
    4. Altere o filtro do histórico de alterações de Última hora para Últimos 7 dias. imagem

    5. Clique em Executar consulta.

    6. Depois de verificar que os resultados são apresentados corretamente, clique em Ações > Criar destino.

    7. Na caixa de diálogo Detalhes da sincronização, conclua o seguinte:

      1. No campo Nome do destino, introduza image_pull_logs.
      2. Na Descrição do destino, introduza uma descrição do destino.
    8. Clicar em Seguinte.

    9. Na caixa de diálogo Destino de sincronização, selecione os seguintes valores:

      1. No campo Selecionar serviço de destino, selecione Conjunto de dados do BigQuery.
      2. No campo Selecionar conjunto de dados do BigQuery, selecione Criar um novo conjunto de dados do BigQuery e preencha as informações necessárias na caixa de diálogo que é aberta. Para mais informações sobre como criar um conjunto de dados do BigQuery, consulte o artigo Criar conjuntos de dados.
      3. Clique em Criar conjunto de dados.
    10. Clicar em Seguinte.

      Na secção Escolha os registos a incluir no destino, a consulta corresponde à consulta que executou no separador Criador de consultas.

    11. Clicar em Seguinte.

    12. Opcional: escolha os registos a filtrar da entrada. Para mais informações sobre como consultar e filtrar dados do Cloud Logging, consulte o idioma de consulta do Logging.

    13. Clique em Criar destino.

      O destino de registo é criado.

    Para criar um destino para vários projetos:

    1. Abra o Cloud Shell.

    2. Execute os seguintes comandos no Cloud Shell:

      PROJECTS="PROJECT-LIST"
      DESTINATION_PROJECT="DATASET-PROJECT"
      DATASET="DATASET-NAME"
      
      for source_project in $PROJECTS
      do
        gcloud logging --project="${source_project}" sinks create image_pull_logs bigquery.googleapis.com/projects/${DESTINATION_PROJECT}/datasets/${DATASET} --log-filter='resource.type="k8s_pod" jsonPayload.reason="Pulling"'
      done
      

      onde

      • PROJECT-LIST é uma lista de Google Cloud IDs de projetos, separados por espaços. Por exemplo, project1 project2 project3.
      • DATASET-PROJECT é o projeto onde quer armazenar o seu conjunto de dados.
      • DATASET-NAME é o nome do conjunto de dados, por exemplo, image_pull_logs.

    Depois de criar um destino, os dados demoram algum tempo a fluir para as tabelas do BigQuery, consoante a frequência com que as imagens são extraídas.

    Consulta para a frequência de extração

    Assim que tiver uma amostra representativa de obtenções de imagens que as suas compilações fazem, execute uma consulta para a frequência de obtenção.

    1. Aceda à consola do BigQuery.

    2. Execute a seguinte consulta:

      SELECT
        REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
        COUNT(*) AS numberOfPulls
      FROM
            `DATASET-PROJECT.DATASET-NAME.events_*`
      GROUP BY
            imageName
      ORDER BY
            numberOfPulls DESC
      

      onde

      • DATASET-PROJECT é o projeto que contém o seu conjunto de dados.
      • DATASET-NAME é o nome do conjunto de dados.
    O exemplo seguinte mostra a saída da consulta. Na coluna imageName, pode rever a frequência de obtenção de imagens que não estão armazenadas no Artifact Registry nem no Container Registry.

    imagem

    Copie imagens para o Artifact Registry

    Depois de identificar as imagens de registos de terceiros, pode copiá-las para o Artifact Registry. A ferramenta gcrane ajuda no processo de cópia.

    1. Crie um ficheiro de texto images.txt com os nomes das imagens que identificou. Por exemplo:

      ubuntu:18.04
      debian:buster
      hello-world:latest
      redis:buster
      jupyter/tensorflow-notebook
      
    2. Transfira gcrane.

        GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
      
    3. Crie um script com o nome copy_images.sh para copiar a sua lista de ficheiros.

      #!/bin/bash
      
      images=$(cat images.txt)
      
      if [ -z "${AR_PROJECT}" ]
      then
          echo ERROR: AR_PROJECT must be set before running this
          exit 1
      fi
      
      for img in ${images}
      do
          gcrane cp ${img} LOCATION-docker.pkg.dev/${AR_PROJECT}/${img}
      done
      

      Substitua LOCATION pela localização regional ou multirregional do repositório.

      Torne o script executável:

        chmod +x copy_images.sh
      
    4. Execute o script para copiar os ficheiros:

      AR_PROJECT=${PROJECT}
      ./copy_images.sh
      

    Valide as autorizações

    Certifique-se de que as autorizações estão configuradas corretamente antes de atualizar e implementar novamente as suas cargas de trabalho.

    Para mais informações, consulte a documentação sobre o controlo de acesso.

    Atualize os manifestos para referenciar o Artifact Registry

    Atualize os seus Dockerfiles e manifestos para fazer referência ao Artifact Registry em vez do registo de terceiros.

    O exemplo seguinte mostra um manifesto que faz referência a um registo de terceiros:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.14.2
            ports:
            - containerPort: 80
    

    Esta versão atualizada do manifesto aponta para uma imagem em us-docker.pkg.dev.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: us-docker.pkg.dev/<AR_PROJECT>/nginx:1.14.2
            ports:
            - containerPort: 80
    

    Para um grande número de manifestos, use o comando sed ou outra ferramenta que possa processar atualizações em vários ficheiros de texto.

    Volte a implementar cargas de trabalho

    Volte a implementar cargas de trabalho com os manifestos atualizados.

    Acompanhe as novas obtenções de imagens executando a seguinte consulta na consola do BigQuery:

    SELECT`
    
    FORMAT_TIMESTAMP("%D %R", timestamp) as timeOfImagePull,
    REGEXP_EXTRACT(jsonPayload.message, r'"(.*?)"') AS imageName,
    COUNT(*) AS numberOfPulls
    FROM
      `image_pull_logs.events_*`
    GROUP BY
      timeOfImagePull,
      imageName
    ORDER BY
      timeOfImagePull DESC,
      numberOfPulls DESC
    

    Todas as novas obtenções de imagens devem ser do Artifact Registry e conter a string docker.pkg.dev.