Cette page explique comment utiliser l'opérateur External Secrets (ESO) pour synchroniser les secrets de Secret Manager avec vos clusters connectés Google Distributed Cloud.
External Secrets Operator est un opérateur Kubernetes Open Source qui intègre des systèmes externes de gestion des secrets. L'opérateur lit les informations des API externes et injecte automatiquement les valeurs dans un secret Kubernetes.
Prérequis
Avant de pouvoir utiliser External Secrets Operator, vous devez effectuer les opérations suivantes :
- Créez un cluster connecté Distributed Cloud fonctionnel.
- Vérifiez que les API suivantes sont activées dans votre projet Google Cloud .
Pour savoir comment activer les API, consultez Activer des services :
secretmanager.googleapis.comiamcredentials.googleapis.com
Assurez-vous que les outils de ligne de commande suivants sont installés :
- La dernière version de la Google Cloud CLI, qui inclut
gcloud, l'outil de ligne de commande permettant d'interagir avec Google Cloud. kubectl
Si vous utilisez Cloud Shell comme environnement shell pour interagir avecGoogle Cloud, ces outils sont installés pour vous.
- La dernière version de la Google Cloud CLI, qui inclut
Assurez-vous d'avoir initialisé gcloud CLI à utiliser avec votre projet.
Activez la fédération d'identité de charge de travail sur le cluster. Le pool d'identités de charge de travail est automatiquement disponible et suit le format
PROJECT_ID.svc.id.goog.Installez l'opérateur External Secrets sur votre cluster. Pour obtenir des instructions d'installation, consultez la documentation de l'opérateur External Secrets. Nous vous recommandons d'installer l'opérateur dans un espace de noms dédié, tel que
external-secrets. Ne l'installez pas dans des espaces de noms gérés par le système, tels quekube-systemougke-system.
Les clusters connectés Distributed Cloud sont automatiquement enregistrés dans un parc du projet dans lequel ils sont créés.
Authentification
External Secrets Operator nécessite une authentification pour accéder à Secret Manager. Distributed Cloud Connected utilise la fédération d'identité de charge de travail pour parc afin de permettre aux charges de travail de s'authentifier auprès des APIGoogle Cloud .
Pour configurer l'authentification pour External Secrets Operator :
- Configurez la relation de confiance entre votre cluster et Google Cloud en suivant les instructions de la section Authentification du cluster Workload Identity.
- Assurez-vous que le compte de service Google utilisé par External Secrets Operator dispose du rôle Accesseur de secrets Secret Manager (
roles/secretmanager.secretAccessor) pour les secrets auxquels vous souhaitez accéder. Configurez le pod de l'opérateur External Secrets pour qu'il utilise la fédération d'identité de charge de travail en suivant les instructions de la section Configurer la charge de travail.
La plupart des clients utilisent la fédération d'identité de charge de travail pour l'authentification. Pour configurer la fédération d'identité de charge de travail, vous devez annoter le compte de service Kubernetes utilisé par l'opérateur avec le compte de service Google. Pour ajouter cette annotation, exécutez la commande kubectl annotate :
kubectl annotate serviceaccount KSA_NAME \ --namespace OPERATOR_NAMESPACE \ iam.gke.io/gcp-service-account=GSA_EMAILVous pouvez également ajouter l'annotation à votre fichier YAML ServiceAccount :
apiVersion: v1 kind: ServiceAccount metadata: annotations: iam.gke.io/gcp-service-account: GSA_EMAIL name: KSA_NAME namespace: OPERATOR_NAMESPACERemplacez les valeurs suivantes :
KSA_NAME: nom du compte de service Kubernetes utilisé par l'opérateurOPERATOR_NAMESPACE: espace de noms dans lequel vous avez installé l'opérateurGSA_EMAIL: adresse e-mail du compte de service Google
Fournissez le fichier de configuration des identifiants au pod de l'opérateur. Pour en savoir plus, consultez Configurer la charge de travail.
Créer des ressources ESO pour synchroniser les secrets
Une fois l'authentification configurée, vous pouvez créer des ressources External Secrets Operator pour synchroniser les secrets.
Créer un objet SecretStore
Un SecretStore spécifie comment accéder au système externe de gestion des secrets.
Vous pouvez créer des ressources SecretStore dans le même espace de noms que l'opérateur External Secrets ou dans les espaces de noms des applications. Pour en savoir plus, consultez SecretStore dans la documentation Kubernetes.
Créez un fichier nommé
secret-store.yamlavec le contenu suivant :apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDRemplacez les valeurs suivantes :
NAMESPACE: espace de noms dans lequel vous souhaitez créerSecretStorePROJECT_ID: ID du projet Google Cloud dans lequel les secrets sont stockés
Exécutez la commande kubectl apply pour appliquer le fichier manifeste :
kubectl apply -f secret-store.yaml
Créer un objet ClusterSecretStore
Un ClusterSecretStore est une ressource à l'échelle du cluster que les ressources ExternalSecret peuvent utiliser dans n'importe quel espace de noms. Pour en savoir plus, consultez ClusterSecretStore dans la documentation Kubernetes.
Créez un fichier nommé
cluster-secret-store.yamlavec le contenu suivant :apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDRemplacez
PROJECT_IDpar l'ID du projet Google Cloud dans lequel les secrets sont stockés.Appliquez le fichier manifeste :
kubectl apply -f cluster-secret-store.yaml
Créer un ExternalSecret
Un ExternalSecret déclare les données à extraire et l'emplacement où les stocker dans le cluster. Créez des ressources ExternalSecret dans l'espace de noms où les pods d'application consomment le secret Kubernetes résultant. Pour en savoir plus, consultez ExternalSecret dans la documentation Kubernetes.
Créez un fichier nommé
external-secret.yamlavec le contenu suivant :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_NAMERemplacez les valeurs suivantes :
EXTERNAL_SECRET: le nom de la ressourceExternalSecret.NAMESPACE: espace de noms dans lequel vous avez crééSecretStore.K8S_SECRET_NAME: nom du secret Kubernetes à créer par ESO.K8S_SECRET_KEY: clé dans les données du secret Kubernetes.SECRET_NAME: nom du secret dansGoogle Cloud Secret Manager.
Si vous utilisez un
ClusterSecretStore, définissezkind: ClusterSecretStoreet mettez à jour lenamedanssecretStoreRef.Appliquez le fichier manifeste :
kubectl apply -f external-secret.yaml
Synchroniser plusieurs clés à partir d'un secret JSON
Si votre secret dans Secret Manager contient une chaîne JSON, vous pouvez extraire toutes les clés en tant qu'entrées individuelles dans le secret Kubernetes.
Créez un fichier nommé
external-secret-json.yamlavec le contenu suivant :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_NAMEAppliquez le fichier manifeste :
kubectl apply -f external-secret-json.yaml
Chaque paire clé/valeur du secret JSON est mappée à une paire clé/valeur du secret Kubernetes obtenu.
Dépannage
Si vos secrets ne se synchronisent pas, suivez les étapes ci-dessous pour résoudre le problème :
Exécutez la commande kubectl get pour vérifier l'état de la ressource
ExternalSecret:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlExaminez la section
statuspour détecter d'éventuels messages d'erreur ou conditions non remplies.Utilisez la commande kubectl logs pour vérifier les journaux du pod de contrôleur External Secrets Operator :
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEVérifiez que le compte de service Kubernetes utilisé par l'opérateur est correctement annoté avec l'adresse e-mail du compte de service Google. Pour en savoir plus, consultez Fédération d'identité de charge de travail sur le cluster.
Vérifiez que le compte de service Google dispose des autorisations nécessaires et que la fédération d'identité de charge de travail est correctement configurée. Pour en savoir plus, consultez Fédération d'identité de charge de travail sur le cluster.