Synchroniser les artefacts OCI à partir d'Artifact Registry

Cette page explique comment synchroniser un artefact OCI à partir d'Artifact Registry.

Vous pouvez configurer Config Sync pour qu'il se synchronise à partir d'images OCI à l'aide d'Artifact Registry. Pour utiliser cette fonctionnalité, vous devez activer les API RootSync et RepoSync.

Comme Artifact Registry est un service entièrement géré compatible avec les images de conteneurs et les artefacts non issus de conteneurs, nous vous recommandons de l'utiliser pour le stockage et la gestion des images de conteneurs sur Google Cloud. Plusieurs outils permettent de transférer des artefacts vers Artifact Registry. Par exemple, vous pouvez transférer une image Docker,transférer un chart Helm ou utiliser la bibliothèque go-containerregistry pour travailler avec des registres de conteneurs. Choisissez l'outil qui vous convient le mieux. Cette page explique comment créer et publier votre image dans un dépôt d'Artifact Registry avec crane et oras.

Créer un dépôt Artifact Registry

Dans cette section, vous allez créer un dépôt Artifact Registry. Pour en savoir plus sur la création de dépôts Artifact Registry, consultez la section Créer des dépôts.

  1. Activez l'API Artifact Registry :

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Créer un dépôt Artifact Registry :

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

Remplacez les éléments suivants :

  • PROJECT_ID: ID du projet de l'organisation.
  • AR_REPO_NAME: ID du dépôt.
  • AR_REGION: emplacement régional ou multirégional du dépôt.

Variables utilisées dans les sections suivantes:

  • FLEET_HOST_PROJECT_ID: si vous utilisez Workload Identity de GKE, c'est la même chose que PROJECT_ID. Si vous utilisez la fonctionnalité Workload Identity du parc, il s'agit de l'ID de projet du parc dans lequel votre cluster est enregistré.
  • GSA_NAME: nom du compte de service Google personnalisé que vous souhaitez utiliser pour vous connecter à Artifact Registry.
  • KSA_NAME : compte de service Kubernetes pour le rapprochement.
    • Pour les dépôts racine, si le nom RootSync est root-sync, ajoutez root-reconciler. Sinon, ajoutez root-reconciler-ROOT_SYNC_NAME.
    • Pour les dépôts d'espaces de noms, si le nom RepoSync est repo-sync, ajoutez ns-reconciler-NAMESPACE. Sinon, ajoutez ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTHREPO_SYNC_NAME_LENGTH est le nombre de caractères dans REPO_SYNC_NAME.

Accorder l'autorisation de lecture

Si Config Sync est en version 1.17.2 ou ultérieure sur votre cluster, vous pouvez utiliser le compte de service Kubernetes pour vous authentifier auprès d'Artifact Registry. Sinon, utilisez le compte de service Google pour l'authentification.

Utiliser le compte de service Kubernetes

Attribuez le rôle IAM de lecteur Artifact Registry (roles/artifactregistry.reader) au compte de service Kubernetes avec le pool d'Workload Identity:

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

Utiliser le compte de service Google

  1. Attribuez le rôle IAM de lecteur Artifact Registry (roles/artifactregistry.reader) au compte de service 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. Créez une liaison de stratégie IAM entre le compte de service Kubernetes et le compte de service 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
    

Transférer une image vers le dépôt Artifact Registry

Dans cette section, vous allez créer une image OCI et la transférer vers Artifact Registry.

  1. Créez un fichier manifeste Namespace:

    cat <<EOF> test-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    EOF
    
  2. Connectez-vous à Artifact Registry :

    gcloud auth configure-docker AR_REGION-docker.pkg.dev
    
  3. Empaquetez et transférez l'image vers Artifact Registry:

    crane

    Les commandes de cette section utilisent crane pour interagir avec les images et registres distants.

    1. Empaquetez le fichier:

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. Installez l'outil crane.

    3. Transférez l'image vers Artifact Registry :

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

    oras

    Les commandes de cette section utilisent oras pour interagir avec les images et registres distants.

    1. Empaquetez le fichier:

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. Installez l'outil oras.

    3. Transférez l'image vers Artifact Registry :

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

Configurer Config Sync pour la synchronisation à partir de votre image

Dans cette section, vous allez créer un objet RootSync et configurer Config Sync pour qu'il le synchronise à partir de l'image OCI.

  1. Créez un objet RootSync avec un nom unique:

    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
    

    Remplacez ROOT_SYNC_NAME par le nom de votre objet RootSync. Le nom doit être unique dans le cluster et ne pas dépasser 26 caractères. Pour obtenir la liste complète des options disponibles lors de la configuration d'objets RootSync, consultez la section Champs RootSync et RepoSync.

  2. Appliquez l'objet RootSync:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Vérifiez que Config Sync est synchronisé à partir de l'image :

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

    Un résultat semblable aux lignes suivantes doit s'afficher :

    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
    

    Vous venez de synchroniser une image avec votre cluster.

Étapes suivantes