【问题标题】:Kubernetes: Reference Previously-Defined ConfigMap key-value pairKubernetes:参考之前定义的 ConfigMap 键值对
【发布时间】: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


    【解决方案1】:

    借助此工具,您可以达到预期的效果:envsubst

    按照以下方式创建ConfigMap

    envsubst < my-app-config.yaml | kubectl apply -f -
    

    现在,ConfigMap 上的所有环境变量都将替换为解析值。

    【讨论】:

    • 不是我希望的答案,但比预期的要好。但除非有人给出完全依赖 Kubernetes 的答案,否则我肯定会接受。
    • 这也有效。 You can use ConfigMap-defined environment variables in the command section of the Pod specification using the $(VAR_NAME) Kubernetes substitution syntax.你在这里遇到什么问题?
    • 确实如此。我什至在我最初的问题中引用了这一点。 ;-) 我要解决的问题是应用程序单独使用各种环境变量并将它们组合在一起,但是当它们组合在一起时,它希望它们组合成第三个环境变量。即,它分别使用变量FOOBAR,并将它们组合在一起作为变量FOOBAR。能够从FOOBAR 派生FOOBAR 会很方便且不易出错。
    【解决方案2】:

    建议使用kind: Deployment 组合变量在该配置文件中工作正常。我没有直接尝试过 pod。

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 2021-05-17
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-26
      相关资源
      最近更新 更多