Kubernetes:如何从 configmap 扩展 env 变量

Eri*_*uan 5 docker kubernetes

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

~/.env 文件

HELLO=hello
WORLD=world
HELLO_WORLD=${HELLO}_${WORLD}
Run Code Online (Sandbox Code Playgroud)

然后我创建配置映射

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
Run Code Online (Sandbox Code Playgroud)

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

$ printenv HELLO_WORLD

我希望看到hello_world,但我看到了${HELLO}_${WORLD}。变量未展开,因此我的应用程序引用这些变量将获得未展开的值。

我如何确保变量得到扩展?

如果重要的话,我的图像使用的是高山。

Gra*_*man 8

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

例如,这将起作用:

配置图

apiVersion: v1
data:
  HELLO: hello
  WORLD: world
kind: ConfigMap
metadata:
  name: env-variables
  namespace: default
Run Code Online (Sandbox Code Playgroud)

部署:

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)
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但我有一个包含很多变量的文件,所以这种方法太冗长了。我正在考虑在创建 configMap 并上传到 kubernetes 之前扩展变量 (2认同)