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.comiamcredentials.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.
- L'ultima versione di Google Cloud CLI, che
include
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 comekube-systemogke-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:
- Configura la relazione di attendibilità tra il cluster e Google Cloud seguendo le istruzioni riportate inAutenticazione del cluster Workload Identity.
- 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. 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_EMAILIn 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_NAMESPACESostituisci i seguenti valori:
KSA_NAME: il nome del service account Kubernetes utilizzato dall'operatoreOPERATOR_NAMESPACE: lo spazio dei nomi in cui hai installato l'operatoreGSA_EMAIL: l'indirizzo email del service account Google
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.
Crea un file denominato
secret-store.yamlcon i seguenti contenuti:apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDSostituisci i seguenti valori:
NAMESPACE: lo spazio dei nomi in cui vuoi creareSecretStorePROJECT_ID: l'ID Google Cloud progetto in cui sono archiviati i secret
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.
Crea un file denominato
cluster-secret-store.yamlcon i seguenti contenuti:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDSostituisci
PROJECT_IDcon l' Google Cloud ID progetto in cui sono archiviati i secret.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.
Crea un file denominato
external-secret.yamlcon 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_NAMESostituisci i seguenti valori:
EXTERNAL_SECRET: il nome della risorsaExternalSecret.NAMESPACE: lo spazio dei nomi in cui hai creatoSecretStore.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, impostakind: ClusterSecretStoree aggiorna ilnameinsecretStoreRef.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.
Crea un file denominato
external-secret-json.yamlcon 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_NAMEApplica 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:
Utilizza il comando kubectl get per controllare lo stato della risorsa
ExternalSecret:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlEsamina la sezione
statusper verificare la presenza di messaggi di errore o condizioni non riuscite.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_NAMESPACEVerifica 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.
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.