Kubernetes:如何从configmap扩展环境变量

时间:2018-08-25 00:48:07

标签: docker kubernetes

我正在使用配置映射将env变量注入到我的容器中。一些变量是通过串联变量来创建的,例如:

〜/ .env文件

import requests
base_url = "http://status.aws.amazon.com/"
response = requests.get(base_url, timeout=30)
parser.feed(response.content) # assuming it wants bytes, not unicode
print response.text

然后我创建配置图

HELLO=hello WORLD=world HELLO_WORLD=${HELLO}_${WORLD}

部署清单参考配置映射。

kubectl create configmap env-variables --from-env-file ~/.env

当我执行我正在运行的Pod并执行命令时

apiVersion: apps/v1beta1 kind: Deployment metadata: name: my-app spec: template: spec: containers: - name: my-image image: us.gcr.io/my-image envFrom: - configMapRef: name: env-variables

我希望看到$ printenv HELLO_WORLD,但是我看到hello_world。变量没有扩展,因此引用这些变量的应用程序将获得未扩展的值。

如何确保变量得到扩展?

如果有问题,我的图像使用的是高山图像。

2 个答案:

答案 0 :(得分:3)

我找不到任何有关插值环境变量的文档,但是我能够通过从configmap中删除插值变量并将其直接列出在部署中来使其工作。如果所有变量都直接在部署中列出,它也可以使用。看起来kubernetes不会将插值应用于从configmaps加载的变量。

例如,这将起作用:

配置映射

apiVersion: v1
data:
  HELLO: hello
  WORLD: world
kind: ConfigMap
metadata:
  name: env-variables
  namespace: default

部署:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: my-app
spec:
  template:
    spec:
      containers:
      - name: my-image
        image: us.gcr.io/my-image
        envFrom:
        - configMapRef:
            name: env-variables
        env:
        - name: HELLO_WORLD
          value: $(HELLO)_$(WORLD)

答案 1 :(得分:1)

  

我正在考虑在创建configMap并上传到kubernetes之前先扩展变量

另一种并行方法是使用kustomize

  

kustomize使您可以自定义无模板的原始YAML文件,以实现多种目的,而原始的YAML则保持不变并可以使用。

     

就像make,因为它所做的是在文件中声明,就像sed,因为它发出已编辑的文本。

sed部分应该能够在yaml文件中生成正确的扩展值。