Sincronizar artefatos do OCI no Artifact Registry

Esta página mostra como sincronizar um artefato OCI do Artifact Registry.

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

Como 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 que você o use para seu 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, enviar um gráfico do Helm ou usar a biblioteca go-containerregistry para trabalhar com os registros de contêiner. Escolha a ferramenta que funciona melhor para você. Nesta página, mostramos como criar e publicar sua imagem em um repositório do Artifact Registry com crane e oras.

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.

  1. Ative a API Artifact Registry.

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Crie um repositório do Artifact Registry:

    gcloud artifacts repositories create AR_REPO_NAME \
       --repository-format=docker \
       --location=AR_REGION \
       --description="Config Sync Helm 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 Identidade da carga de trabalho do GKE, será igual a PROJECT_ID. Se você estiver usando a identidade da carga de trabalho da frota, 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 RootSync for root-sync, adicione root-reconciler. Caso contrário, adicione root-reconciler-ROOT_SYNC_NAME.
    • Para repositórios de namespace, se o nome RepoSync for repo-sync, adicione ns-reconciler-NAMESPACE. Caso contrário, adicione ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, em que REPO_SYNC_NAME_LENGTH é o número de caracteres em REPO_SYNC_NAME.

Conceder permissão de leitor

Se a versão do Config Sync for 1.17.2 ou mais recente no cluster, será possível usar a conta de serviço do Kubernetes para autenticar no Artifact Registry. Caso contrário, use a conta de serviço do Google para autenticação.

Usando a conta de serviço do Kubernetes

Conceda o papel do IAM de Leitor do Artifact Registry (roles/artifactregistry.reader) à conta de serviço do Kubernetes com o pool de Identidade da carga de trabalho:

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

Usando a conta de serviço do Google

  1. Conceda o papel do IAM de leitor do Artifact Registry (roles/artifactregistry.reader) à conta de serviço do Google:

    gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
       --location=AR_REGION \
       --member=serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/artifactregistry.reader \
       --project=PROJECT_ID
    
  2. Crie uma vinculação de política do IAM entre a conta de serviço do Kubernetes e a conta de serviço do Google:

    gcloud iam service-accounts add-iam-policy-binding \
       --role roles/iam.workloadIdentityUser \
       --member "serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
       GSA_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --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.

  1. Crie um arquivo de manifesto Namespace:

    cat <<EOF> test-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    EOF
    
  2. Faça login no Artifact Registry:

    gcloud auth configure-docker AR_REGION-docker.pkg.dev
    
  3. Empacote e envie a imagem para o Artifact Registry:

    crane

    Os comandos nesta seção usam crane para interagir com imagens e registros remotos.

    1. Empacote o arquivo:

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. Instale a ferramenta crane.

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

    oras

    Os comandos nesta seção usam oras para interagir com imagens e registros remotos.

    1. Empacote o arquivo:

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. Instale a ferramenta oras.

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

  1. Crie um objeto RootSync com 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: .
        # The k8sserviceaccount auth type is available in version 1.17.2 and
        # later. Use `gcpserviceaccount` if using an older version.
        # auth: gcpserviceaccount
        # gcpServiceAccountEmail: GSA_NAME@PROJECT_ID.iam.gserviceaccount.com
        auth: k8sserviceaccount
    EOF
    

    Substitua ROOT_SYNC_NAME pelo nome do objeto RootSync. O nome precisa ser exclusivo no cluster e ter no máximo 26 caracteres. Para ver a lista completa de opções ao configurar objetos RootSync, consulte os campos RootSync e RepoSync.

  2. Aplique o objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Verifique 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   05e6a6b
    

    Você sincronizou uma imagem com o cluster com êxito.

A seguir