【发布时间】:2019-04-13 03:54:27
【问题描述】:
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
配置映射
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)
吊舱
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 图表,最好使用 Ansible 托管的部署。
【问题讨论】:
标签: docker kubernetes