Utiliser External Secrets Operator

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

  • 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 que kube-system ou gke-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 :

  1. Configurez la relation de confiance entre votre cluster et Google Cloud en suivant les instructions de la section Authentification du cluster Workload Identity.
  2. 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.
  3. 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_EMAIL
    

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

    Remplacez les valeurs suivantes :

    • KSA_NAME : nom du compte de service Kubernetes utilisé par l'opérateur
    • OPERATOR_NAMESPACE : espace de noms dans lequel vous avez installé l'opérateur
    • GSA_EMAIL : adresse e-mail du compte de service Google
  4. 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.

  1. Créez un fichier nommé secret-store.yaml avec le contenu suivant :

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

    Remplacez les valeurs suivantes :

    • NAMESPACE : espace de noms dans lequel vous souhaitez créer SecretStore
    • PROJECT_ID : ID du projet Google Cloud dans lequel les secrets sont stockés
  2. 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.

  1. Créez un fichier nommé cluster-secret-store.yaml avec le contenu suivant :

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

    Remplacez PROJECT_ID par l'ID du projet Google Cloud dans lequel les secrets sont stockés.

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

  1. Créez un fichier nommé external-secret.yaml avec 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_NAME
    

    Remplacez les valeurs suivantes :

    • EXTERNAL_SECRET : le nom de la ressource ExternalSecret.
    • 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éfinissez kind: ClusterSecretStore et mettez à jour le name dans secretStoreRef.

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

  1. Créez un fichier nommé external-secret-json.yaml avec 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_NAME
    
  2. Appliquez 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 :

  1. Exécutez la commande kubectl get pour vérifier l'état de la ressource ExternalSecret :

    kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yaml
    

    Examinez la section status pour détecter d'éventuels messages d'erreur ou conditions non remplies.

  2. 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_NAMESPACE
    
  3. Vé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.

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

Étapes suivantes