Helm-Diagramme aus Artifact Registry synchronisieren

Auf dieser Seite erfahren Sie, wie Sie Helm-Diagramme aus Artifact Registry synchronisieren, indem Sie ein Helm-Diagramm erstellen und in ein Repository in Artifact Registry übertragen. Außerdem enthält sie eine Beispielkonfiguration zum Synchronisieren eines Diagramms aus Ihrem Helm-Repository.

Sie können Config Sync so konfigurieren, dass es aus Helm Repositories synchronisiert. Sie können Helm-Diagramme in Artifact Registry speichern. Dies ist das empfohlene Helm-Repository für Google Cloud. Um diese Funktion verwenden zu können, müssen Sie die RootSync- und RepoSync APIs aktivieren. Config Sync rendert Helm-Diagramme mit helm template und unterstützt daher nicht die vollständige Helm-Lebenszyklusverwaltung.

Unter Gebündelte Helm- und Kustomize-Versionen sind die Kustomize- und Helm-Versionen aufgeführt, die mit der entsprechenden Version von Config Sync gebündelt sind.

Hinweis

  1. Melden Sie sich in Ihrem Google Cloud Konto an. Wenn Sie noch kein Konto bei Google Cloudhaben, erstellen Sie eines, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Installieren Sie die Google Cloud CLI.

  3. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  4. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  5. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können ein beliebiges Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die resourcemanager.projects.create Berechtigung enthält. Rollen zuweisen.
    • Erstellen Sie ein Google Cloud Projekt in:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch Ihren Google Cloud Projektnamen.

  6. Prüfen Sie, ob für Ihr Google Cloud Projekt die Abrechnung aktiviert ist.

  7. Aktivieren Sie die GKE-, Config Sync- und Artifact Registry APIs:

    Erforderliche Rollen zum Aktivieren von APIs

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin), die die Berechtigung serviceusage.services.enable enthält. Rollen zuweisen.

    gcloud services enable container.googleapis.com  anthosconfigmanagement.googleapis.com  artifactregistry.googleapis.com
  8. Installieren Sie die Google Cloud CLI.

  9. Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

  10. Führen Sie den folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  11. Erstellen Sie ein Google Cloud Projekt oder wählen Sie eines aus.

    Erforderliche Rollen zum Auswählen oder Erstellen eines Projekts

    • Projekt auswählen: Für die Auswahl eines Projekts ist keine bestimmte IAM-Rolle erforderlich. Sie können ein beliebiges Projekt auswählen, für das Ihnen eine Rolle zugewiesen wurde.
    • Projekt erstellen: Zum Erstellen eines Projekts benötigen Sie die Rolle „Projektersteller“ (roles/resourcemanager.projectCreator), die die resourcemanager.projects.create Berechtigung enthält. Rollen zuweisen.
    • Erstellen Sie ein Google Cloud Projekt in:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch Ihren Google Cloud Projektnamen.

  12. Prüfen Sie, ob für Ihr Google Cloud Projekt die Abrechnung aktiviert ist.

  13. Aktivieren Sie die GKE-, Config Sync- und Artifact Registry APIs:

    Erforderliche Rollen zum Aktivieren von APIs

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin), die die Berechtigung serviceusage.services.enable enthält. Rollen zuweisen.

    gcloud services enable container.googleapis.com  anthosconfigmanagement.googleapis.com  artifactregistry.googleapis.com
  14. Erstellen Sie einen Cluster, der die Anforderungen für Config Sync erfüllt und die neueste Version von Config Sync verwendet, oder stellen Sie sicher, dass Sie Zugriff auf einen solchen Cluster haben.
  15. Installieren Sie die nomos CLI oder aktualisieren Sie sie auf die neueste Version.
  16. Installieren Sie Helm 3.8.0 oder höher. In früheren Versionen von Helm ist die Unterstützung von Diagrammen im OCI-Format eine experimentelle Funktion.
  17. Aktivieren Sie Workload Identity Federation for GKE in Ihrem Cluster.

Beschränkungen

  • Sie können kein unveränderliches Feld in einer Konfiguration ändern, indem Sie einfach den Wert in der „Source of Truth“ ändern. Wenn Sie ein unveränderliches Feld aktualisieren müssen, nehmen Sie zuerst die Änderung in der „Source of Truth“ vor und löschen Sie dann das Objekt manuell im Cluster. Config Sync kann das Objekt dann mit dem neuen Feldwert neu erstellen.

  • Die folgenden Helm-Diagramme enthalten Jobs und werden nicht für die Bereitstellung durch Config Sync empfohlen:

    Weitere Informationen dazu, warum Jobs nicht für die Verwendung mit Config Sync empfohlen werden, finden Sie unter Jobs nicht mit Config Sync verwalten.

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: die Projekt-ID der Organisation.
  • AR_REPO_NAME: die ID des Repositorys.
  • AR_REGION: der regionale oder multiregionale Speicherort für das Repository.

In den folgenden Abschnitten verwendete Variablen:

  • FLEET_HOST_PROJECT_ID: Wenn Sie GKE Workload Identity Federation for GKE verwenden, entspricht dies PROJECT_ID. Wenn Sie Workload Identity Federation for GKE für Flotten verwenden, ist dies die Projekt-ID der Flotte, für die Ihr Cluster registriert ist.
  • GSA_NAME: Name des benutzerdefinierten Google-Dienstkontos, mit dem Sie eine Verbindung zu Artifact Registry herstellen 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

Führen Sie die folgenden Schritte aus, um sich mit einem Kubernetes-Dienstkonto bei Artifact Registry zu authentifizieren:

Weisen Sie dem Kubernetes-Dienstkonto mit dem Workload Identity Federation for GKE-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

Helm-Diagramm in das Artifact Registry-Repository übertragen

In diesem Abschnitt laden Sie ein öffentliches Helm-Diagramm herunter und übertragen es per Push in Artifact Registry.

  1. Rufen Sie das Paket mysql-9.3.1.tgz aus dem öffentlichen Helm-Repository ab und laden Sie es lokal herunter:

    helm pull mysql --repo https://charts.bitnami.com/bitnami --version 9.3.1
    
  2. Mit einem Zugriffstoken authentifizieren:

    Linux/macOS

    gcloud auth print-access-token | helm registry login -u oauth2accesstoken \
    --password-stdin https://AR_REGION-docker.pkg.dev
    

    Windows

    gcloud auth print-access-token
    ya29.8QEQIfY_...
    
    helm registry login -u oauth2accesstoken -p "ya29.8QEQIfY_..." \
    https://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
    

    In diesem Befehl ist oauth2accesstoken der Nutzername, der zur Authentifizierung mit einem Zugriffstoken verwendet werden soll, und gcloud auth print-access-token ist der Befehl zum Abrufen des Zugriffstokens. Ihr Zugriffstoken ist das Passwort für die Authentifizierung. Die Authentifizierung mit einem Zugriffstoken ist die sicherste Authentifizierungsmethode.

  3. Übertragen Sie das Helm-Diagramm per Push an Artifact Registry:

    helm push mysql-9.3.1.tgz oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
    

Config Sync für die Synchronisierung aus Ihrem Helm-Diagramm konfigurieren

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

Wenn Sie die Standardwerte des Helm-Diagramms überschreiben möchten, geben Sie entweder Werte im Feld spec.helm.values an oder fügen Sie mithilfe des Felds spec.helm.valuesFileRefs einen Verweis zu einer ConfigMap hinzu. Weitere Informationen zu den optionalen Feldern finden Sie unter Konfiguration für das Helm-Repository.

Werte

  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: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        namespace: test
        auth: k8sserviceaccount
        # Use the optional field spec.helm.values to override default values.
        # You can use the same format as the default values file to override
        # default values.
        values:
          image:
            pullPolicy: Always
          primary:
            resources:
              limits:
                cpu: 250m
                memory: 256Mi
              requests:
                cpu: 250m
                memory: 256Mi
    EOF
    

    Ersetzen Sie dabei 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. Wenn Sie Config Sync mit der Console oder der Google Cloud CLI installiert haben, wählen Sie einen anderen Namen als root-sync aus. Google Cloud

    In diesem Beispiel wird das Helm-Diagramm im test Namespace bereitgestellt, da seine Ressourcen namespace: {{ .Release.Namespace }} in den Vorlagen enthalten.

    Sie können helm.values verwenden, um die Standardwerte zu überschreiben. Weitere Informationen zu den optionalen Feldern finden Sie unter Konfiguration für das Helm-Repository.

  2. Wenden Sie das RootSync-Objekt 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 sieht in etwa so aus:

    Connecting to clusters...
    
    *cluster-name
      --------------------
      <root>:root-sync   oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1
      SYNCED             9.3.1
      Managed resources:
          NAMESPACE  NAME                       STATUS    SOURCEHASH
          default    configmap/my-mysql         Current   9.3.1
          default    secret/my-mysql            Current   9.3.1
          default    service/my-mysql           Current   9.3.1
          default    service/my-mysql-headless  Current   9.3.1
          default    serviceaccount/my-mysql    Current   9.3.1
          default    statefulset.apps/my-mysql  Current   9.3.1
    

    Sie haben das Helm-Diagramm jetzt erfolgreich in Ihren Cluster synchronisiert.

valuesFileRefs

  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: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        auth: k8sserviceaccount
        # use the optional field spec.helm.valuesFilesRefs to override default values
        # by referencing a ConfigMap
        valuesFileRefs:
        - name: CONFIGMAP_NAME
          dataKey: DATA_KEY
    
    EOF
    

    Ersetzen Sie Folgendes:

    • ROOT_SYNC_NAME: der Name Ihres RootSync-Objekts. Der Name darf im Cluster nur einmal vorkommen und darf nicht mehr als 26 Zeichen haben. Wenn Sie Config Sync mit der Console oder der Google Cloud CLI installiert haben, wählen Sie einen anderen Namen als root-sync aus. Google Cloud
    • CONFIGMAP_NAME: der Name Ihrer ConfigMap. Dies kann ein beliebiger gültiger ConfigMap-Name sein, der von Kubernetes akzeptiert wird und im Cluster eindeutig ist.
    • (optional) DATA_KEY: der Datenschlüssel in Ihrer ConfigMap, aus dem Sie die Werte lesen möchten. Der Standardwert ist values.yaml.
  2. Erstellen Sie das ConfigMap-Objekt mit Ihren Werten:

    cat <<EOF>> CONFIGMAP_NAME.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: CONFIGMAP_NAME
      namespace: config-management-system
    immutable: true
    # You can use the same format as the default values file to override
    # default values.
    data:
      DATA_KEY: |-
        image:
          pullPolicy: Always
        primary:
          resources:
            limits:
              cpu: 250m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 256Mi
    
    EOF
    

    Wenn Sie keinen Wert für DATA_KEY im RootSync angegeben haben, sollte der Standardwert values.yaml verwendet werden.

  3. Wenden Sie das ConfigMap-Objekt an:

    kubectl apply -f CONFIGMAP_NAME.yaml
    
  4. Wenden Sie das RootSync-Objekt an:

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

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

    Die Ausgabe sieht in etwa so aus:

    Connecting to clusters...
    
    *cluster-name
      --------------------
      <root>:root-sync   oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/mysql:9.3.1
      SYNCED             9.3.1
      Managed resources:
          NAMESPACE  NAME                       STATUS    SOURCEHASH
          default    configmap/my-mysql         Current   9.3.1
          default    secret/my-mysql            Current   9.3.1
          default    service/my-mysql           Current   9.3.1
          default    service/my-mysql-headless  Current   9.3.1
          default    serviceaccount/my-mysql    Current   9.3.1
          default    statefulset.apps/my-mysql  Current   9.3.1
    

    Sie haben das Helm-Diagramm jetzt erfolgreich in Ihren Cluster synchronisiert.

    Sie können auch imagePullPolicy in einer der synchronisierten Ressourcen im Cluster ansehen, um zu prüfen, ob die Werte aus der ConfigMap zum Rendern des Diagramms verwendet wurden:

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    
  6. Da die ConfigMap unveränderlich ist, müssen Sie eine neue ConfigMap erstellen und spec.helm.valuesFileRefs in der RootSync- oder RepoSync-Spezifikation aktualisieren, damit sie auf die neue ConfigMap verweist, um die Werte zu ändern. Durch die Erstellung einer neuen ConfigMap wird sichergestellt, dass Änderungen an Werten das Helm-Diagramm zum neu rendern zwingen. Dies ist nützlich, wenn mehrere ConfigMaps, auf die in spec.helm.valuesFileRefs verwiesen wird, gleichzeitig aktualisiert werden müssen, wenn das Helm-Diagramm neu rendert. “ Wenn Sie die Werte ändern möchten, die zum Rendern des Diagramms verwendet werden, erstellen Sie eine neue ConfigMap mit einem anderen Namen:

    cat <<EOF>> CONFIGMAP_NAME-2.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: CONFIGMAP_NAME-2
      namespace: config-management-system
    immutable: true
    # You can use the same format as the default values file to override
    # default values.
    data:
      DATA_KEY: |-
        image:
          pullPolicy: Never
        primary:
          resources:
            limits:
              cpu: 100m
              memory: 256Mi
            requests:
              cpu: 250m
              memory: 200Mi
    
    EOF
    
  7. Aktualisieren Sie Ihr RootSync-Objekt, um auf die neue ConfigMap zu verweisen:

    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: helm
      helm:
        repo: oci://AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME
        chart: mysql
        version: 9.3.1
        releaseName: my-mysql
        namespace: test
        auth: k8sserviceaccount
        # use the optional field spec.helm.valuesFilesRefs to override default values
        # by referencing a ConfigMap
        valuesFileRefs:
        - name: CONFIGMAP_NAME-2
          dataKey: DATA_KEY
    
    EOF
    
  8. Wenden Sie das ConfigMap-Objekt an:

    kubectl apply -f CONFIGMAP_NAME-2.yaml
    
  9. Wenden Sie das RootSync-Objekt an:

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

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

    Sie können auch imagePullPolicy in einer der synchronisierten Ressourcen im Cluster ansehen, um zu prüfen, ob die neuen Werte aus der aktualisierten ConfigMap zum Rendern des Diagramms verwendet wurden:

    kubectl get statefulset -n test my-mysql -o yaml | grep imagePullPolicy
    

Nächste Schritte