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

From Kubernetes docs:

envVar:容器中要设置的环境变量列表。无法更新。

envFrom:填充环境变量的源列表容器。在源中定义的键必须是C_IDENTIFIER。当容器启动时,所有无效的键都将作为事件报告开始。当一个键存在于多个源中时,该值关联最后一个源将优先。由环境定义的值具有重复密钥的将优先考虑。无法更新

上面的链接清楚地说明了env将优先于envFrom,并且不能更新。

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

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

  1. DUPLIK1被添加为env字段,因此无法更新
  2. DUPLIK2被添加为envFrom,因此来自secret的优先级,因为它在最后
  3. 中定义。

最新更新