kubernetes 覆盖容器规范中定义的env值

yacmzcpb  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(153)

我有一个configmap,其中我在data部分定义了以下键值Map:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: test
  name: test-config
data:
  TEST: "CONFIGMAP_VALUE"

字符串
然后在容器的定义中(在deployment / statefulset manifest中)有以下内容:

env:
        - name: TEST
          value: "ANOTHER_VALUE"
        envFrom:
        - configMapRef:
            name: test-config


当这样做时,我期望来自configmap的值(TEST=“CONFIGMAP_VALUE”)将覆盖容器规范(TEST=“ANOTHER_VALUE”)中指定的(默认)值,但事实并非如此(TEST总是从容器规范中获取值)。我找不到任何相关的文档-有可能实现这种env变量值覆盖吗?

5kgi1eie

5kgi1eie1#

Kubernetes API参考:
envFrom:用于填充容器中环境变量的源列表。源中定义的键必须是C_IDENTIFIER。当容器启动时,所有无效的密钥都将作为事件报告。当一个键存在于多个源中时,与最后一个源关联的值将优先。由具有重复键的环境定义的值将优先。无法更新。
所以上面清楚地说明了env将优先于envFrom
当一个键存在于多个源中时,与最后一个源关联的值将优先。
因此,对于重写,不要使用envFrom,而是在env中定义两次值,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: default
  name: test-config
data:
  TEST: "CONFIGMAP_VALUE"
---
apiVersion: v1
kind: Pod
metadata:
  name: busy
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox
    env:
    - name: TEST
      value: "DEFAULT_VAULT"
    - name: TEST
      valueFrom:
        configMapKeyRef:
          name: test-config
          key: TEST
    command:
    - "sh"
    - "-c"
    - >
      while true; do
        echo "$(TEST)";
        sleep 3600;
      done

字符串
检查:

kubectl logs busy -n default
CONFIGMAP_VALUE

相关问题