External Secrets Operator verwenden

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.com
    • iamcredentials.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.

  • 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-secrets zu installieren. Installieren Sie ihn nicht in von Systemen verwalteten Namespaces wie kube-system oder gke-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:

  1. Richten Sie die Vertrauensbeziehung zwischen Ihrem Cluster und Google Cloud ein, indem Sie der Anleitung unterClusterauthentifizierung mit Workload Identityfolgen.
  2. 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.
  3. 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_EMAIL
    

    Alternativ 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_NAMESPACE
    

    Ersetzen Sie die folgenden Werte:

    • KSA_NAME: der Name des Kubernetes-Dienstkontos, das vom Operator verwendet wird
    • OPERATOR_NAMESPACE: der Namespace, in dem Sie den Operator installiert haben
    • GSA_EMAIL: die E-Mail-Adresse des Google-Dienstkontos
  4. 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.

  1. Erstellen Sie eine Datei mit dem Namen secret-store.yaml und dem folgenden Inhalt:

    apiVersion: external-secrets.io/v1
    kind: SecretStore
    metadata:
      name: gcp-store
      namespace: NAMESPACE
    spec:
      provider:
        gcpsm:
          projectID: PROJECT_ID
    

    Ersetzen Sie die folgenden Werte:

    • NAMESPACE: der Namespace, in dem Sie den SecretStore erstellen möchten
    • PROJECT_ID: Ihre Google Cloud Projekt-ID, unter der Secrets gespeichert sind
  2. 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.

  1. Erstellen Sie eine Datei mit dem Namen cluster-secret-store.yaml und dem folgenden Inhalt:

    apiVersion: external-secrets.io/v1
    kind: ClusterSecretStore
    metadata:
      name: gcp-cluster-store
    spec:
      provider:
        gcpsm:
          projectID: PROJECT_ID
    

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud Projekt ID, unter der Secrets gespeichert sind.

  2. 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.

  1. Erstellen Sie eine Datei mit dem Namen external-secret.yaml und 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_NAME
    

    Ersetzen Sie die folgenden Werte:

    • EXTERNAL_SECRET: der Name der ExternalSecret-Ressource.
    • NAMESPACE: der Namespace, in dem Sie den SecretStore erstellt 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 ClusterSecretStore verwenden, legen Sie kind: ClusterSecretStore fest und aktualisieren Sie den name in secretStoreRef.

  2. 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.

  1. Erstellen Sie eine Datei mit dem Namen external-secret-json.yaml und 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_NAME
    
  2. Wenden 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:

  1. Prüfen Sie mit dem kubectl get Befehl den Status der ExternalSecret Ressource:

    kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yaml
    

    Prüfen Sie den Abschnitt status auf Fehlermeldungen oder fehlgeschlagene Bedingungen.

  2. 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_NAMESPACE
    
  3. Prü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.

  4. 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.

Nächste Schritte