Sincroniza artefactos OCI desde Artifact Registry

En esta página, se muestra cómo sincronizar un artefacto de OCI desde Artifact Registry.

Puedes configurar el Sincronizador de configuración para que se sincronice desde imágenes de OCI con Artifact Registry. Para usar esta función, debes habilitar las API de RootSync y RepoSync.

Debido a que Artifact Registry es un servicio completamente administrado compatible con imágenes de contenedores y artefactos que no son de contenedores, te recomendamos que lo uses para la administración y el almacenamiento de imágenes de contenedores en Google Cloud. Hay varias herramientas disponibles para enviar artefactos a Artifact Registry. Por ejemplo, puedes hacer lo siguiente: enviar una imagen de Docker ,enviar un gráfico de Helm o usar la biblioteca go-containerregistry para trabajar con registros de contenedores. Elige la herramienta que te resulte más conveniente. En esta página, se muestra cómo crear y publicar tu imagen en un repositorio en Artifact Registry con crane y oras.

Crea un repositorio de Artifact Registry

En esta sección, crearás un repositorio de Artifact Registry. Para obtener más información sobre cómo crear repositorios de Artifact Registry, consulta Crea repositorios.

  1. Habilita la API de Artifact Registry:

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Crea un repositorio de Artifact Registry:

    gcloud artifacts repositories create AR_REPO_NAME \
       --repository-format=docker \
       --location=AR_REGION \
       --description="Config Sync Helm repo" \
       --project=PROJECT_ID
    

Reemplaza lo siguiente:

  • PROJECT_ID: El ID del proyecto de la organización.
  • AR_REPO_NAME: Es el ID del repositorio.
  • AR_REGION: es la ubicación regional o multirregional del repositorio.

Variables que se usan en las siguientes secciones:

  • FLEET_HOST_PROJECT_ID: Si usas Workload Identity Federation for GKE, esto es lo mismo que PROJECT_ID. Si usas la flota Workload Identity Federation for GKE, este es el ID del proyecto de la flota en la que está registrado tu clúster.
  • GSA_NAME: Es el nombre de la cuenta de servicio personalizada de Google que deseas usar para conectarte a Artifact Registry.
  • KSA_NAME: Es la cuenta de servicio de Kubernetes para el conciliador.
    • Para los repositorios raíz, si el nombre RootSync es root-sync, agrega root-reconciler. De lo contrario, agrega root-reconciler-ROOT_SYNC_NAME.
    • Para los repositorios de espacios de nombres, si el nombre de RepoSync es repo-sync, agrega ns-reconciler-NAMESPACE. De lo contrario, agrega ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, donde REPO_SYNC_NAME_LENGTH es la cantidad de caracteres en REPO_SYNC_NAME.

Otorga permiso de lector

Si la versión del Sincronizador de configuración es 1.17.2 o posterior en tu clúster, puedes usar la cuenta de servicio de Kubernetes para autenticarte en Artifact Registry. De lo contrario, usa la cuenta de servicio de Google para la autenticación.

Usa la cuenta de servicio de Kubernetes

Otorga el rol de IAM de lector de Artifact Registry (roles/artifactregistry.reader) a la cuenta de servicio de Kubernetes con el grupo de Workload Identity Federation for 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

Usa la cuenta de servicio de Google

  1. Otorga el rol de IAM de lector de Artifact Registry (roles/artifactregistry.reader) a la cuenta de servicio de 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. Crea una vinculación de políticas de IAM entre la cuenta de servicio de Kubernetes y la cuenta de servicio de 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
    

Envía una imagen al repositorio de Artifact Registry

En esta sección, crearás una imagen de OCI y la enviarás a Artifact Registry.

  1. Crea un archivo de manifiesto Namespace:

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

    gcloud auth configure-docker AR_REGION-docker.pkg.dev
    
  3. Compila y envía la imagen a Artifact Registry:

    crane

    Los comandos de esta sección usan crane para interactuar con imágenes y registros remotos.

    1. Empaqueta el archivo:

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. Instala la herramienta crane.

    3. Envía la imagen a Artifact Registry:

      crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
      

    oras

    Los comandos de esta sección usan oras para interactuar con imágenes y registros remotos.

    1. Empaqueta el archivo:

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. Instala la herramienta oras.

    3. Envía la imagen a Artifact Registry:

      oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
      

Configura el Sincronizador de configuración para que se sincronice desde tu imagen

En esta sección, crearás un objeto RootSync y configurarás el Sincronizador de configuración para sincronizar desde la imagen de OCI.

  1. Crea un objeto RootSync con un nombre único:

    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
    

    Reemplaza ROOT_SYNC_NAME por el nombre del objeto RootSync. El nombre debe ser único en el clúster y no debe tener más de 26 caracteres. Para obtener la lista completa de opciones cuando configures objetos RootSync, consulta Campos RootSync y RepoSync.

  2. Aplica el objeto RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Verifica que el Sincronizador de configuración se sincronice desde la imagen:

    nomos status --contexts=$(kubectl config current-context)
    

    Deberías ver un resultado similar al siguiente:

    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
    

    Ya sincronizaste correctamente una imagen con tu clúster.

¿Qué sigue?