PushSecret
Normalmente, o ESO puxa (pull) os segredos do provider externo (ex: AWS Secrets Manager) para criar ou atualizar Secrets no Kubernetes.
Push Secret é o caminho inverso: você cria ou atualiza um Secret no Kubernetes e faz o ESO empurrar (push) esses dados para o provider externo, ou seja, o ESO consegue enviar (push) as atualizações do cluster para o backend (AWS, Vault, etc).
- Você pode gerenciar secrets no Kubernetes e automaticamente sincronizar/atualizar o provider externo.
- Útil em fluxos onde o Kubernetes é a fonte da verdade, e quer manter o provider externo atualizado.
- Evita ter que acessar o backend manualmente para atualizar secrets.
O PushSecret monitora uma secret específica no kubernetes ela mud faz o push para o provider (backend escolhido).
- Nem todos os providers suportam push.
- Nem todas as versões do ESO suportam push (é mais recente).
- Configure bem permissões para que o ESO tenha acesso de escrita no backend, mas já falamos disso em SecretStore.
Dá para usar perfeitamente para sincronizar secrets entre clouds.
- AWS → GCP
- Vault → AWS
- Kubernetes (gerado localmente) → qualquer provider suportado
Vamos ao exemplo rápido! Vamos pegar um secret abaixo e fazer um push para o AWS Secret Manager.
❯ k get secrets
NAME TYPE DATA AGE
app-auth kubernetes.io/basic-auth 2 154m # Essa por exemplo
minha-secret Opaque 1 86m
minha-secret-k8s Opaque 4 178m
Inclusive essa secret esta vindo de uma configuração de External Secret, ou seja, manteríamos duas secrets da AWS sincronizadas.
apiVersion: external-secrets.io/v1alpha1
kind: PushSecret
metadata:
name: push-secret-aws
namespace: default
spec:
deletionPolicy: Delete # Atenção nisso.
refreshInterval: 1m
secretStoreRefs:
- name: aws-secrets-manager
kind: ClusterSecretStore
selector: # Seleciona a secrete no mesmo namespace acima do push secret.
secret:
name: app-auth
data:
- match:
secretKey: "" # Envia todo o segredo local (todos os dados)
remoteRef:
remoteKey: dev-app-test1 # essa será a secret criada
metadata:
apiVersion: kubernetes.external-secrets.io/v1alpha1
kind: PushSecretMetadata
spec:
secretPushFormat: string
description: "Full app-auth secret as JSON"
updatePolicy: Replace # Ou merge que irá atualizar só as chaves definidas no secret caso a key tenha mais coisas.
O PushSecret ainda esta em fase de desenvolvimento. Uma vez que deletamos a secret não conseguimos mais usar pois ela é marcada para ser deletada. Só depois de um certo tempo (geralmente 30 dias) a mesma key estará disponível quando oficialmente for deletada.
Por enquanto recomendo não usar ainda PushSecret ainda em produção, mas se necessário usar, mudar a deletionPolicy: Retain
é uma forma de resolver parcialmente o problema. Isso evita que a AWS marque para deleção e você possar reusá-la sobreescrevendo-a.