如何通过Deployment配置将ConfigMap文件新增到已有目录且不覆盖原有内容
ConfigMap动态文件挂载到已有目录不覆盖原有内容的实现方案
可以实现,推荐使用init容器配合共享存储卷的方案,无需提前知晓ConfigMap的键名,适配文件名动态变化的场景,核心逻辑是将镜像原有目录文件和ConfigMap的文件合并后再挂载给主容器使用。
实现原理
- 定义一个
emptyDir类型的共享卷,作为主容器最终的配置目录挂载源 - 新增init容器,同时加载主容器镜像、挂载ConfigMap临时目录和共享卷:
- 先将镜像自带的原有配置文件拷贝到共享卷
- 再将ConfigMap中的所有配置文件拷贝到共享卷的同一路径下,可自定义是否覆盖重名文件
- 主容器直接挂载该共享卷到目标
/config路径即可完成合并
Deployment示例清单
apiVersion: apps/v1 kind: Deployment metadata: name: your-deployment spec: replicas: 1 selector: matchLabels: app: your-app template: metadata: labels: app: your-app spec: volumes: # 共享存储卷:存放合并后的配置文件 - name: config-volume emptyDir: {} # 引用你的业务ConfigMap - name: cm-config configMap: name: config-files-configmap initContainers: - name: merge-config # 镜像和主容器保持一致,保证能读取到原有配置文件 image: your-main-image:tag volumeMounts: - name: config-volume mountPath: /tmp/target-config - name: cm-config mountPath: /tmp/cm-config command: ["/bin/sh", "-c"] args: # 先拷贝原有配置,再拷贝ConfigMap配置合并,-n参数表示不覆盖已存在的文件,不需要可以移除 - cp -a /config/* /tmp/target-config/ && cp -an /tmp/cm-config/* /tmp/target-config/ containers: - name: your-app-container image: your-main-image:tag volumeMounts: # 挂载合并后的配置目录到业务预期路径 - name: config-volume mountPath: /config
补充说明
- 该方案完全适配ConfigMap键名动态变化的场景,新增/删除ConfigMap中的文件时不需要修改Deployment配置,重建Pod即可自动同步
- 如需开启重名文件覆盖,移除cp命令的
-n参数即可 - 若集群版本 >= 1.28,也可以开启
ConfigMapMutableMountsAlpha特性门控,直接挂载ConfigMap到已有目录不会覆盖原有文件,但该特性目前处于实验阶段,不建议生产环境使用
内容的提问来源于stack exchange,提问作者RMNull
相关产品推荐
相关产品推荐

