Migrar imagens de contêiner de um registro de terceiros

Se você extrair algumas imagens de contêiner diretamente de registros de terceiros para implantar em ambientes Google Cloud , como o Google Kubernetes Engine ou o Cloud Run, os limites de taxa em pulls de imagens ou interrupções de terceiros poderão interromper suas criações e implantações. Esta página descreve como identificar e copiar essas imagens para o Artifact Registry para um gerenciamento de imagem de contêiner consolidado e consistente.

O Artifact Registry não monitora registros de terceiros para atualizações de imagens copiadas para o Artifact Registry. Se você quiser incorporar uma versão mais recente de uma imagem ao seu pipeline, envie-a para o Artifact Registry.

Visão geral da migração

A migração das imagens de contêiner inclui as seguintes etapas:

  1. Pré-requisitos.
  2. Identifique imagens para migrar.
    • Pesquisar nos arquivos do Dockerfile e nos manifestos de implantação para fins de referência a registros de terceiros
    • Determine a frequência de pull de imagens de registros de terceiros usando o Cloud Logging e o BigQuery.
  3. Copie imagens identificadas para o Artifact Registry.
  4. Verifique se as permissões ao registro estão configuradas corretamente, especialmente se o Artifact Registry e o ambiente de implantação do Google Cloudestiverem em projetos diferentes.
  5. Atualize os manifestos das implantações.
  6. Reimplante as cargas de trabalho.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. Instale a CLI do Google Cloud.

  3. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

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

    gcloud init
  5. Crie ou selecione um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto Google Cloud que você está criando.

    • Selecione o projeto Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

  6. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  7. Ative a API Artifact Registry.

    Funções necessárias para ativar APIs

    Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (roles/serviceusage.serviceUsageAdmin), que contém a permissão serviceusage.services.enable. Saiba como conceder papéis.

    gcloud services enable artifactregistry.googleapis.com
  8. Instale a CLI do Google Cloud.

  9. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

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

    gcloud init
  11. Crie ou selecione um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto Google Cloud que você está criando.

    • Selecione o projeto Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

  12. Verifique se o faturamento está ativado para o projeto do Google Cloud .

  13. Ative a API Artifact Registry.

    Funções necessárias para ativar APIs

    Para ativar as APIs, é necessário ter o papel do IAM de administrador do Service Usage (roles/serviceusage.serviceUsageAdmin), que contém a permissão serviceusage.services.enable. Saiba como conceder papéis.

    gcloud services enable artifactregistry.googleapis.com
  14. Se você não tiver um repositório do Artifact Registry, crie um e configure a autenticação para clientes de terceiros que precisam de acesso ao repositório.
  15. Verifique suas permissões. Você precisa ter o papel de Proprietário ou Editor do IAM nos projetos em que está migrando imagens para o Artifact Registry.
  16. Exporte as seguintes variáveis de ambiente:
    export PROJECT=$(gcloud config get-value project)
  17. Verifique se o Go versão 1.13 ou mais recente está instalado.
    go version
    Se você precisar instalar ou atualizar o Go, consulte a documentação de instalação.

Custos

Neste guia, usamos os seguintes componentes faturáveis do Google Cloud:

Identificar imagens para migrar

Pesquise os arquivos que você usa para criar e implantar as imagens de contêiner para se referir a referências a registros de terceiros. Depois, verifique a frequência com que você extrai as imagens.

Identificar referências em Dockerfiles

Execute esta etapa em um local em que seus Dockerfiles estão armazenados. Pode ser aqui que o código será verificado localmente ou no Cloud Shell se os arquivos estiverem disponíveis em uma VM.

No diretório com Dockerfiles, execute o comando:

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

A resposta tem a aparência do exemplo a seguir.

./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

Esse comando pesquisa todos os Dockerfiles no seu diretório e identifica a linha "FROM". Ajuste o comando conforme necessário para corresponder à maneira como você armazena os Dockerfiles.

Identificar referências em manifestos

Execute estas etapas em um local em que seus manifestos do GKE ou do Cloud Run estão armazenados. Pode ser aqui que o código será disponibilizado localmente ou no Cloud Shell se os arquivos estiverem disponíveis em uma VM.
  1. No diretório com seus manifestos do GKE ou do Cloud Run, execute o comando a seguir:
    grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
    A saída será assim:
        ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc
        ./code/deploy/k8s/master.yaml:26:      image: kubernetes/redis:v1
        
    Esse comando analisa todos os arquivos YAML no diretório e identifica a linha image:. Ajuste o comando conforme necessário para trabalhar com a forma como os manifestos são armazenados.
  2. Para listar as imagens em execução em um cluster, execute o seguinte comando:
    kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
    Esse comando retorna todos os objetos em execução no cluster do Kubernetes selecionado e recebe os nomes das imagens. A saída será assim:
        - image: nginx
          image: nginx:latest
            - image: nginx
            - image: nginx
        

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

Identificar a frequência de pull de um registro de terceiros

Em projetos que extraem registros de terceiros, use informações sobre a frequência de extração de imagens para determinar se o uso está próximo ou acima do limite de taxa que o registro de terceiros impõe.

Coletar dados do registro

Crie um coletor de registros para exportar dados para o BigQuery. Um coletor de registro inclui um destino e uma consulta que seleciona as entradas de registro a serem exportadas. É possível criar um coletor consultando projetos individuais ou usar um script para coletar dados entre projetos.

Para criar um coletor para um único projeto:

  1. No console do Google Cloud , acesse a página Análise de registros:

    Acessar a Análise de registros

    Se você usar a barra de pesquisa para encontrar essa página, selecione o resultado com o subtítulo Logging.

  2. Escolha um projeto do Google Cloud .

  3. Na guia Criador de consultas, insira a seguinte consulta:

      resource.type="k8s_pod"
      jsonPayload.reason="Pulling"
    
  4. Filtro do histórico de alterações de Lastltima hora para Lastltimos sete dias. imagem

  5. Selecione Executar consulta.

  6. Depois de verificar se os resultados aparecem corretamente, clique em Ações > Criar coletor.

  7. Na caixa de diálogo Detalhes do coletor, faça o seguinte:

    1. No campo Nome do coletor, digite image_pull_logs.
    2. Em Descrição do coletor, insira uma descrição do coletor.
  8. Clique em Próxima.

  9. Na caixa de diálogo Destino do coletor, selecione os seguintes valores:

    1. No campo Selecionar serviço do coletor, escolha Conjunto de dados do BigQuery.
    2. No campo Selecionar conjunto de dados do BigQuery, selecione Criar um conjunto de dados do BigQuery e preencha as informações necessárias na caixa de diálogo que será aberta. Para mais informações sobre como criar um conjunto de dados do BigQuery, consulte Criar conjuntos de dados.
    3. Clique em Criar conjunto de dados.
  10. Clique em Próxima.

    Na seção Escolher registros a serem incluídos no coletor, a consulta corresponde à consulta executada na guia Criador de consultas.

  11. Clique em Próxima.

  12. Opcional: escolha os registros para excluir do coletor. Para mais informações sobre como consultar e filtrar dados do Cloud Logging, consulte Linguagem de consulta do Logging.

  13. Clique em Criar coletor.

    O coletor de registros é criado.

Para criar um coletor para vários projetos:

  1. Abra o Cloud Shell.

  2. Execute os comandos a seguir 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
    

    em que

    • PROJECT-LIST é uma lista de IDs de projeto Google Cloud , separados por espaços. Por exemplo: project1 project2 project3
    • DATASET-PROJECT é o projeto em que você quer armazenar o conjunto de dados.
    • DATASET-NAME é o nome do conjunto de dados, por exemplo, image_pull_logs;

Depois de criar um coletor, leva um tempo para que os dados fluam para as tabelas do BigQuery, dependendo da frequência com que imagens são extraídas.

Consultar frequência de pull

Depois que você tiver uma amostra representativa de pulls de imagens feitas por suas compilações, execute uma consulta para a frequência de pull.

  1. Acesse o console 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
    

    em que

    • DATASET-PROJECT é o projeto que contém seu conjunto de dados.
    • DATASET-NAME é o nome do conjunto de dados.
O exemplo a seguir mostra a saída da consulta. Na coluna imageName, é possível revisar a frequência de pull de imagens que não estão armazenadas no Artifact Registry.

imagem

Copie imagens para o Artifact Registry

Depois de identificar imagens de registros de terceiros, será possível copiá-las para o Artifact Registry. A ferramenta gcrane ajuda no processo de cópia.

  1. Crie um arquivo de texto images.txt com os nomes das imagens identificadas. Exemplo:

    ubuntu:18.04
    debian:buster
    hello-world:latest
    redis:buster
    jupyter/tensorflow-notebook
    
  2. Faça o download de gcrane.

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

    #!/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 pelo local regional ou multirregional do repositório.

    Torne o script executável:

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

    AR_PROJECT=${PROJECT}
    ./copy_images.sh
    

Verifique as permissões

Verifique se as permissões estão configuradas corretamente antes de atualizar e reimplantar as cargas de trabalho.

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

Atualizar manifestos para referenciar o Artifact Registry

Atualize seus Dockerfiles e seus manifestos para se referir ao Artifact Registry em vez do registro de terceiros.

O exemplo a seguir mostra o manifesto que referencia um registro 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

Essa 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 sed ou outra ferramenta que processe atualizações em vários arquivos de texto.

Reimplantar cargas de trabalho

Reimplante as cargas de trabalho com os manifestos atualizados.

Acompanhe os novos pulls de imagem executando a seguinte consulta no console 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

Todos os novos pulls de imagem precisam ser do Artifact Registry e conter a string docker.pkg.dev.