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

Dou*_* R. 5 docker kubernetes

长话短说

我可以在 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
Run Code Online (Sandbox Code Playgroud)

但是,在 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
Run Code Online (Sandbox Code Playgroud)

的期望值MY_CONFIGMAP_FOOBARfoobar

我尝试在文档中的“在 Pod 命令中使用 ConfigMap 定义的环境变量”下交叉应用以下说明 :

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

然而,这显然行不通,我在研究中一直找不到答案。

我怀疑我已经知道答案了,但是有什么办法可以做到这一点吗?

MCVE

配置映射表

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)
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

尾声:二十九个月后

在使用 Kubernetes 两年半之后,我的最终解决方案(和建议)是使用 Helm 图表,最好使用 Ansible 托管的部署。

Emr*_*ain 2

您可以借助以下工具实现预期结果:envsubst

创建ConfigMap如下方式,

envsubst < my-app-config.yaml | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)

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