While creating a Deployment earlier today, I faced a weird situation where a specific environment variable that was held as a Secret, was not being set. I tried deleting and recreating the secret, with no success. Mind you this was a long YAML with volumes, volumeMounts, ConfigMaps as enviroment variables, lots of lines. In the end the issue was pretty simple and I missed it because kubectl silently accepted the submitted YAML. I had two(!) env: blocks defined for the same container and somehow I missed that. It turns out, that when you do so, only the last one gets accepted, and whatever is defined in the previous, is not taken into account. To show this with an example:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: box
name: box
spec:
replicas: 1
selector:
matchLabels:
app: box
template:
metadata:
labels:
app: box
spec:
containers:
- image: busybox
name: busybox
env:
- name: FIRST_ENV
value: "True"
- name: ANOTHER_FIRST
value: "True"
command:
- sleep
- infinity
env:
- name: SECOND_ENV
value: "True"
In the above example, when the Pod starts the container, only SECOND_ENV is set. FIRST_ENV and ANOTHER_FIRST are not.
I do not know whether this is a well known YAML fact or not, but it cost me some head-scratching and I hope it won’t cost you too.