3 min read | by Jordi Prats
Secrets contain sensitive data such as passwords, tokens, and certificates. They can be used by Kubernetes pods to authenticate with other systems. However, some of them might be optional so we'll want to be able to create the Pod without having to use some template engine to handle whether the secret is present or not.
If we try to create a Pod using a secret that doesn't exists it won't start until the secret is created:
$ kubectl get pods NAME READY STATUS RESTARTS AGE demo 0/1 CreateContainerConfigError 0 3s $ kubectl describe pod demo Name: demo Namespace: test (...) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 10s default-scheduler Successfully assigned test/demo to kind-control-plane Normal Pulled 9s kubelet Successfully pulled image "alpine:latest" in 801.015959ms Normal Pulling 8s (x2 over 10s) kubelet Pulling image "alpine:latest" Warning Failed 8s (x2 over 9s) kubelet Error: secret "some-secret" not found Normal Pulled 8s kubelet Successfully pulled image "alpine:latest" in 799.1035ms
We can add the optional flag in order to tell Kubernetes to do not set the variable if the Secret is missing:
apiVersion: v1 kind: Pod metadata: name: demo spec: containers: - name: container image: alpine:latest command: - sh - '-c' - "while true; do echo $ENV_NAME; sleep 1; done" env: - name: ENV_NAME valueFrom: secretKeyRef: name: some-secret key: key optional: true
So this way the Pod will start without setting the variable:
$ kubectl get pods NAME READY STATUS RESTARTS AGE demo 0/1 ContainerCreating 0 3s $ kubectl get pods NAME READY STATUS RESTARTS AGE demo 1/1 Running 0 4s
Similarly, we can do the same mounting the optional secret as a volume:
apiVersion: v1 kind: Pod metadata: name: demo spec: containers: - name: container image: alpine:latest command: - sh - '-c' - "while true; do ls /etc/some-secret; echo ; cat /etc/some-secret/*; echo; sleep 1; done" volumeMounts: - name: some-secret mountPath: /etc/some-secret volumes: - name: some-secret secret: secretName: some-secret optional: true
If we tail the container we'll be able to see how it cannot find any file (Secret):
$ kubectl logs -f demo cat: can't open '/etc/some-secret/*': No such file or directory (...)
Without having to restart the container, we can create the Secret:
$ kubectl create secret generic some-secret --from-literal=key=value
Then, as soon as Kubernetes converge, the file will show up with the Secret:
cat: can't open '/etc/some-secret/*': No such file or directory value key (...)
Posted on 06/03/2023