跳到主要内容

Configmap 挂载

当你在Kubernetes Pod中将ConfigMap挂载到一个卷时,ConfigMap中的每个数据项都会在容器内的文件系统中变成一个单独的文件。

==文件的名称对应于ConfigMap中的键,文件的内容对应于该键关联的值。==

例如,如果你有一个如下的ConfigMap:

apiVersion: v1  
kind: ConfigMap
metadata:
  name: my-config
data:
  key1: value1
  key2: value2

并且你在一个Pod中这样挂载它:

apiVersion: v1  
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

那么,在mycontainer容器内,/etc/config目录会看起来像这样:

/etc/config/  
|-- key1
|-- key2

如果你运行cat /etc/config/key1,它将输出value1。同样,运行cat /etc/config/key2将输出value2

subpath

如果你在挂载ConfigMap时使用subPath,可以指定 configmap 中的某些键值对生成容器内的文件。

例如,如果你有一个ConfigMap,并且你在一个Pod中带有subPath这样挂载它:

apiVersion: v1  
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config/key1
      subPath: key1
  volumes:
  - name: config-volume
    configMap:
      name: my-config

那么,在mycontainer容器内,/etc/config/key1将是一个包含value1的单一文件,而不是一个目录。在subPath中指定的键(在此例中为key1)决定了从ConfigMap中挂载哪个数据项。

如果你运行cat /etc/config/key1,它将输出value1/etc/config/key2文件将不存在,因为只有key1subPath中被指定。

🗨:
所以在这个例子中 subPath 的值只能是 key1 或者 key2, 不能是其他任何的值,对吗?

🤖:
是的,你是正确的。在这个例子中,subPath的值只能是key1key2。这是因为你在ConfigMap中定义了这两个键,所以只有这两个键可用作subPath的值。

如果你在subPath中使用了其他的值(比如一个你没有在ConfigMap中定义的键),那么当Kubernetes试图挂载该键时,会找不到对应的文件,因此会失败。

所以,确保你在subPath中使用的键已经在你的ConfigMap中定义。

From env 和 From file

controlplane ~ ➜  k create cm config-from-file --from-file=config.txt
controlplane ~ ➜ echo -e "foo3=lili\nfoo4=lele" > config.txt

controlplane ~ ➜ echo -e "var1=val1\n# this is a comment\n\nvar2=val2\n#anothercomment" > config.env
controlplane ~ ➜ k create cm config-from-env --from-env-file=config.env
configmap/config-from-env created

controlplane ~ ➜ k get cm config-from-file -oyaml
apiVersion: v1
data:
config.txt: | # 文件名作为 key, 文件内容作为value
foo3=lili
foo4=lele
kind: ConfigMap

controlplane ~ ✖ k get cm config-from-env -oyaml
apiVersion: v1
data:
var1: val1 # env-file 的每一行都解析为了这里的一对键值对
var2: val2
kind: ConfigMap