覆盖容器规范中定义的环境值

时间:2019-01-28 08:47:45

标签: deployment kubernetes environment-variables containers configmap

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

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

然后在我的容器的定义(在Deployment / statefulset清单中)中,我具有以下内容:

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

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

1 个答案:

答案 0 :(得分:3)

来自Kubernetes api Refernece:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/#container-v1-core

  

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

因此,上面明确指出 env 将优先于 envFrom

  

当多个来源中都存在键时,与最后一个来源相关联的值将优先。

因此,有关覆盖的信息,请参见以下内容:

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