Nesta página, mostramos como criar e publicar sua imagem em um
repositório do Artifact Registry com crane
e oras.
É possível configurar o Config Sync para sincronizar a partir de imagens do OCI usando o Artifact Registry. Para usar esse recurso, você precisa ativar as APIs RootSync e RepoSync.
Sobre o Artifact Registry
O Artifact Registry é um serviço totalmente gerenciado compatível com imagens de contêiner e artefatos que não são contêineres. Recomendamos o Artifact Registry para armazenamento e gerenciamento de imagens de contêiner no Google Cloud. Há várias ferramentas disponíveis para enviar artefatos ao Artifact Registry. Por exemplo, é possível enviar uma imagem Docker ou usar a biblioteca go-containerregistry para trabalhar com os registros de contêiner. Escolha a ferramenta que funciona melhor para você.
Antes de começar
- 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.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
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ãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor 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_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs GKE, Config Sync e 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ãoserviceusage.services.enable. Saiba como conceder papéis.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com -
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
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ãoresourcemanager.projects.create. Saiba como conceder papéis.
-
Crie um projeto do Google Cloud :
gcloud projects create PROJECT_ID
Substitua
PROJECT_IDpor 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_IDpelo nome do projeto do Google Cloud .
-
Verifique se o faturamento está ativado para o projeto do Google Cloud .
Ative as APIs GKE, Config Sync e 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ãoserviceusage.services.enable. Saiba como conceder papéis.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com - Crie ou tenha acesso a um cluster que atenda aos requisitos do Config Sync e esteja na versão mais recente do Config Sync.
- Instale ou faça upgrade da CLI
nomospara a versão mais recente. - (Opcional) Se você quiser usar o Cosign para verificar assinaturas de imagens OCI, instale o seguinte:
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Crie um repositório do Artifact Registry
Nesta seção, você criará um repositório do Artifact Registry. Para saber mais sobre como criar repositórios do Artifact Registry, consulte Criar repositórios.
Crie um repositório do Artifact Registry:
gcloud artifacts repositories create AR_REPO_NAME \ --repository-format=docker \ --location=AR_REGION \ --description="Config Sync repo" \ --project=PROJECT_ID
Substitua:
PROJECT_ID: ID do projeto da organização.AR_REPO_NAME: o ID do repositório.AR_REGIONé o local regional ou multirregional do repositório.
Variáveis usadas nas seguintes seções:
FLEET_HOST_PROJECT_ID: se você estiver usando a federação de identidade da carga de trabalho do GKE, será igual aPROJECT_ID. Se você estiver usando a federação de identidade da carga de trabalho da frota para o GKE, esse será o ID do projeto da frota em que o cluster está registrado.GSA_NAME: o nome da conta de serviço personalizada do Google que você quer usar para se conectar ao Artifact Registry.KSA_NAME: a conta de serviço do Kubernetes do reconciliador.- Para repositórios raiz, se o nome
RootSyncforroot-sync, adicioneroot-reconciler. Caso contrário, adicioneroot-reconciler-ROOT_SYNC_NAME. - Para repositórios de namespace, se o nome
RepoSyncforrepo-sync, adicionens-reconciler-NAMESPACE. Caso contrário, adicionens-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, em queREPO_SYNC_NAME_LENGTHé o número de caracteres emREPO_SYNC_NAME.
- Para repositórios raiz, se o nome
Conceder permissão de leitor
Use uma conta de serviço do Kubernetes para autenticar no Artifact Registry seguindo estas etapas:
Conceda o papel do IAM de leitor do Artifact Registry (roles/artifactregistry.reader)
à conta de serviço do Kubernetes que tem o
pool da Federação de Identidade da Carga de Trabalho para GKE:
gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
--location=AR_REGION \
--member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
--role=roles/artifactregistry.reader \
--project=PROJECT_ID
Enviar uma imagem para o repositório do Artifact Registry
Nesta seção, você vai criar uma imagem OCI e enviá-la para o Artifact Registry.
Crie um arquivo de manifesto
Namespace:cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOFFaça login no Artifact Registry:
gcloud auth configure-docker AR_REGION-docker.pkg.devEmpacote e envie a imagem para o Artifact Registry:
craneOs comandos nesta seção usam
cranepara interagir com imagens e registros remotos.Empacote o arquivo:
tar -cf test-namespace.tar test-namespace.yamlInstale a ferramenta
crane.Envie a imagem para o Artifact Registry:
crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
orasOs comandos nesta seção usam
oraspara interagir com imagens e registros remotos.Empacote o arquivo:
tar -czf test-namespace.tar.gz test-namespace.yamlInstale a ferramenta
oras.Envie a imagem para o Artifact Registry:
oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
Configurar o Config Sync para sincronizar usando a imagem
Nesta seção, você vai criar um objeto RootSync e configurar o Config Sync
para fazer a sincronização com a imagem OCI.
Crie um objeto
RootSynccom um nome exclusivo:cat <<EOF>> ROOT_SYNC_NAME.yaml apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: ROOT_SYNC_NAME namespace: config-management-system spec: sourceFormat: unstructured sourceType: oci oci: image: AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 dir: . auth: k8sserviceaccount EOFSubstitua
ROOT_SYNC_NAMEpelo nome do objetoRootSync. O nome precisa ser exclusivo no cluster e ter no máximo 26 caracteres. Para ver a lista completa de opções ao configurar objetosRootSync, consulte os camposRootSynceRepoSync.Aplique o objeto
RootSync:kubectl apply -f ROOT_SYNC_NAME.yamlVerifique se o Config Sync está sincronizando com a imagem:
nomos status --contexts=$(kubectl config current-context)O resultado será semelhante a:
Connecting to clusters... *publish-config-registry -------------------- <root>:root-sync-test AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 SYNCED 05e6a6b77de7a62286387cfea833d45290105fe84383224938d7b3ab151a55a1 Managed resources: NAMESPACE NAME STATUS SOURCEHASH namespace/test Current 05e6a6bVocê sincronizou uma imagem com o cluster com êxito.
(Opcional) Verificar assinaturas de origem do OCI
É possível verificar a autenticidade das imagens de origem do OCI antes que as configurações sejam aplicadas aos clusters. Esse método usa um objeto ValidatingWebhookConfiguration e um servidor webhook de validação para interceptar solicitações de atualização de objetos RootSync e RepoSync. O Config Sync atualiza a anotação configsync.gke.io/image-to-sync dos objetos RootSync e RepoSync depois de buscar um novo resumo de imagem. O servidor webhook de validação compara os valores entre a anotação antiga e a nova e executa a validação com uma ferramenta de validação, como o Cosign, quando uma mudança é detectada.
Configurar um servidor de verificação de assinatura
Para garantir a autenticidade das suas fontes OCI, você precisa de um servidor HTTP para verificar as assinaturas. É possível usar as amostras no repositório de amostras do Config Sync ou usar sua própria imagem Docker.
Se quiser usar a amostra fornecida, siga estas etapas:
Clone o repositório de amostra:
git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples/Mude para o diretório que contém as amostras do servidor de verificação de assinatura:
cd anthos-config-management-samples/tree/main/pre-sync/oci-image-verification
Para criar uma imagem Docker para o servidor de verificação de assinatura e enviá-la para um registro de imagens, execute o seguinte comando:
docker build -t SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latest . && docker push SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latestSubstitua
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLpelo URL da imagem do servidor de verificação de assinatura.
Autenticar em serviços
Para configurar o servidor de verificação de assinatura, autentique-se no Artifact Registry, no cliente Cosign e no servidor de webhook.
Para criar um namespace:
kubectl create ns signature-verificationPara autenticar no Artifact Registry com uma ServiceAccount do Kubernetes, siga estas etapas:
Crie uma conta de serviço do Kubernetes no namespace que você criou:
kubectl create sa signature-verification-sa -n signature-verificationAdicione a vinculação de política do IAM para o papel de leitor do Artifact Registry (
roles/artifactregistry.reader):gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \ --location=REPOSITORY_LOCATION \ --member="serviceAccount:PROJECT_ID.svc.id.goog[signature-verification/signature-verification-sa]" \ --role=roles/artifactregistry.reader \ --project=PROJECT_IDSubstitua:
REPOSITORY_NAME: o nome do repositório do Artifact Registry onde você armazena as imagens OCI.REPOSITORY_LOCATION: o local do repositório do Artifact Registry.
Para autenticar no cliente Cosign, siga estas etapas:
Gere um par de chaves do Cosign. Esse comando gera uma chave pública e uma privada:
cosign generate-key-pairArmazene a chave pública em um Secret do Kubernetes no namespace que você criou:
kubectl create secret generic cosign-key --from-file=cosign.pub -n signature-verification
Para autenticar o servidor de verificação de assinatura, siga estas etapas:
Para criptografar a comunicação no servidor de verificação de assinatura, gere um certificado TLS e uma chave privada com o OpenSSL:
openssl req -nodes -x509 -sha256 -newkey rsa:4096 \ -keyout tls.key \ -out tls.crt \ -days 356 \ -subj "/CN=signature-verification-service.signature-verification.svc" \ -addext "subjectAltName = DNS:signature-verification-service,DNS:signature-verification-service.signature-verification.svc,DNS:signature-verification-service.signature-verification"Armazene as credenciais geradas em um Secret do Kubernetes:
kubectl create secret tls webhook-tls --cert=tls.crt --key=tls.key -n signature-verificationReceba o conteúdo codificado em base64 do
tls.cert. Isso é necessário para a configuração de webhook de validação que você vai criar na próxima seção:cat tls.crt | base64 -w 0.
Implantar o webhook de admissão
Use as amostras a seguir para criar um deployment para o servidor de verificação de assinatura e uma configuração de webhook de validação.
Crie uma implantação para o servidor de verificação de assinatura salvando o arquivo a seguir:
Substitua
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLpelo URL completo da imagem do servidor de verificação de assinatura.Aplique a implantação ao cluster:
kubectl apply -f signature-verification-deployment.yaml -n signature-verificationCrie uma configuração de webhook de validação salvando o seguinte arquivo:
Substitua
CA_BUNDLEpelo conteúdo codificado em base64 dotls.cert.Aplique a configuração de validação do webhook ao cluster:
kubectl apply -f signature-verification-validatingwebhookconfiguration.yaml
Verificar se há erros de verificação de imagem nos registros
Depois de configurar o servidor de verificação de imagens, todas as tentativas de sincronização de imagens OCI não assinadas vão falhar.
Para verificar se há erros de verificação de assinatura, consulte os registros do servidor de verificação de assinatura executando os seguintes comandos:
Verifique os registros do
kubectl:kubectl logs deployment signature-verification-server -n signature-verificationErros de
kubectlrelacionados à verificação de assinatura são semelhantes a este:main.go:69: error during command execution: no signatures foundVerifique os registros do Config Sync:
nomos statusOs erros do Config Sync relacionados à verificação de assinatura são semelhantes a este:
Error: KNV2002: admission webhook "imageverification.webhook.com" denied the request: Image validation failed: cosign verification failed: exit status 10, output: Error: no signatures found
Se não houver erros, confirme se a imagem assinada é o objeto
sendo sincronizado inspecionando a configuração RootSync ou RepoSync:
RootSync
kubectl get rootsync ROOTSYNC_NAME -n config-management-system -oyaml
Substitua ROOTSYNC_NAME pelo nome do seu RootSync.
RepoSync
kubectl get reposync REPOSYNC_NAME -n REPOSYNC_NAMESPACE -oyaml
Substitua:
REPOSYNC_NAME: o nome do seuRepoSync.REPOSYNC_NAMESPACE: o nome do namespace associado ao seuRepoSync.
A anotação configsync.gke.io/image-to-sync será adicionada ao objeto RootSync ou RepoSync. A anotação contém o URL da
imagem OCI de origem e o resumo mais recente buscado pelo Config Sync.
A seguir
- Saiba mais sobre como instalar o Config Sync.
- Solucione problemas do Config Sync.