Auf dieser Seite wird beschrieben, wie Sie den External Secrets Operator (ESO) verwenden, um Secrets aus Secret Manager mit Ihren mit Google Distributed Cloud Connected verbundenen Clustern zu synchronisieren.
External Secrets Operator ist ein Open-Source-Kubernetes-Operator, der externe Secret-Verwaltungssysteme einbindet. Der Operator liest Informationen aus externen APIs und fügt die Werte automatisch in ein Kubernetes-Secret ein.
Vorbereitung
Bevor Sie External Secrets Operator verwenden können, müssen Sie Folgendes tun:
- Erstellen Sie einen funktionalen Distributed Cloud Connected-Cluster.
- Prüfen Sie, ob die folgenden APIs in Ihrem Projekt Google Cloud 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
gcloud, das Befehlszeilentool für die Interaktion mit Google Cloud, enthält. kubectl
Wenn Sie Cloud Shell als Shell-Umgebung für die Interaktion mitGoogle Cloudverwenden, sind diese Tools für Sie installiert.
- Die neueste Version der Google Cloud CLI, die
Achten Sie darauf, dass die gcloud CLI für die Verwendung mit Ihrem Projekt initialisiert wurde.
Aktivieren Sie Workload Identity Federation 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 sie nicht in vom System verwalteten Namespaces wiekube-systemodergke-system.
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 für den External Secrets Operator erforderlich. Distributed Cloud Connected verwendet die Workload Identity-Föderation der Flotte, damit sich Arbeitslasten beiGoogle Cloud -APIs authentifizieren können.
So konfigurieren Sie die Authentifizierung für External Secrets Operator:
- Richten Sie die Vertrauensstellung zwischen Ihrem Cluster und Google Cloud ein, indem Sie der Anleitung unter Workload Identity-Clusterauthentifizierung folgen.
Weisen Sie dem Kubernetes-Dienstkonto, das vom External Secrets Operator verwendet wird, die Rolle „Zugriffsperson für Secret Manager-Secret“ (
roles/secretmanager.secretAccessor) für das Secret zu:gcloud secrets add-iam-policy-binding SECRET_NAME \ --project=PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/OPERATOR_NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role="roles/secretmanager.secretAccessor" \ --condition=NoneErsetzen Sie die folgenden Werte:
SECRET_NAME: Der Name des Secrets im Secret Manager.PROJECT_ID: Ihre Google Cloud Projekt-IDPROJECT_NUMBER: Ihre numerische Google CloudProjektnummerOPERATOR_NAMESPACE: der Namespace, in dem Sie den Operator installiert habenKUBERNETES_SERVICEACCOUNT: der Name des Kubernetes-Dienstkontos, das vom Operator verwendet wird
Konfigurieren Sie den External Secrets Operator-Pod für die Verwendung der Workload Identity-Föderation und stellen Sie die Konfigurationsdatei für Anmeldedaten für den Operator-Pod bereit, indem Sie der Anleitung unter Arbeitslast konfigurieren folgen.
ESO-Ressourcen zum Synchronisieren von Secrets erstellen
Nachdem Sie die Authentifizierung konfiguriert haben, können Sie External Secrets Operator-Ressourcen erstellen, um Secrets zu synchronisieren.
SecretStore erstellen
Ein SecretStore gibt an, wie auf das externe Secret-Verwaltungssystem zugegriffen wird.
Sie können SecretStore-Ressourcen im selben Namespace wie 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 folgendem 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 dieSecretStoreerstellen möchtenPROJECT_ID: Ihre Google Cloud Projekt-ID, in der Secrets gespeichert sind
Wenden Sie das Manifest mit dem Befehl kubectl apply an:
kubectl apply -f secret-store.yaml
ClusterSecretStore erstellen
Ein ClusterSecretStore ist eine clusterbezogene Ressource, 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 folgendem Inhalt:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDErsetzen Sie
PROJECT_IDdurch die ID Ihres Projekts in Google Cloud , in dem die Secrets gespeichert sind.Wenden Sie das Manifest an:
kubectl apply -f cluster-secret-store.yaml
ExternalSecret erstellen
In einem ExternalSecret wird 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 folgendem 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_SECRETist 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 imGoogle Cloud Secret Manager.
Wenn Sie
ClusterSecretStoreverwenden, legen Siekind: ClusterSecretStorefest und aktualisieren SienameinsecretStoreRef.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 folgendem 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 vertraulichen Daten nicht synchronisiert werden, führen Sie die folgenden Schritte zur Fehlerbehebung aus:
Prüfen Sie mit dem Befehl kubectl get den Status der
ExternalSecret-Ressource:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlSehen Sie sich den Abschnitt
statusan, um nach Fehlermeldungen oder fehlgeschlagenen Bedingungen zu suchen.Mit dem Befehl kubectl logs können Sie die Logs des Controller-Pods des External Secrets Operator aufrufen:
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEPrüfen Sie, ob das vom Operator verwendete Kubernetes-Dienstkonto die Rolle „Secret Manager Secret Accessor“ (
roles/secretmanager.secretAccessor) hat und ob die Identitätsföderation von Arbeitslasten für den Operator-Pod richtig konfiguriert ist. Weitere Informationen finden Sie unter Identitätsföderation von Arbeitslasten im Cluster.