En esta página, se describe cómo usar el operador de External Secrets (ESO) para sincronizar secretos de Secret Manager con tus clústeres conectados de Google Distributed Cloud.
External Secrets Operator es un operador de Kubernetes de código abierto que integra sistemas externos de administración de secretos. El operador lee información de APIs externas y, luego, inserta automáticamente los valores en un secreto de Kubernetes.
Requisitos previos
Antes de usar External Secrets Operator, debes hacer lo siguiente:
- Crea un clúster conectado de Distributed Cloud funcional.
- Verifica que las siguientes APIs estén habilitadas en tu proyecto de Google Cloud .
Para obtener información sobre cómo habilitar las APIs, consulta Habilita servicios:
secretmanager.googleapis.comiamcredentials.googleapis.com
Asegúrate de tener instaladas las siguientes herramientas de línea de comandos:
- La versión más reciente de Google Cloud CLI, que incluye
gcloud, la herramienta de línea de comandos para interactuar con Google Cloud. kubectl
Si usas Cloud Shell como entorno de shell para interactuar conGoogle Cloud, estas herramientas están instaladas.
- La versión más reciente de Google Cloud CLI, que incluye
Asegúrate de haber inicializado la gcloud CLI para usarla en tu proyecto.
Habilita la federación de identidades para cargas de trabajo en el clúster. El grupo de identidades para cargas de trabajo está disponible automáticamente y sigue el formato
PROJECT_ID.svc.id.goog.Instala el operador de External Secrets en tu clúster. Para obtener instrucciones de instalación, consulta la documentación del operador de External Secrets. Recomendamos instalar el operador en un espacio de nombres dedicado, como
external-secrets. No lo instales en espacios de nombres administrados por el sistema, comokube-systemogke-system.
Los clústeres conectados de Distributed Cloud se registran automáticamente en una flota del proyecto en el que se crean.
Autenticación
El operador de External Secrets requiere autenticación para acceder a Secret Manager. Distributed Cloud Connected usa la federación de identidades para cargas de trabajo de la flota para permitir que las cargas de trabajo se autentiquen en las APIs deGoogle Cloud .
Para configurar la autenticación del operador de External Secrets, haz lo siguiente:
- Configura la relación de confianza entre tu clúster y Google Cloud siguiendo las instrucciones en Autenticación de clústeres con Workload Identity.
Otorga el rol de usuario con acceso a secretos de Secret Manager (
roles/secretmanager.secretAccessor) en el secreto a la ServiceAccount de Kubernetes que usa External Secrets Operator:gcloud secrets add-iam-policy-binding SECRET_NAME \ --project=PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/OPERATOR_NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role="roles/secretmanager.secretAccessor" \ --condition=NoneReemplaza los siguientes valores:
SECRET_NAME: Es el nombre del secreto en Secret Manager.PROJECT_ID: ID del proyecto de Google CloudPROJECT_NUMBER: Es el número de proyecto numérico de Google Cloud.OPERATOR_NAMESPACE: Es el espacio de nombres en el que instalaste el operador.KUBERNETES_SERVICEACCOUNT: Es el nombre de la cuenta de servicio de Kubernetes que usa el operador.
Configura el Pod del operador de External Secrets para que use la federación de identidades para cargas de trabajo y proporciona el archivo de configuración de credenciales al Pod del operador siguiendo las instrucciones de Configura la carga de trabajo.
Crea recursos de ESO para sincronizar secretos
Después de configurar la autenticación, puedes crear recursos del operador de External Secrets para sincronizar secretos.
Crear una SecretStore
Un SecretStore especifica cómo acceder al sistema externo de administración de secretos.
Puedes crear recursos SecretStore en el mismo espacio de nombres que el operador de External Secrets o en los espacios de nombres de la aplicación. Para obtener más información, consulta SecretStore en la documentación de Kubernetes.
Crea un archivo llamado
secret-store.yamlcon el siguiente contenido:apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDReemplaza los siguientes valores:
NAMESPACE: Es el espacio de nombres en el que deseas crear elSecretStore.PROJECT_ID: Tu ID del proyecto de Google Cloud en el que se almacenan los secretos
Usa el comando kubectl apply para aplicar el manifiesto:
kubectl apply -f secret-store.yaml
Crear una ClusterSecretStore
Un ClusterSecretStore es un recurso con permiso de clúster que los recursos ExternalSecret pueden usar en cualquier espacio de nombres. Para obtener más información, consulta ClusterSecretStore en la documentación de Kubernetes.
Crea un archivo llamado
cluster-secret-store.yamlcon el siguiente contenido:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDReemplaza
PROJECT_IDpor el ID del proyecto de Google Cloud en el que se almacenan los secretos.Aplica el manifiesto
kubectl apply -f cluster-secret-store.yaml
Crea un ExternalSecret
Un ExternalSecret declara qué datos recuperar y dónde almacenarlos en el clúster. Crea recursos ExternalSecret en el espacio de nombres en el que los Pods de la aplicación consumen el Secret de Kubernetes resultante. Para obtener más información, consulta ExternalSecret en la documentación de Kubernetes.
Crea un archivo llamado
external-secret.yamlcon el siguiente contenido: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_NAMEReemplaza los siguientes valores:
EXTERNAL_SECRET: El nombre del recursoExternalSecret.NAMESPACE: Es el espacio de nombres en el que creaste elSecretStore.K8S_SECRET_NAME: Es el nombre del Secret de Kubernetes que creará ESO.K8S_SECRET_KEY: Es la clave en los datos del Secret de Kubernetes.SECRET_NAME: Es el nombre del secreto enGoogle Cloud Secret Manager.
Si usas un
ClusterSecretStore, configurakind: ClusterSecretStorey actualiza elnameensecretStoreRef.Aplica el manifiesto
kubectl apply -f external-secret.yaml
Sincroniza varias claves desde un secreto JSON
Si tu Secret en Secret Manager contiene una cadena JSON, puedes extraer todas las claves como entradas individuales en el Secret de Kubernetes.
Crea un archivo llamado
external-secret-json.yamlcon el siguiente contenido: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_NAMEAplica el manifiesto
kubectl apply -f external-secret-json.yaml
Cada par clave-valor del secreto JSON se asigna a un par clave-valor en el secreto de Kubernetes resultante.
Soluciona problemas
Si tus secretos no se sincronizan, sigue estos pasos para solucionar el problema:
Usa el comando kubectl get para verificar el estado del recurso
ExternalSecret:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlExamina la sección
statuspara ver si hay mensajes de error o condiciones que no se cumplieron.Usa el comando kubectl logs para verificar los registros del Pod del controlador del operador de External Secrets:
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEVerifica que la ServiceAccount de Kubernetes que usa el operador tenga el rol de usuario con acceso a secretos de Secret Manager (
roles/secretmanager.secretAccessor) y que la federación de Workload Identity esté configurada correctamente en el Pod del operador. Para obtener más información, consulta Federación de identidades para cargas de trabajo en el clúster.