配置文件挂载到 K8s 的 Pod 中有多种方式,可以用 hostPath 的方式将配置文件挂载到容器内,这种方式如果配置文件比较经常修改就不太适用,修改配置文件后,需要重新build 和部署镜像才能使修改生效。比较推荐的是用 configMap 的方式来挂载配置。使用 configMap 方式挂载的配置,可以通过 kubectl edit cm xxxx-config来修改配置,然后 kubectl delete pods xxxxx后, pod 自动重启后生效配置。

问题

以 configMap 方式挂载配置默认是将 configMap 中的配置挂载到某个 目录下,比如下面的配置会把 configMap 中的 config.json 配置挂载到 /myproject/config1/config.json,而且有个附带的效果,如果之前有其他的文件通过 COPY命令 COPY 到了/myproject/config/下面,这些文件会被抹去。

containers:
- image: alpine:latest
  name: myproject
  volumeMounts:
  - mountPath: /myproject/config1/
    name: myproject
volumes:
- name: myproject
  configMap:
    items:
      - key: config.json
        path: config.json

例子

比如 COPY了另外一个配置文件 test.json到 /myproject/config1/目录下,然后通过上面的 configMap 方式挂载主要的配置文件 config.json 到 /myproject/config1/config.json,结果config1下原本的 test.json被删除了。

挂载 configMap 前
挂载 configMap 后

解决方法

如何才能够以文件的方式来挂载 configMap 中的配置呢?怎么把 configMap 中的配置挂载到 /myproject/config1/config.json并且不删除 /myproject/config1/目录下的其他配置呢?可以通过 subPath 来实现,添加 subPath: config.json配置,同时需要修改 mountPath, mountPath: /myproject/config1/-> mountPath: /myproject/config1/config.json详见如下配置:

containers:
- image: alpine:latest
  name: myproject
  volumeMounts:
  - mountPath: /myproject/config1/config.json
    subPath: config.json
    name: myproject
volumes:
- name: myproject
  configMap:
    items:
      - key: config.json
        path: config.json

通过这种方式挂载后是不会删除 /myproject/config1/目录下的其他配置的。
在这里插入图片描述

Logo

开源、云原生的融合云平台

更多推荐