我可以在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替换语法。
但是,这显然行不通,而且我一直找不到 在我的研究中回答。
我怀疑我已经知道答案了,但是有什么方法可以完成 这个吗?
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"
答案 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)