Skip to main content

PushSecret

Normalmente, el ESO jala (pull) los secretos del provider externo (ej: AWS Secrets Manager) para crear o actualizar Secrets en Kubernetes.

Push Secret es el camino inverso: creas o actualizas un Secret en Kubernetes y haces que el ESO empuje (push) esos datos al provider externo, o sea, el ESO consigue enviar (push) las actualizaciones del cluster al backend (AWS, Vault, etc).

  • Puedes gestionar secrets en Kubernetes y automáticamente sincronizar/actualizar el provider externo.
  • Útil en flujos donde Kubernetes es la fuente de la verdad, y quieres mantener el provider externo actualizado.
  • Evita tener que acceder al backend manualmente para actualizar secrets.

El PushSecret monitorea un secret específico en kubernetes y cuando cambia hace el push al provider (backend elegido).

  • No todos los providers soportan push.
  • No todas las versiones del ESO soportan push (es más reciente).
  • Configura bien los permisos para que el ESO tenga acceso de escritura en el backend, pero ya hablamos de eso en SecretStore.

Se puede usar perfectamente para sincronizar secrets entre clouds.

  • AWS → GCP
  • Vault → AWS
  • Kubernetes (generado localmente) → cualquier provider soportado

¡Vamos al ejemplo rápido! Vamos a tomar un secret abajo y hacer un push al AWS Secret Manager.

❯ k get secrets
NAME TYPE DATA AGE
app-auth kubernetes.io/basic-auth 2 154m # Este por ejemplo
mi-secret Opaque 1 86m
mi-secret-k8s Opaque 4 178m

Inclusive este secret está viniendo de una configuración de External Secret, o sea, mantendríamos dos secrets de AWS sincronizados.

apiVersion: external-secrets.io/v1alpha1
kind: PushSecret
metadata:
name: push-secret-aws
namespace: default
spec:
deletionPolicy: Delete # Atención a esto.
refreshInterval: 1m
secretStoreRefs:
- name: aws-secrets-manager
kind: ClusterSecretStore
selector: # Selecciona el secret en el mismo namespace arriba del push secret.
secret:
name: app-auth
data:
- match:
secretKey: "" # Envía todo el secreto local (todos los datos)
remoteRef:
remoteKey: dev-app-test1 # este será el secret creado
metadata:
apiVersion: kubernetes.external-secrets.io/v1alpha1
kind: PushSecretMetadata
spec:
secretPushFormat: string
description: "Full app-auth secret as JSON"
updatePolicy: Replace # O merge que actualizará solo las claves definidas en el secret en caso de que la key tenga más cosas.

El PushSecret aún está en fase de desarrollo. Una vez que borramos el secret no podemos usarlo más pues está marcado para ser borrado. Solo después de un cierto tiempo (generalmente 30 días) la misma key estará disponible cuando oficialmente sea borrada.

Por ahora recomiendo no usar PushSecret en producción, pero si es necesario usar, cambiar la deletionPolicy: Retain es una forma de resolver parcialmente el problema. Esto evita que AWS marque para eliminación y puedas reutilizarla sobrescribiéndola.