pod定义中重复的env变量名称,确定最终值的优先规则是什么?

问题描述

使用 Kubernetes 1.19.3,我使用 3 种不同的方式初始化 env 变量值:

  • env 字段在 pod 定义中具有显式键/值
  • envFrom 使用 configMapRefsecretRef

一个键名重复时,如下例所示,DUPLIK1DUPLIK2 被多次定义为不同的值。

Kubernetes 用于将最终值分配给变量的优先规则是什么?

# create some test Key/Value configs and Key/Value secrets
kubectl create configmap myconfigmap --from-literal=DUPLIK1=myConfig1 --from-literal=CMKEY1=CMval1 --from-literal=DUPLIK2=FromConfigMap -n mydebugns

kubectl create secret generic mysecret --from-literal=SECRETKEY1=SECval1 --from-literal=SECRETKEY2=SECval2 --from-literal=DUPLIK2=FromSecret -n mydebugns

# create a test pod
cat <<EOF | kubectl apply -n mydebugns -f -
apiVersion: v1
kind: Pod
Metadata:
  name: pod1
spec:
  containers:
    - name: container1
      image: busyBox
      command: [ "/bin/sh","-c","env" ]
      env:
      - name: DUPLIK1
        value: "Key/Value defined in field env"
      envFrom:
      - configMapRef:
          name: myconfigmap
      - secretRef:
          name: mysecret          
  restartPolicy: Never
EOF

显示环境变量值。结果是确定性的。删除资源+重新创建总是以相同的结果结束。

kubectl logs pod/pod1 -n mydebugns

CMKEY1=CMval1
DUPLIK1=Key/Value defined in field env
DUPLIK2=FromSecret
SECRETKEY1=SECval1
SECRETKEY2=SECval2

清理测试资源

kubectl delete pod/pod1 -n mydebugns
kubectl delete cm/myconfigmap  -n mydebugns
kubectl delete secret/mysecret -n mydebugns

解决方法

来自 Kubernetes docs

$collection.foo[].bar[[1]].foobar[].foo :要在容器中设置的环境变量列表。 无法更新。

envVar:用于填充环境变量的源列表 容器。源中定义的键必须是 C_IDENTIFIER。 当容器处于 开始。当一个键存在于多个源时,关联的值 最后一个来源将优先。 由 Env 定义的值 具有重复键的将优先。无法更新。

上面的链接明确指出 envFrom 将优先于 env 并且无法更新。

此外,当引用的键存在于多个资源中时,与最后一个源关联的值将覆盖所有先前的值。

基于上述,您看到的结果是预期的行为:

  1. envFrom 被添加为 DUPLIK1 字段,因此无法更新
  2. env 被添加为 DUPLIK2,因此秘密中的那个优先,因为它在最后一个定义