Docker Kubernetes:引用先前定义的ConfigMap键值对 TL;博士

Docker Kubernetes:引用先前定义的ConfigMap键值对 TL;博士,docker,kubernetes,Docker,Kubernetes,我可以在ConfigMap中引用以前定义的键值对吗 完整版本 我正在为一个接受 它的配置在启动时来自环境变量。一些 环境变量是从其他变量派生的。如果我在设置 在应用程序启动时,我会简单地将它们作为源文件保存 做: 但是,通过引用在ConfigMap中执行此操作的简单方法 以前定义的键值对不起作用(请参见示例ConfigMap) 和吊舱,见下图)。结果如下: [me@myserver ~]$ kubectl create -f my-app-config.yaml -f my-app-pod.ya

我可以在ConfigMap中引用以前定义的键值对吗

完整版本 我正在为一个接受 它的配置在启动时来自环境变量。一些 环境变量是从其他变量派生的。如果我在设置 在应用程序启动时,我会简单地将它们作为源文件保存 做:

但是,通过引用在ConfigMap中执行此操作的简单方法 以前定义的键值对不起作用(请参见示例ConfigMap) 和吊舱,见下图)。结果如下:

[me@myserver ~]$ kubectl create -f my-app-config.yaml -f my-app-pod.yaml
configmap "my-app" created
pod "my-app" created
[me@myserver ~]$ kubectl exec -it my-app -- printenv | grep MY_CONFIGMAP
MY_CONFIGMAP_FOO=foo
MY_CONFIGMAP_FOOBAR=$(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)
MY_CONFIGMAP_BAR=bar
MY\u CONFIGMAP\u FOOBAR
的期望值为
FOOBAR

我试图交叉应用下面的说明 从文件中:

您可以在
命令中使用ConfigMap定义的环境变量
Pod规范中使用
$(变量名称)
Kubernetes替换语法

然而,这显然不起作用,我一直无法找到一个 答案在我的研究中

我想我已经知道答案了,但是有什么办法可以实现吗 这个

配置映射 豆荚 结语:29个月后
在与Kubernetes再合作两年半后,我的最终解决方案(和建议)是使用掌舵图,最好使用Ansible托管部署。

借助此工具,您可以实现预期结果:

按照以下方式创建
ConfigMap

envsubst < my-app-config.yaml | kubectl apply -f -
envsubst

现在,您的
ConfigMap
上的所有环境变量都将替换为解析值。

建议使用
kind:Deployment
组合变量在该配置文件中工作正常。我没有直接尝试过豆荚

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app

spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 1
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: alpine
        imagePullPolicy: IfNotPresent
        env:
        - name: MY_CONFIGMAP_FOOBAR
          value: $(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)

这不是我所希望的答案,但比预期的要好。但是,除非有人给出一个完全依赖库伯内特斯的答案,否则我肯定会接受。这也是可行的
您可以使用$(VAR_NAME)Kubernetes替换语法在Pod规范的命令部分使用ConfigMap定义的环境变量。
您在这里面临什么问题?确实如此。我甚至在最初的问题中提到了这一点我试图解决的问题是,应用程序使用不同的环境变量,既可以单独使用,也可以组合在一起使用,但是当它们组合在一起时,它希望它们组合成第三个环境变量。也就是说,它分别使用变量
FOO
BAR
,并作为变量
FOOBAR
组合在一起。如果能够从
FOO
BAR
中导出
FOOBAR
,将非常方便,并且不太容易出错。
apiVersion: v1
kind: Pod
metadata:
  name: my-app

spec:
  containers:
  - name: my-app
    image: alpine
    imagePullPolicy: IfNotPresent
    envFrom:
      - configMapRef:
          name: my-app
          
    command:
      - /bin/sh
      
    args:
      - -c
      - "while true; do sleep 3600; done"
envsubst < my-app-config.yaml | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app

spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 1
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: alpine
        imagePullPolicy: IfNotPresent
        env:
        - name: MY_CONFIGMAP_FOOBAR
          value: $(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)