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

6
我将使用配置映射将环境变量注入到我的容器中。其中一些变量是通过连接变量创建的,例如:
~ / .env文件
HELLO=hello
WORLD=world
HELLO_WORLD=${HELLO}_${WORLD}

我随后创建配置映射

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

部署清单引用了该配置映射。

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

当我进入正在运行的Pod并执行以下命令时:

$ printenv HELLO_WORLD

我期望看到的是hello_world,但实际上我看到的是${HELLO}_${WORLD}。变量没有被展开,因此我的应用程序将得到未展开的值。

我该如何确保变量被展开?

如果有影响的话,我的镜像正在使用Alpine。


目前 ConfigMaps 不支持变量/密钥的扩展。唯一的方法是像 @Grant 在他的回答中所做的那样声明它们。 - ITChap
2个回答

9
我找不到任何有关插值环境变量的文档,但我成功地通过从configmap中删除插入的变量并直接在deployment中列出该变量来使其正常工作。如果所有变量都直接列在deployment中也可以工作。看起来kubernetes不会对从configmaps加载的变量应用插值。
例如,这将起作用:
Configmap
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)

2
这很好,但我有一个包含许多变量的文件,所以这种方法太冗长了。我正在考虑在创建configMap并上传到Kubernetes之前扩展变量。 - Eric Guan

2
“我正在考虑在创建configMap并上传到Kubernetes之前扩展变量。” 另一个并行的方法是使用 kustomize:kustomize允许您自定义原始的、无模板的YAML文件以满足多种目的,同时保留原始的YAML文件不变且可用。它像make一样,因为它所做的事情在一个文件中声明,而像sed一样,因为它生成编辑过的文本。sed部分应该能够在您的yaml文件中生成正确的扩展值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接