Migre imagens de contentores de um registo de terceiros

Se extrair algumas imagens de contentores diretamente de registos de terceiros para implementar em Trusted Cloud by S3NS ambientes como o Google Kubernetes Engine, 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 Trusted Cloud by S3NS 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. Install the Google Cloud CLI.

  2. Configure a CLI gcloud para usar a sua identidade federada.

    Para mais informações, consulte o artigo Inicie sessão na CLI gcloud com a sua identidade federada.

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

    gcloud init
  4. Create or select a Trusted Cloud project.

    • Create a Trusted Cloud project:

      gcloud projects create PROJECT_ID

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

    • Select the Trusted Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Trusted Cloud project name.

  5. Verify that billing is enabled for your Trusted Cloud project.

  6. Enable the Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com
  7. 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.
  8. 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.
  9. Exporte as seguintes variáveis de ambiente:
    export PROJECT=$(gcloud config get-value project)
  10. 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.
  11. Custos

    Este guia usa os seguintes componentes faturáveis do Trusted 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. Este pode ser o local onde o seu código é verificado localmente.

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

    grep -inr -H --include Dockerfile\* "FROM" . | grep -i -v -E 'docker.s3nsregistry.fr'
    

    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 estão armazenados. Este pode ser o local onde o seu código é verificado localmente.
    1. No diretório com os seus manifestos do GKE, execute o seguinte comando:
      grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.s3nsregistry.fr'
      O resultado é semelhante ao seguinte:
          ./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31
          
      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.s3nsregistry.fr'
      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 Trusted 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 Trusted 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 Trusted 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.

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

    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.s3nsregistry.fr/${AR_PROJECT}/${img}
      done
      

      Substitua LOCATION pela localização regional 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.s3nsregistry.fr.

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