Auf dieser Seite wird beschrieben, wie Sie mit dem External Secrets Operator (ESO) Secrets aus Secret Manager mit Ihren Google Distributed Cloud Connected-Clustern synchronisieren.
Der External Secrets Operator ist ein Open-Source-Kubernetes-Operator, der externe Secret-Verwaltungssysteme integriert. Der Operator liest Informationen aus externen APIs und fügt die Werte automatisch in ein Kubernetes-Secret ein.
Vorbereitung
Bevor Sie den External Secrets Operator verwenden können, müssen Sie Folgendes tun:
- Erstellen Sie einen funktionierenden verbundenen Distributed Cloud-Cluster.
- Prüfen Sie, ob die folgenden APIs in Ihrem Google Cloud Projekt aktiviert sind.
Informationen zum Aktivieren von APIs finden Sie unter
Dienste aktivieren:
secretmanager.googleapis.comiamcredentials.googleapis.com
Prüfen Sie, ob die folgenden Befehlszeilentools installiert sind:
- Die neueste Version der Google Cloud CLI, die
enthält
gcloud, das Befehlszeilentool für die Interaktion mit Google Cloud. kubectl
Wenn Sie Cloud Shell als Shell-Umgebung für die Interaktion mit Google Cloudverwenden, sind diese Tools für Sie installiert.
- Die neueste Version der Google Cloud CLI, die
enthält
Achten Sie darauf, dass die gcloud CLI für die Verwendung mit Ihrem Projekt initialisiert wurde.
Aktivieren Sie die Identitätsföderation von Arbeitslasten im Cluster. Der Workload Identity-Pool ist automatisch verfügbar und hat das Format
PROJECT_ID.svc.id.goog.Installieren Sie den External Secrets Operator in Ihrem Cluster. Eine Installationsanleitung finden Sie in der Dokumentation zum External Secrets Operator. Wir empfehlen, den Operator in einem dedizierten Namespace wie
external-secretszu installieren. Installieren Sie ihn nicht in von Systemen verwalteten Namespaces wiekube-systemodergke-system.
Verbundene Distributed Cloud-Cluster werden automatisch in einer Flotte in dem Projekt registriert, in dem sie erstellt werden.
Authentifizierung
Für den Zugriff auf Secret Manager ist eine Authentifizierung des External Secrets Operator erforderlich. Verbundene Distributed Cloud-Cluster verwenden die Identitätsföderation von Arbeitslasten der Flotte , damit sich Arbeitslasten bei Google Cloud APIs authentifizieren können.
So konfigurieren Sie die Authentifizierung für den External Secrets Operator:
- Richten Sie die Vertrauensbeziehung zwischen Ihrem Cluster und Google Cloud ein, indem Sie der Anleitung unterClusterauthentifizierung mit Workload Identityfolgen.
- Prüfen Sie, ob das Google-Dienstkonto, das vom External Secrets Operator verwendet wird, für die Secrets, auf die Sie zugreifen möchten, die Rolle Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor) hat. Konfigurieren Sie den External Secrets Operator-Pod für die Verwendung der Identitätsföderation von Arbeitslasten indem Sie der Anleitung unter Arbeitslast konfigurieren folgen.
Die meisten Kunden verwenden die Identitätsföderation von Arbeitslasten für die Authentifizierung. Wenn Sie die Identitätsföderation von Arbeitslasten konfigurieren möchten, müssen Sie das Kubernetes-Dienstkonto, das vom Operator verwendet wird, mit dem Google-Dienstkonto annotieren. Führen Sie den Befehl „kubectl annotate“ aus, um diese Annotation hinzuzufügen:
kubectl annotate serviceaccount KSA_NAME \ --namespace OPERATOR_NAMESPACE \ iam.gke.io/gcp-service-account=GSA_EMAILAlternativ können Sie die Annotation zu Ihrem YAML-Dienstkonto hinzufügen:
apiVersion: v1 kind: ServiceAccount metadata: annotations: iam.gke.io/gcp-service-account: GSA_EMAIL name: KSA_NAME namespace: OPERATOR_NAMESPACEErsetzen Sie die folgenden Werte:
KSA_NAME: der Name des Kubernetes-Dienstkontos, das vom Operator verwendet wirdOPERATOR_NAMESPACE: der Namespace, in dem Sie den Operator installiert habenGSA_EMAIL: die E-Mail-Adresse des Google-Dienstkontos
Geben Sie die Konfigurationsdatei für die Anmeldedaten für den Operator-Pod an. Weitere Informationen finden Sie unter Arbeitslast konfigurieren.
ESO-Ressourcen zum Synchronisieren von Secrets erstellen
Nachdem Sie die Authentifizierung konfiguriert haben, können Sie Ressourcen des External Secrets Operator erstellen, um Secrets zu synchronisieren.
SecretStore erstellen
Ein SecretStore gibt an, wie auf das externe Secret-Verwaltungssystem zugegriffen werden soll.
Sie können SecretStore-Ressourcen im selben Namespace wie der External Secrets Operator oder in Anwendungs-Namespaces erstellen. Weitere Informationen finden Sie in der
Kubernetes-Dokumentation unter
SecretStore.
Erstellen Sie eine Datei mit dem Namen
secret-store.yamlund dem folgenden Inhalt:apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDErsetzen Sie die folgenden Werte:
NAMESPACE: der Namespace, in dem Sie denSecretStoreerstellen möchtenPROJECT_ID: Ihre Google Cloud Projekt-ID, unter der Secrets gespeichert sind
Verwenden Sie den Befehl „kubectl apply“ , um das Manifest anzuwenden:
kubectl apply -f secret-store.yaml
ClusterSecretStore erstellen
Ein ClusterSecretStore ist eine Clusterressource, die von ExternalSecret-Ressourcen in jedem Namespace verwendet werden kann. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter
ClusterSecretStore.
Erstellen Sie eine Datei mit dem Namen
cluster-secret-store.yamlund dem folgenden Inhalt:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDErsetzen Sie
PROJECT_IDdurch Ihre Google Cloud Projekt ID, unter der Secrets gespeichert sind.Wenden Sie das Manifest an:
kubectl apply -f cluster-secret-store.yaml
ExternalSecret erstellen
Ein ExternalSecret deklariert, welche Daten abgerufen und wo sie im Cluster gespeichert werden sollen. Erstellen Sie ExternalSecret-Ressourcen im Namespace, in dem die Anwendungs-Pods das resultierende Kubernetes-Secret verwenden. Weitere Informationen finden Sie in der Kubernetes-Dokumentation unter
ExternalSecret.
Erstellen Sie eine Datei mit dem Namen
external-secret.yamlund dem folgenden Inhalt:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner data: - secretKey: K8S_SECRET_KEY remoteRef: key: SECRET_NAMEErsetzen Sie die folgenden Werte:
EXTERNAL_SECRET: der Name derExternalSecret-Ressource.NAMESPACE: der Namespace, in dem Sie denSecretStoreerstellt haben.K8S_SECRET_NAME: der Name des Kubernetes-Secrets, das von ESO erstellt werden soll.K8S_SECRET_KEY: der Schlüssel in den Kubernetes-Secret-Daten.SECRET_NAME: der Name des Secrets in Google Cloud Secret Manager.
Wenn Sie einen
ClusterSecretStoreverwenden, legen Siekind: ClusterSecretStorefest und aktualisieren Sie dennameinsecretStoreRef.Wenden Sie das Manifest an:
kubectl apply -f external-secret.yaml
Mehrere Schlüssel aus einem JSON-Secret synchronisieren
Wenn Ihr Secret in Secret Manager einen JSON-String enthält, können Sie alle Schlüssel als einzelne Einträge im Kubernetes-Secret extrahieren.
Erstellen Sie eine Datei mit dem Namen
external-secret-json.yamlund dem folgenden Inhalt:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner dataFrom: - extract: key: SECRET_NAMEWenden Sie das Manifest an:
kubectl apply -f external-secret-json.yaml
Jedes Schlüssel/Wert-Paar im JSON-Secret wird einem Schlüssel/Wert-Paar im resultierenden Kubernetes-Secret zugeordnet.
Fehlerbehebung
Wenn Ihre Secrets nicht synchronisiert werden, führen Sie die folgenden Schritte zur Fehlerbehebung aus:
Prüfen Sie mit dem kubectl get Befehl den Status der
ExternalSecretRessource:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlPrüfen Sie den Abschnitt
statusauf Fehlermeldungen oder fehlgeschlagene Bedingungen.Prüfen Sie mit dem Befehl „kubectl logs“ die Logs des External Secrets Operator-Controller-Pods:
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEPrüfen Sie, ob das Kubernetes-Dienstkonto, das vom Operator verwendet wird, korrekt mit der E-Mail-Adresse des Google-Dienstkontos annotiert ist. Weitere Informationen finden Sie unter Identitätsföderation von Arbeitslasten im Cluster.
Prüfen Sie, ob das Google-Dienstkonto die erforderlichen Berechtigungen hat und die Identitätsföderation von Arbeitslasten korrekt konfiguriert ist. Weitere Informationen finden Sie unter Identitätsföderation von Arbeitslasten im Cluster.