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

问题描述 投票:4回答:1

我正在使用版本为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量实现它?

docker kubernetes mount kubernetes-pod
1个回答
4
投票

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

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

对每个文件重复一次。但是,如果您有很多文件,或者它们可以变化,那么您必须在运行时进行处理。通常,这意味着将其安装在其他位置并在主进程开始之前设置符号链接。

© www.soinside.com 2019 - 2024. All rights reserved.