Kubernetes在容器内的文件中将卷安装在现有目录上

时间:2019-09-27 05:58:01

标签: docker kubernetes mount kubernetes-pod

我正在使用版本为1.11和CephFS的k8s作为存储。

我正在尝试在Pod中挂载在CephFS上创建的目录。为了达到相同的目的,我编写了以下volume和volume mount配置 在部署配置中

音量

{
  "name": "cephfs-0",
  "cephfs": {
    "monitors": [
      "10.0.1.165:6789",
      "10.0.1.103:6789",
      "10.0.1.222:6789"
    ],
    "user": "cfs",
    "secretRef": {
      "name": "ceph-secret"
    },
    "readOnly": false,
    "path": "/cfs/data/conf"
  }
}

volumeMounts

{
  "mountPath": "/opt/myapplication/conf",
  "name": "cephfs-0",
  "readOnly": false
} 

安装正常。我可以看到ceph目录,即/ cfs / data / conf挂载在/ opt / myapplication / conf上,但这是我的问题。

我已经在/ opt / myapplication / conf位置将配置文件作为docker映像的一部分存在。当部署尝试挂载ceph卷时,位于/ opt / myapplication / conf位置的所有文件都会消失。我知道这是挂载操作的行为,但是有什么方法可以将容器中已经存在的文件持久保存在要挂载的卷上,以便其他正在挂载相同卷的Pod可以访问该配置。文件。也就是说,应该可以在CephFS上的/ cfs / data / conf位置访问位于/ opt / myapplication / conf位置的pod中已经存在的文件。

有可能吗?

我浏览了docker文档,其中提到了

  

使用容器填充卷   如果您如上所述启动一个容器来创建新的卷,并且该容器中有要挂载的目录中的文件或目录(例如/ app /以上),则目录的内容将被复制到该卷中。然后,容器安装并使用该卷,使用该卷的其他容器也可以访问预先填充的内容。

这符合我的要求,但是如何用k8s量实现它?

1 个答案:

答案 0 :(得分:5)

不幸的是,Kubernetes的卷系统与Docker的卷系统有很大不同,因此这不可能直接实现。如果只有一个文件(或数量很少),则可以使用如下所示的subPath投影:

volumeMounts:
- name: cephfs-0
  mountPath: /opt/myapplication/conf/foo.conf
  subPath: foo.conf

为每个文件重复该操作。但是,如果您有很多文件,或者它们可以变化,那么您必须在运行时处理此问题或使用模板工具。通常,这意味着将其安装在其他位置并在主进程开始之前设置符号链接。