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 hochladen. Es enthält auch eine Beispielkonfiguration zum Synchronisieren eines Diagramms aus Ihrem Helm-Repository.

Sie können Config Sync so konfigurieren, dass die Synchronisierung aus Helm-Repositories erfolgt. 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 finden Sie die Kustomize- und Helm-Versionen, die mit der entsprechenden Version von Config Sync gebündelt sind.

Hinweise

Beschränkungen

  • Sie können kein unveränderliches Feld in einer Konfiguration ändern, indem Sie nur den Wert in der Single 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 erteilen

So authentifizieren Sie sich mit einem Kubernetes-Dienstkonto bei Artifact Registry:

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 hochladen

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

  1. Rufen Sie das mysql-9.3.1.tgz-Paket 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 Google Cloud -Konsole oder der Google Cloud CLI installiert haben, wählen Sie einen anderen Namen als root-sync aus.

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

    Mit helm.values können Sie die Standardwerte ü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 Google Cloud Console oder der Google Cloud CLI installiert haben, wählen Sie einen anderen Namen als root-sync aus.
    • CONFIGMAP_NAME: der Name Ihrer ConfigMap. Dies kann ein beliebiger gültiger ConfigMap-Name sein, der von Kubernetes akzeptiert wird und in Ihrem Cluster eindeutig ist.
    • (optional) DATA_KEY: Der Datenschlüssel in Ihrer ConfigMap, aus dem die Werte gelesen werden sollen. 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 im RootSync keinen Wert für DATA_KEY 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 zum Ändern der Werte eine neue ConfigMap erstellen und spec.helm.valuesFileRefs in der RootSync- oder RepoSync-Spezifikation aktualisieren, damit sie auf die neue ConfigMap verweist. 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, damit es auf die neue ConfigMap verweist:

    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