Docker卷与Kubernetes持久化卷

22
我找到的最接近的答案是这个
但我想知道的是,Kubernetes是否完全忽略Dockerfile中的VOLUME命令?或者数据将持久保存在两个地方?一个是Docker卷(在运行Pod的主机上),另一个是Kubernetes的PV?
问这个问题的原因是因为我从docker hub部署了一些包含VOLUME命令的容器。同时,我也将PVC附加到我的Pod上。我在思考本地卷(Docker卷,而不是K8 PV)是否会在节点上创建?如果我的Pod被调度到另一个节点,那么另一个新的卷会被创建吗?
此外,感谢@Rico指出,-v命令和Kubernetes的挂载将优先于dockerfile VOLUME命令,但如果情况如下所示:
-Dockerfile VOLUME放置在“/myvol”上 -Kubernetes将PVC挂载到“/anotherMyVol”
在这种情况下,myvol会挂载到本地节点硬盘上吗?并导致未知的本地数据持久化?

1
我一直认为Kubernetes Pod的volumeMounts与docker run -v选项的工作方式完全相同,包括它们如何与Dockerfile VOLUME声明互动。 - David Maze
@DavidMaze,您能详细说明它如何与Dockerfile VOLUME交互吗? - Sam YC
2个回答

13

如果您不在Kubernetes Pod规范上覆盖它,则不会被忽略。例如,如果您遵循Docker文档中此示例

$ docker run -it container bash
root@7efcf5ef12a2:/# mount | grep myvol
/dev/nvmeXnXpX on /myvol type ext4 (rw,relatime,discard,data=ordered)
root@7efcf5ef12a2:/#

您将看到它挂载在容器运行的主机的根驱动器上。实际上,Docker在/var/lib/docker/volumes下的主机文件系统上创建了一个卷(/var/lib/docker是您的Docker图形目录):

$ pwd
/var/lib/docker/volumes
$ find . | grep greeting
./d0bc20d085243c39c4f386dce2f6cafcd8146128d6b0c8f9dcb27cfb61a7ecab/_data/greeting

您可以在Docker中使用-v选项来覆盖此设置:

$ docker run -it -v /mnt:/myvol container bash
root@1c7211cf43d0:/# cd /myvol/
root@1c7211cf43d0:/myvol# touch hello
root@1c7211cf43d0:/myvol# exit
exit
$ pwd # <= on the host
/mnt
$ ls
hello

在 Kubernetes 上,您可以在 Pod 规范中覆盖它:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: container
    volumeMounts:
    - name: storage
      mountPath: /myvol
  volumes:
    - name: storage
      hostPath:
        path: /mnt
        type: Directory

1
好的,我明白了,Kubernetes会覆盖挂载点并优先于dockerfile的“volume”。如果dockerfile中的“volume”是在“myvol”上,而我的Kubernetes将其挂载到另一个路径“anotherMyvol”,那么这种情况下,“myvol”会挂载到本地节点吗?我们能否要求docker忽略“volume”命令? - Sam YC
你将拥有两个卷。如果你没有在使用或存储任何内容,那么你真的不太在意docker是否挂载了另一个卷。我认为只有当你的dockerfile定义了数百个卷时,这可能会成为一个问题。 - Rico
原因是,我有一个公共Dockerfile,其中包含三个“volume”命令,但我只对其中一个感兴趣,因此我使用Kubernetes PVC将其挂载。我担心其余两个会逐渐增加主机节点磁盘的占用,并且难以管理。 - Sam YC
如果可以使用volumeMounts,那么什么情况下会使用持久化卷/持久化卷声明? - David
嗯,你仍然需要在你的 Pod 定义中拥有 PVC,定义为“volume”。 - Rico

1
你需要明确定义一个PersistentVolumeClaim和/或PersistentVolume。这不会自动完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接