背景:

我们项目组使用的是腾讯云的容器k8s,镜像是研发同学构建的,其中的配置文件通过configmap的方式进行挂载。

 

今天,新增了一个需求,需要在pod启动时需要新建一个路径 /app/subserver/config/disconf/,把我们的配置文件挂载到该目录下。但是启动的时候发现死活起不来,主要报错:read only fie system

 

我检查了挂载的路径设置,也检查了容器内的路径权限问题。发现都没有问题,权限都有读写执行的,为什么会报只读系统呢?

在搜索引擎找了一番,有几个类似的错误,不过大多是宿主机的报错,不是pod的报错。比如下面:

 

找不到,只能回到问题上来。

权限也有,路径也在,为什么还是说是只读文件系统呢?

百度也不是万能的,必应也不行,谷歌试试?但正好看到旁边研发同事有空,遂请教。大佬回:这个启动时候要创建写入文件,路径有吗?权限有吗?我一一检查,都有。大佬沉吟两秒:你进去创建一个文件试试。

另外提一句,腾讯云的容器服务是可以设置启动命令的,比如我现在,就需要让pod启动后休眠一会儿,不然因为pod报错,它会不断自启,那就没办法进去检查了。在高级设置里面,或者可以直接加在yaml文件里:

进入容器,尝试创建文件:

 

熟悉的报错。

明明路径有权限,为什么提示只读呢?

大佬问:他这个路径是主机文件系统的吗?

主机文件系统?我看看。

一语惊醒梦中人!

这个不是pod的主机路径啊,这是挂载的configmap的路径啊。原来如此。因为挂载的configmap是外部挂载的,不属于pod自有的系统路径,所以是无法在一个configmap路径下面再新建路径的。

那就好办了。把 /app/subserver/config/disconf/ 改为 /app/config/disconf/ 这样他就是在/app/这个路径下面创建路径并写入文件,这样应该就没问题了吧。

调整挂载的路径之后,可以看到,已经正常写入了三个文件:

 

总结:容器中挂载的configmap路径,不能再次作为新建文件的路径,因为不属于pod的系统路径。

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐