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
ConfigMap
MY_CONFIGMAP_FOOBAR
的期望值为foobar
。
我尝试交叉应用以下指令,来自文档中的在Pod命令中使用ConfigMap定义的环境变量:
您可以使用Kubernetes替换语法
$(VAR_NAME)
, 在Pod规范的command
部分中使用ConfigMap定义的环境变量。
然而,这显然没有起作用,我也未能在研究中找到答案。
我怀疑我已经知道答案,但有没有任何方法可以实现这个目标呢?
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)
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"
结语:二十九个月后
在额外的两年半时间里,与 Kubernetes 的工作经验之后,我最终的解决方案(和建议)是使用Helm chart,最好是通过 Ansible 管理的部署。
FOO
和BAR
,并将它们组合在一起作为变量FOOBAR
。从FOO
和BAR
派生FOOBAR
将更方便且不容易出错。 - Deacon