正确挂载 ConfigMap 的姿势

常见做法

在 k8s 中,使用配置文件常见的就是创建一个 ConfigMap,然后直接挂载它

首先我们创建一个 configmap,填入一些信息

apiVersion: v1
kind: ConfigMap
metadata:
  name: configname
data:
  config.json: json-value
  config.yaml: yaml-value

当我们想在 pod 中使用 ConfigMap 中的配置文件,则需要挂载进去,kubernetes 将 ConfigMap 中所有的内容以 data 中的 key 为文件名,value 为 文件内容,全部写入一个临时目录中,然后再以 volume 的形式挂载到容器中

apiVersion: apps/v1
kind: Deployment
metadata:
  name: testvolume
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mount-config
  template:
    metadata:
      labels:
        app: mount-config
    spec:
      containers:
        - image: alpine:3.7
          name: c0
          volumeMounts:
            - name: volumename
              mountPath: /etc/config
      volumes:
        - configMap:
            name: configname
          name: volumename

挂载需要我们做两件事情

  1. 声明一个 volume,定义一个名称 volumename ,然后引用 ConfigMap
  2. 在 container 的 volumeMounts 中使用已经声明的 volume,挂载到目录 /etc/config

如上,你就可以在这个 container 的 /etc/config 下找到两个文件

上面的这种方式的挂载点在 /etc/config 它将 ConfigMap 中的所有 key 作为文件名,所以 value 作为文件内容都挂载进来,

文件重命名

ConfigMap在挂载时,可以通过修改 volume 的定义,修改挂载时的文件名称或相对路径

...
      volumes:
        - configMap:
            name: configname
            items:
              - key: config.json
                path: rename.json
              - key: config.yaml
                path: yaml/config.yaml
          name: volumename

挂载点还是 /etc/config,有以下文件