我可以在 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_FOOBAR是foobar。
我尝试在文档中的“在 Pod 命令中使用 ConfigMap 定义的环境变量”下交叉应用以下说明 :
command您可以使用 Kubernetes 替换语法在 Pod 规范部分中使用 ConfigMap 定义的环境变量$(VAR_NAME)。
然而,这显然行不通,我在研究中一直找不到答案。
我怀疑我已经知道答案了,但是有什么办法可以做到这一点吗?
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 托管的部署。
您可以借助以下工具实现预期结果:envsubst。
创建ConfigMap如下方式,
envsubst < my-app-config.yaml | kubectl apply -f -
Run Code Online (Sandbox Code Playgroud)
现在,您的所有环境变量都ConfigMap将替换为解析值。
| 归档时间: |
|
| 查看次数: |
3282 次 |
| 最近记录: |