3 min read | by Jordi Prats
When we are using an ExternalSecret the actual secret is stored elsewhere, being the External Secret Operator in charge of updating the Secret object with the datata if fetches from the SecretStore. What happens when the Secret is updated?
When the Secret is updated, depending on how we are using the secret we might need to restart the deployments using it:
Let's test it using the following ExternalSecret:
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: es-aws-demo
spec:
refreshInterval: 1m
secretStoreRef:
name: demo-ssm
kind: SecretStore
target:
name: es-aws-demo
data:
- secretKey: demo
remoteRef:
key: demo
Once applied it's going to fetch the secret from the AWS Parameter Store and create the secret:
$ kubectl get externalsecret
NAME STORE REFRESH INTERVAL STATUS READY
es-aws-demo demo-ssm 1m SecretSynced True
$ kubectl get secret
NAME TYPE DATA AGE
es-aws-demo Opaque 1 15m
We can now deploy the following that is going to create a Pod with the Secret mounted as a file and an environment variable:
kind: Deployment
apiVersion: apps/v1
metadata:
name: test-eso
labels:
app: test-eso
spec:
selector:
matchLabels:
app: test-eso
replicas: 1
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: test-eso
spec:
containers:
- name: test-eso
image: alpine:latest
imagePullPolicy: Always
command: ["sh", "-c", "while true; do echo ===; echo env; echo $ESO_ENV; echo; echo volume; cat /secret/demo; echo; sleep 1; done"]
env:
- name: ESO_ENV
valueFrom:
secretKeyRef:
name: es-aws-demo
key: demo
volumeMounts:
- name: secret
mountPath: /secret
volumes:
- name: secret
secret:
secretName: es-aws-demo
Once we have the Pod running we can update the secret on the parameter store:
$ awstools ssm set demo newvalue --description "test ESO" --overwrite
6647ac56-494c-431a-a4f7-f3b60c68c4bf
As soon as the External Secret Operator fetches the data and updates the secret we'll be able to see on the Pod's log that it is able to read the new value from the file (but not from the environment variable)
$ kubectl logs test-eso-559f9fcd4c-b9cgl -f
(...)
===
env
value
volume
value
===
env
value
volume
newvalue
It won't be able to read the new value even if we create a new process:
$ kubectl exec -it test-eso-559f9fcd4c-b9cgl -- sh
/ # echo $ESO_ENV
value
To be able to use the new value when it is pushed using an environment variable we'll have to refresh the Pods.
Posted on 11/10/2022