Auf dieser Seite erfahren Sie, wie Sie Helm-Diagramme aus Artifact Registry synchronisieren, indem Sie ein Helm-Diagramm erstellen und per Push in ein Repository in Artifact Registry übertragen. Es enthält auch eine Beispielkonfiguration zur Synchronisierung eines Diagramms aus Ihrem Helm-Repository.
Sie können Config Sync für die Synchronisierung aus Helm-Repositories konfigurieren.
Sie können Helm-Diagramme in Artifact Registry speichern, dem empfohlenen 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 keine vollständige Verwaltung des Helm-Lebenszyklus.
Gebündelte Helm- und Kustomize-Versionen listet die Kustomize- und Helm-Versionen auf, die mit der entsprechenden Version von Config Sync gebündelt sind.
Hinweise
- 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.
- Aktivieren Sie Workload Identity Federation for GKE in Ihrem Cluster.
Beschränkungen
Sie können ein unveränderliches Feld in einer Konfiguration nicht ä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 für die Bereitstellung durch Config Sync nicht empfohlen:
Weitere Informationen dazu, warum Jobs für die Verwendung mit Config Sync nicht empfohlen werden, finden Sie unter Verwaltung von Jobs mit Config Sync vermeiden.
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.
Aktivieren Sie die Artifact Registry API:
gcloud services enable artifactregistry.googleapis.com --project=PROJECT_ID
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
: 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 diesPROJECT_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 NameRootSync
root-sync
ist. Fügen Sie andernfallsroot-reconciler-ROOT_SYNC_NAME
hinzu. - Für Namespace-Repositories gilt: Wenn der
RepoSync
-Namerepo-sync
lautet, fügen Siens-reconciler-NAMESPACE
hinzu. Fügen Sie andernfallsns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH
hinzu, wobeiREPO_SYNC_NAME_LENGTH
die Anzahl der Zeichen inREPO_SYNC_NAME
ist.
- Fügen Sie für Stamm-Repositories
Leseberechtigung erteilen
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 zur Authentifizierung.
Kubernetes-Dienstkonto verwenden
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
Google-Dienstkonto verwenden
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
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
Helm-Diagramm per Push in das Artifact Registry-Repository übertragen
In diesem Abschnitt laden Sie ein öffentliches Helm-Diagramm herunter und übertragen es per Push in Artifact Registry.
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
Authentifizieren Sie sich mit einem Zugriffstoken:
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 für die Authentifizierung mit einem Zugriffstoken undgcloud auth print-access-token
der Befehl zum Abrufen des Zugriffstokens. Ihr Zugriffstoken ist das Passwort für die Authentifizierung. Die Authentifizierung mit einem Zugriffstoken ist die sicherste Authentifizierungsmethode.Übertragen Sie das Helm-Diagramm per Push in 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
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 # 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 # 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 Console oder der Google Cloud CLI installiert haben, wählen Sie einen anderen Namen alsroot-sync
aus.In diesem Beispiel wird das Helm-Diagramm im Namespace
test
bereitgestellt, da seine Ressourcennamespace: {{ .Release.Namespace }}
in seinen 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.Wenden Sie das RootSync-Objekt an:
kubectl apply -f ROOT_SYNC_NAME.yaml
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
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 # 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 # 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 alsroot-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 der Sie die Werte lesen möchten. Der Standardwert istvalues.yaml
.
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 in RootSync keinen Wert für
DATA_KEY
angegeben haben, sollte dies der Standardwertvalues.yaml
sein.Wenden Sie das ConfigMap-Objekt an:
kubectl apply -f CONFIGMAP_NAME.yaml
Wenden Sie das RootSync-Objekt an:
kubectl apply -f ROOT_SYNC_NAME.yaml
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
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 so aktualisieren, dass 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 inspec.helm.valuesFileRefs
verwiesen wird, gleichzeitig aktualisiert werden müssen, wenn das Helm-Diagramm neu rendert. “ Erstellen Sie eine neue ConfigMap mit einem anderen Namen, um die Werte zu ändern, die zum Rendern Ihres Diagramms verwendet werden: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
Aktualisieren Sie Ihr RootSync-Objekt, sodass 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 # 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 # use the optional field spec.helm.valuesFilesRefs to override default values # by referencing a ConfigMap valuesFileRefs: - name: CONFIGMAP_NAME-2 dataKey: DATA_KEY EOF
Wenden Sie das ConfigMap-Objekt an:
kubectl apply -f CONFIGMAP_NAME-2.yaml
Wenden Sie das RootSync-Objekt an:
kubectl apply -f ROOT_SYNC_NAME.yaml
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