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 do 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
- 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.
 - 
          
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 - 
  
  
    
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
 - 
      Create a project: To create a project, you need the Project Creator
      (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. 
- 
        
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name. 
 - 
  
    
Verify that billing is enabled for your Google Cloud project.
 - 
  
  
    
      
Enable the GKE, Config Sync, Artifact Registry APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com  - 
      
Install the Google Cloud CLI.
 - 
          
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 - 
  
  
    
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
 - 
      Create a project: To create a project, you need the Project Creator
      (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. 
- 
        
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name. 
 - 
  
    
Verify that billing is enabled for your Google Cloud project.
 - 
  
  
    
      
Enable the GKE, Config Sync, Artifact Registry APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.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:
 - Cosign para assinar imagens OCI.
 - OpenSSL para gerar credenciais para o servidor webhook.
 - Docker para criar e enviar a imagem do servidor de webhook de admissão.
 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_IDPROJECT_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.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 
 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
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.
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 do 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.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 se 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.
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.yamlVerifique 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 foundREPOSYNC_NAME: o nome do seuRepoSync.REPOSYNC_NAMESPACE: o nome do namespace associado ao seuRepoSync.- Saiba mais sobre como instalar o Config Sync.
 - Solucione problemas do Config Sync.
 
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
 
 
 
Para gerar uma estimativa de custo baseada na sua projeção de uso, utilize 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.
Substitua:
Variáveis usadas nas seguintes seções:
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.
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.
(Opcional) Verificar assinaturas de origem do OCI
A partir da versão 1.20.0, o Config Sync oferece suporte à
verificação da 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 do Docker.
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.
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.
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:
Se você não receber erros, confirme se a imagem assinada é o objeto
sendo sincronizado inspecionando sua 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:
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.