【问题标题】:Docker volume vs Kubernetes persistent volumeDocker 卷与 Kubernetes 持久卷
【发布时间】:2018-10-30 10:43:30
【问题描述】:

我找到的最接近的答案是this

但我想知道的是,Dockerfile VOLUME 命令会被 Kubernetes 完全忽略吗?还是数据会被持久化到两个地方?一个用于 docker volume(在哪个 pod 运行的主机中),另一个是 Kubernetes 的 PV?

问这个的原因是因为我从 docker hub 部署了一些包含 VOLUME 命令的容器。同时,我还将 PVC 连接到我的吊舱。我在想是否会在节点中创建本地卷(docker 卷,而不是 K8 PV)?如果我的 pod 调度到另一个节点,那么会创建另一个新卷吗?


最重要的是,感谢@Rico 指出-v 命令和 Kubernetes 的挂载将优先于 dockerfile VOLUME 命令,但如果出现以下情况:

  • dockerfile VOLUME 到 '/myvol'

  • Kubernetes 将 PVC 挂载到“/anotherMyVol”

在这种情况下,myvol 会挂载到我的本地节点硬盘吗?并导致不知情的数据在本地持久化?

【问题讨论】:

  • 我一直认为 Kubernetes Pod volumeMounts 的工作方式与 docker run -v 选项完全相同,包括它们如何与 Dockerfile VOLUME 声明交互。
  • @DavidMaze 你能详细说明它是如何与 Dockerfile VOLUME 交互的吗?

标签: docker kubernetes


【解决方案1】:

除非您在 Kubernetes pod 规范中覆盖它,否则它不会被忽略。例如,如果您遵循 Docker 文档中的 this 示例:

$ 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

【讨论】:

  • 好的,知道 Kubernetes 将覆盖挂载点并优先于 dockerfile volume。如果 myvol 上的 dockerfile volume 和我的 Kubernetes 挂载到另一个路径 anotherMyvol 会怎样。在这种情况下,myvol 会挂载到我的本地节点吗?我们可以要求 docker 忽略volume 命令吗?
  • 您将拥有 2 卷。如果 docker 挂载另一个卷,你真的不在乎。如果你不使用它或在那里存储任何东西。我认为只有当您的 dockerfile 定义了数百个卷时,这才会成为一个问题
  • 原因是,我有一个公共 dockerfile,它有三个 volume 命令,我只对其中一个感兴趣,所以我用 Kubernetes PVC 挂载它。我担心剩下的两个会逐渐增加我的主机节点磁盘并且很难管理。
  • 那么,如果你可以只使用volumeMounts,你什么时候使用持久卷/持久卷声明?
  • 嗯,您仍然需要在您的 pod 定义中包含 PVC,定义为“卷”
【解决方案2】:

您需要明确定义PersistentVolumeClaim 和/或PersistentVolume。这不是为你完成的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多