关于configmap如何挂载的问题【rancher】

背景:

如果我们想在pod中引入自己的配置文件,该怎么做呢?

你可能会说,在构建镜像的时候,把配置文件也打进去不就行了么?当然这是一种方法,不过很麻烦,因为每次修改配置,都要重新构建镜像。所以,通常的方式是,在启动pod的时候,将我们自己的配置映射到pod中,那这就要用到configmap或者secret了。configmap和secret的区别是:configmap 定义普通的配置文件,secret 定义加密的配置文件。这里我们先介绍configmap。以nginx为例。假如我想把我自己的nginx.conf 映射到pod的/etc/nginx/nginx.conf 中,该怎么做呢?

第一步:创建configmap

这里我从文件中读取。创建好后,就可以看到。

 

 第二步:创建deployment

首先要在pod的存储中添加卷,这里卷的类型选择configmap。选择之后,就可以看到已经创建好的configmap。

创建卷

 

 挂载到Pod

 注意这里的挂载点和卷内子路径。

重点介绍一下这两个怎么配置

首先,我的需求是:用 ConfigMap 中的 nginx.conf 文件替换 Nginx 的主配置文件,所以挂载点应为 /etc/nginx/nginx.conf而不是 /etc/nginx/。

为什么不能挂载到 /etc/nginx/

因为 ConfigMap 在挂载时的行为是这样的:

  • 如果你挂载到 目录(比如 /etc/nginx/),那么:

    • ConfigMap 中的每个 key 会变成目录下的一个文件(即:/etc/nginx/nginx.conf)。

    • 这会覆盖整个目录内容(特别是使用 nginx:alpine 这类官方镜像,它 /etc/nginx/ 下有很多默认文件,都会被“影子文件”覆盖掉)。

    • 可能导致 nginx 启动失败,因为其它依赖的配置(如 mime.types)没了。

正确做法(只替换 nginx.conf 一个文件):

  • 挂载点/etc/nginx/nginx.conf

  • 卷内子路径nginx.conf(ConfigMap 中的 key)

这种方式只替换主配置文件,不影响目录里其他配置。

图示对比

挂载方式结果问题
/etc/nginx/ + 不填子路径 覆盖整个目录 其他配置丢失,容易导致 nginx 启动失败
/etc/nginx/nginx.conf + nginx.conf 作为子路径 只替换这个文件 ✔️ 推荐、安全

补充说明:

 Nginx 容器镜像中 /etc/nginx/ 目录里一般包含这些默认文件:

/etc/nginx/ ├── nginx.conf # 主配置 ├── conf.d/ # 子配置 ├── mime.types # 重要的类型定义

如果你用 ConfigMap 覆盖了整个 /etc/nginx/,这些都会不见,nginx 会报错说缺失 mime.types 等。

总结一句话:

你只想替换 nginx.conf,挂载点就要是 /etc/nginx/nginx.conf,配合 卷内子路径 = nginx.conf,否则你会误伤整个配置目录。

ConfigMap 中有多个 key(比如 nginx.conf, httpd.conf)时:

如果你想把其中某一个 key 单独挂载为某个具体路径的文件(这是你说的情况):

你想要的目标文件挂载点卷内子路径(ConfigMap 的 key)
/etc/nginx/nginx.conf /etc/nginx/nginx.conf nginx.conf
/etc/nginx/httpd.conf /etc/nginx/httpd.conf httpd.conf

这样可以精确挂载某个 key 到指定路径。

案例二:

 

 

 

 

 

 

 

posted @ 2025-06-19 15:04  羊脂玉净瓶  阅读(36)  评论(0)    收藏  举报