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:
- Configure os pré-requisitos.
- 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.
- Copie imagens identificadas para o Artifact Registry.
- 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.
- Atualize os manifestos para as suas implementações.
- Volte a implementar as suas cargas de trabalho.
Antes de começar
- 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.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
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.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
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.
-
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com
- 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.
- 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.
- Exporte as seguintes variáveis de ambiente:
export PROJECT=$(gcloud config get-value project)
- Verifique se tem a versão 1.13 ou mais recente do Go instalada.
Se precisar de instalar ou atualizar o Go, consulte a documentação de instalação do Go.go version
- No diretório com os seus manifestos do GKE ou do Cloud Run, execute o seguinte comando:
O resultado é semelhante ao seguinte:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.pkg.dev|gcr.io'
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./code/deploy/k8s/ubuntu16-04.yaml:63: image: busybox:1.31.1-uclibc ./code/deploy/k8s/master.yaml:26: image: kubernetes/redis:v1
- Para apresentar uma lista de imagens em execução num cluster, execute o seguinte comando:
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:kubectl get all --all-namespaces -o yaml | grep image: | grep -i -v -E 'docker.pkg.dev|gcr.io'
- image: nginx image: nginx:latest - image: nginx - image: nginx
-
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.
Escolha um Google Cloud projeto.
No separador Criador de consultas, introduza a seguinte consulta:
resource.type="k8s_pod" jsonPayload.reason="Pulling"
Altere o filtro do histórico de alterações de Última hora para Últimos 7 dias.
Clique em Executar consulta.
Depois de verificar que os resultados são apresentados corretamente, clique em Ações > Criar destino.
Na caixa de diálogo Detalhes da sincronização, conclua o seguinte:
- No campo Nome do destino, introduza
image_pull_logs
. - Na Descrição do destino, introduza uma descrição do destino.
- No campo Nome do destino, introduza
Clicar em Seguinte.
Na caixa de diálogo Destino de sincronização, selecione os seguintes valores:
- No campo Selecionar serviço de destino, selecione Conjunto de dados do BigQuery.
- 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.
- Clique em Criar conjunto de dados.
Clicar em Seguinte.
Na secção Escolha os registos a incluir no destino, a consulta corresponde à consulta que executou no separador Criador de consultas.
Clicar em Seguinte.
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.
Clique em Criar destino.
O destino de registo é criado.
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
.
- PROJECT-LIST é uma lista de Google Cloud IDs de projetos,
separados por espaços. Por exemplo,
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.
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
Transfira gcrane.
GO111MODULE=on go get github.com/google/go-containerregistry/cmd/gcrane
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
Execute o script para copiar os ficheiros:
AR_PROJECT=${PROJECT} ./copy_images.sh
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.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:
Para criar um destino para vários projetos:
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.
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.
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
.