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 Trusted Cloud by S3NS estiverem em projetos diferentes.
- Atualize os manifestos para as suas implementações.
- Volte a implementar as suas cargas de trabalho.
Antes de começar
-
Install the Google Cloud CLI.
-
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.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
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.
-
-
Verify that billing is enabled for your Trusted 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, execute o seguinte comando:
O resultado é semelhante ao seguinte:grep -inr -H --include \*.yaml "image:" . | grep -i -v -E 'docker.s3nsregistry.fr'
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
- 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.s3nsregistry.fr'
- image: nginx image: nginx:latest - image: nginx - image: nginx
-
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.
Escolha um Trusted 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 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
.
- PROJECT-LIST é uma lista de Trusted 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.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
Execute o script para copiar os ficheiros:
AR_PROJECT=${PROJECT} ./copy_images.sh
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.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:
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.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
.