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