关于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/
目录里一般包含这些默认文件:
如果你用 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 到指定路径。
案例二: