OCI-Artefakte aus Artifact Registry synchronisieren

Auf dieser Seite wird beschrieben, wie Sie ein OCI-Artefakt aus Artifact Registry synchronisieren.

Sie können Config Sync so konfigurieren, dass OCI-Images mithilfe von Artifact Registry synchronisiert werden. Wenn Sie diese Funktion verwenden möchten, müssen Sie die RootSync API und RepoSync APIs aktivieren.

Da Artifact Registry ein vollständig verwalteter Dienst ist, der sowohl Container-Images als auch Nicht-Container-Artefakte unterstützt, empfehlen wir die Verwendung für die Speicherung und Verwaltung von Container-Images in Google Cloud. Es gibt mehrere Tools, um Artefakte per Push in Artifact Registry zu übertragen. Sie können beispielsweise ein Docker-Image hochladen, ein Helm-Diagramm oder die Go-ContainerRegistry-Bibliothek für die Arbeit mit Container-Registries. Entscheiden Sie sich für das Tool, das für Sie am besten funktioniert. Auf dieser Seite wird beschrieben, wie Sie Ihr Image mit crane und oras in einem Repository in Artifact Registry erstellen und veröffentlichen.

Artifact Registry-Repository erstellen

In diesem Abschnitt erstellen Sie ein Artifact Registry-Repository. Weitere Informationen zum Erstellen von Artifact Registry-Repositories finden Sie unter Repositories erstellen.

  1. Aktivieren Sie die Artifact Registry API:

    gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
    
  2. Erstellen Sie ein Artifact Registry-Repository:

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

Ersetzen Sie Folgendes:

  • PROJECT_ID: Projekt-ID der Organisation
  • AR_REPO_NAME: die ID des Repositorys.
  • AR_REGION: der regionale oder multiregionale Standort des Repositorys.

Variablen, die in den folgenden Abschnitten verwendet werden:

  • FLEET_HOST_PROJECT_ID: Wenn Sie GKE Workload Identity verwenden, entspricht dies PROJECT_ID. Wenn Sie Workload Identity für die Flotte verwenden, ist dies die Projekt-ID der Flotte, bei der Ihr Cluster registriert ist.
  • GSA_NAME: der Name des benutzerdefinierten Google-Dienstkontos, das Sie zum Herstellen einer Verbindung zu Artifact Registry verwenden möchten.
  • KSA_NAME: das Kubernetes-Dienstkonto für den Abgleich.
    • Fügen Sie für Stamm-Repositories root-reconciler hinzu, wenn der Name RootSync root-sync ist. Fügen Sie andernfalls root-reconciler-ROOT_SYNC_NAME hinzu.
    • Für Namespace-Repositories gilt: Wenn der RepoSync-Name repo-sync lautet, fügen Sie ns-reconciler-NAMESPACE hinzu. Fügen Sie andernfalls ns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH hinzu, wobei REPO_SYNC_NAME_LENGTH die Anzahl der Zeichen in REPO_SYNC_NAME ist.

Leseberechtigung gewähren

Wenn die Config Sync-Version 1.17.2 oder höher in Ihrem Cluster ist, können Sie sich mit dem Kubernetes-Dienstkonto bei Artifact Registry authentifizieren. Andernfalls verwenden Sie das Google-Dienstkonto für die Authentifizierung.

Kubernetes-Dienstkonto verwenden

Weisen Sie dem Kubernetes-Dienstkonto mit dem Workload Identity-Pool die IAM-Rolle „Artifact Registry-Leser“ (roles/artifactregistry.reader) zu:

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

Google-Dienstkonto verwenden

  1. Weisen Sie dem Google-Dienstkonto die IAM-Rolle „Artifact Registry-Leser“ (roles/artifactregistry.reader) zu:

    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. Erstellen Sie eine IAM-Richtlinienbindung zwischen dem Kubernetes-Dienstkonto und dem Google-Dienstkonto:

    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
    

Image in das Artifact Registry-Repository hochladen

In diesem Abschnitt erstellen Sie ein OCI-Image und übertragen es per Push in Artifact Registry.

  1. Erstellen Sie eine Namespace-Manifestdatei:

    cat <<EOF> test-namespace.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test
    EOF
    
  2. Melden Sie sich bei Artifact Registry an:

    gcloud auth configure-docker AR_REGION-docker.pkg.dev
    
  3. Verpacken Sie das Image und übertragen Sie es per Push in Artifact Registry:

    crane

    Die Befehle in diesem Abschnitt verwenden crane, um mit Remote-Images und Registries zu interagieren.

    1. Verpacken Sie die Datei:

      tar -cf test-namespace.tar test-namespace.yaml
      
    2. Installieren Sie das Tool crane.

    3. Übertragen Sie das Image per Push an Artifact Registry.

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

    oras

    Die Befehle in diesem Abschnitt verwenden oras, um mit Remote-Images und Registries zu interagieren.

    1. Verpacken Sie die Datei:

      tar -czf test-namespace.tar.gz test-namespace.yaml
      
    2. Installieren Sie das Tool oras.

    3. Übertragen Sie das Image per Push an Artifact Registry.

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

Config Sync für die Synchronisierung aus Ihrem Image konfigurieren

In diesem Abschnitt erstellen Sie ein RootSync-Objekt und konfigurieren Config Sync für die Synchronisierung aus dem OCI-Image.

  1. Erstellen Sie ein RootSync-Objekt mit einem eindeutigen Namen:

    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
    

    Ersetzen Sie ROOT_SYNC_NAME durch den Namen Ihres RootSync-Objekts. Der Name darf im Cluster nur einmal vorkommen und darf nicht mehr als 26 Zeichen haben. Eine vollständige Liste der Optionen beim Konfigurieren von RootSync-Objekten finden Sie unter Felder für RootSync und RepoSync.

  2. Wenden Sie das Objekt RootSync an:

    kubectl apply -f ROOT_SYNC_NAME.yaml
    
  3. Prüfen Sie, ob Config Sync mit dem Image synchronisiert wird:

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

    Die Ausgabe sollte in etwa wie im folgenden Beispiel aussehen:

    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
    

    Sie haben jetzt ein Image mit Ihrem Cluster synchronisiert.

Nächste Schritte