Kubernetes:参考以前定义的ConfigMap键值对

时间:2018-11-09 14:54:17

标签: docker kubernetes

TL; DR

  

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

完整版本

我正在为接受以下内容的应用程序编写部署规范 在启动时通过环境变量对其进行配置。一些 环境变量是从其他变量派生的。如果我正在设定 它们作为要在应用程序启动时来源的文件,我只是 做

[me@myserver ~]$ cat ./myenv.sh
export FOO=foo
export BAR=bar
export FOOBAR=$FOO$BAR
[me@myserver ~]$ . ./myenv.sh
[me@myserver ~]$ printenv FOOBAR
foobar

但是,通过引用在ConfigMap中执行此操作的类似方法 先前定义的键/值对不起作用(请参阅示例ConfigMap 和下面的Pod)。结果如下:

[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_CONFIGMAP_FOOBAR的期望值为foobar

我尝试将以下说明交叉应用 Use ConfigMap-defined environment variables in Pod commands 从文档中:

  

您可以在 command 中使用ConfigMap定义的环境变量。   使用 $(VAR_NAME) 的Pod规范部分   Kubernetes替换语法。

但是,这显然行不通,而且我一直找不到 在我的研究中回答。

我怀疑我已经知道答案了,但是有什么方法可以完成 这个吗?

MCVE

ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app

data:
  MY_CONFIGMAP_FOO: foo
  MY_CONFIGMAP_BAR: bar

  # Desired concatenation would be `foobar`
  MY_CONFIGMAP_FOOBAR: $(MY_CONFIGMAP_FOO)$(MY_CONFIGMAP_BAR)

Pod

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"

2 个答案:

答案 0 :(得分:2)

您可以借助此工具envsubst达到预期的结果。

按照以下方式创建ConfigMap

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

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

答案 1 :(得分:0)

建议使用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)