Utilizzare External Secrets Operator

Questa pagina descrive come utilizzare External Secrets Operator (ESO) per sincronizzare i secret da Secret Manager ai cluster Google Distributed Cloud Connected.

External Secrets Operator è un operatore Kubernetes open source che integra sistemi di gestione dei secret esterni. L'operatore legge le informazioni dalle API esterne e inserisce automaticamente i valori in un secret Kubernetes.

Prerequisiti

Prima di poter utilizzare External Secrets Operator, devi:

  • Creare un cluster Distributed Cloud Connected funzionale.
  • Verificare che le seguenti API siano abilitate nel tuo Google Cloud progetto. Per informazioni sull'abilitazione delle API, consulta Abilitare i servizi:
    • secretmanager.googleapis.com
    • iamcredentials.googleapis.com
  • Assicurarti di aver installato i seguenti strumenti a riga di comando:

    • L'ultima versione di Google Cloud CLI, che include gcloud, lo strumento a riga di comando per interagire con Google Cloud.
    • kubectl

    Se utilizzi Cloud Shell come ambiente shell per interagire con Google Cloud, questi strumenti sono installati.

  • Assicurarti di aver inizializzato il gcloud CLI per l'utilizzo con il tuo progetto.

  • Abilitare la federazione delle identità per i workload sul cluster. Il pool di identità del workload è disponibile automaticamente e segue il formato PROJECT_ID.svc.id.goog.

  • Installare External Secrets Operator sul cluster. Per le istruzioni di installazione, consulta la documentazione di External Secrets Operator. Ti consigliamo di installare l'operatore in uno spazio dei nomi dedicato, ad esempio external-secrets. Non installarlo in spazi dei nomi gestiti dal sistema come kube-system o gke-system.

I cluster Distributed Cloud Connected vengono registrati automaticamente in un parco risorse nel progetto in cui vengono creati.

Autenticazione

External Secrets Operator richiede l'autenticazione per accedere a Secret Manager. Distributed Cloud Connected utilizza la federazione delle identità per i workload del parco risorse per consentire ai carichi di lavoro di eseguire l'autenticazione alle Google Cloud API.

Per configurare l'autenticazione per External Secrets Operator:

  1. Configura la relazione di attendibilità tra il cluster e Google Cloud seguendo le istruzioni riportate inAutenticazione del cluster Workload Identity.
  2. Assicurati che il account di servizio Google utilizzato da External Secrets Operator abbia il ruolo Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) sui secret a cui vuoi accedere.
  3. Configura il pod External Secrets Operator in modo che utilizzi la federazione delle identità per i workload seguendo le istruzioni riportate in Configurare il carico di lavoro.

    La maggior parte dei clienti utilizza la federazione delle identità per i workload per l'autenticazione. Per configurare la federazione delle identità per i workload, devi annotare il service account Kubernetes utilizzato dall'operatore con il account di servizio Google. Per aggiungere questa annotazione, esegui il comando kubectl annotate:

    kubectl annotate serviceaccount KSA_NAME \
        --namespace OPERATOR_NAMESPACE \
        iam.gke.io/gcp-service-account=GSA_EMAIL
    

    In alternativa, puoi aggiungere l'annotazione al file YAML del service account:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        iam.gke.io/gcp-service-account: GSA_EMAIL
      name: KSA_NAME
      namespace: OPERATOR_NAMESPACE
    

    Sostituisci i seguenti valori:

    • KSA_NAME: il nome del service account Kubernetes utilizzato dall'operatore
    • OPERATOR_NAMESPACE: lo spazio dei nomi in cui hai installato l'operatore
    • GSA_EMAIL: l'indirizzo email del service account Google
  4. Fornisci il file di configurazione delle credenziali al pod dell'operatore. Per ulteriori informazioni, consulta Configurare il carico di lavoro.

Creare risorse ESO per sincronizzare i secret

Dopo aver configurato l'autenticazione, puoi creare risorse External Secrets Operator per sincronizzare i secret.

Creare un SecretStore

Un SecretStore specifica come accedere al sistema di gestione dei secret esterni. Puoi creare risorse SecretStore nello stesso spazio dei nomi di External Secrets Operator o negli spazi dei nomi delle applicazioni. Per ulteriori informazioni, consulta SecretStore nella documentazione di Kubernetes.

  1. Crea un file denominato secret-store.yaml con i seguenti contenuti:

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

    Sostituisci i seguenti valori:

    • NAMESPACE: lo spazio dei nomi in cui vuoi creare SecretStore
    • PROJECT_ID: l'ID Google Cloud progetto in cui sono archiviati i secret
  2. Utilizza il comando kubectl apply per applicare il manifest:

    kubectl apply -f secret-store.yaml
    

Creare un ClusterSecretStore

Un ClusterSecretStore è una risorsa con ambito cluster che le risorse ExternalSecret possono utilizzare in qualsiasi spazio dei nomi. Per ulteriori informazioni, consulta ClusterSecretStore nella documentazione di Kubernetes.

  1. Crea un file denominato cluster-secret-store.yaml con i seguenti contenuti:

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

    Sostituisci PROJECT_ID con l' Google Cloud ID progetto in cui sono archiviati i secret.

  2. Applica il manifest:

    kubectl apply -f cluster-secret-store.yaml
    

Creare un ExternalSecret

Un ExternalSecret dichiara quali dati recuperare e dove archiviarli nel cluster. Crea risorse ExternalSecret nello spazio dei nomi in cui i pod dell'applicazione utilizzano il secret Kubernetes risultante. Per ulteriori informazioni, consulta ExternalSecret nella documentazione di Kubernetes.

  1. Crea un file denominato external-secret.yaml con i seguenti contenuti:

    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
    

    Sostituisci i seguenti valori:

    • EXTERNAL_SECRET: il nome della risorsa ExternalSecret.
    • NAMESPACE: lo spazio dei nomi in cui hai creato SecretStore.
    • K8S_SECRET_NAME: il nome del secret Kubernetes da creare con ESO.
    • K8S_SECRET_KEY: la chiave nei dati del secret Kubernetes.
    • SECRET_NAME: il nome del secret in Google Cloud Secret Manager.

    Se utilizzi un ClusterSecretStore, imposta kind: ClusterSecretStore e aggiorna il name in secretStoreRef.

  2. Applica il manifest:

    kubectl apply -f external-secret.yaml
    

Sincronizzare più chiavi da un secret JSON

Se il secret in Secret Manager contiene una stringa JSON, puoi estrarre tutte le chiavi come singole voci nel secret Kubernetes.

  1. Crea un file denominato external-secret-json.yaml con i seguenti contenuti:

    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. Applica il manifest:

    kubectl apply -f external-secret-json.yaml
    

Ogni coppia chiave-valore nel secret JSON viene mappata a una coppia chiave-valore nel secret Kubernetes risultante.

Risoluzione dei problemi

Se i secret non vengono sincronizzati, segui questi passaggi per risolvere il problema:

  1. Utilizza il comando kubectl get per controllare lo stato della risorsa ExternalSecret:

    kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yaml
    

    Esamina la sezione status per verificare la presenza di messaggi di errore o condizioni non riuscite.

  2. Utilizza il comando kubectl logs per controllare i log del pod del controller External Secrets Operator:

    kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACE
    
  3. Verifica che il service account Kubernetes utilizzato dall'operatore sia annotato correttamente con l'email dell'account di servizio Google. Per ulteriori informazioni, consulta Federazione delle identità per i workload sul cluster.

  4. Verifica che il account di servizio Google disponga delle autorizzazioni necessarie e che la federazione delle identità per i workload sia configurata correttamente. Per ulteriori informazioni, consulta Federazione delle identità per i workload sul cluster.

Passaggi successivi