27

我有一个 configmap,我在该部分中定义了以下键值映射data

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

然后在我的容器的定义中(在部署/有状态集清单中)我有以下内容:

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

执行此操作时,我期望 configmap (TEST="CONFIGMAP_VALUE") 中的值将覆盖容器规范 (TEST="ANOTHER_VALUE") 中指定的(默认)值,但事实并非如此(TEST 总是得到容器规范中的值)。我找不到任何相关文档 - 是否有可能实现这样的环境变量值覆盖?

4

1 回答 1

40

来自Kubernetes API 参考

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

所以上面清楚地表明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
于 2019-01-28T09:28:32.450 回答