Kubernetes ConfigMap:从文件中导入尽可能多的值而不是一个?

cha*_*ows 5 kubernetes

从文件创建一个新的 ConfigMap:
kubernetes create configmap foo --from-file=foo

这是 ConfigMap 在内部的外观: kubernetes get configmaps foo -o yaml

apiVersion: v1
data:
  foo: |
    VAR1=value1
    VAR2=value2
Run Code Online (Sandbox Code Playgroud)

然后,我使用这个 ConfigMap 在容器中创建一组环境变量:

apiVersion: v1
kind: Pod
metadata:
  labels:
    name: app
  name: app
spec:
  containers:
    - name: app-server
      image: app:latest
      ports:
        - containerPort: 3000
      envFrom:
      - configMapRef:
          name: foo
      command: ["/bin/bash", "-c", "printenv"]
Run Code Online (Sandbox Code Playgroud)

当容器命令运行时,我看到以下输出printenv

foo=VAR1=value1
VAR2=value2
Run Code Online (Sandbox Code Playgroud)

因此,echo $foopod 中的命令返回:
VAR1=value1 VAR2=value2

根据 ConfigMap 的文档--from-file,这是预期的行为。

这将是一个创造性的方式(和合适的地方),以某种方式获得该文件的提供给吊舱作为单独的ENV变量的值VAR1VAR2VAR3,等?

pag*_*gid 3

对于 Kubernetes 的当前版本 (1.6.x),这是不可能的。正如官方文档中所写kubectl create configmap

--from-file:密钥文件可以使用其文件路径指定,在这种情况下,文件基名将用作 configmap 密钥,或者可以选择使用密钥和文件路径,在这种情况下,将使用给定的密钥。指定一个目录将迭代该目录中的每个命名文件,其基本名称是有效的 configmap 键。

当您想要创建像这样使用的 configmap 作为容器配置的输入时,您可以使用如下选项envFrom创建它:--from-literal

kubectl create configmap foo --from-literal=var1=value1 --from-literal=var2=value2
Run Code Online (Sandbox Code Playgroud)

为了仍然保留该文件,您可以将文件转换为某种文件,然后运行以下命令,如下所示:

eval "kubectl create configmap foo $(cat foo.txt | sed -e 's/^/--from-literal=/' | tr "\n" ' ')"
Run Code Online (Sandbox Code Playgroud)

除此之外,也许检查一下--flattenGitHub 上的 flag 提案等未完成的提案也值得您花时间。

还要注意变量命名。iircVAR1VAR2不是有效的属性名称 - 它们必须是小写,这可能会在传递它们时导致一些问题。