Docker卷与Kubernetes持久卷

GMs*_*soF 6 docker kubernetes

我找到的最接近的答案是这个

但是我想知道的是,Kubernetes是否会完全忽略Dockerfile VOLUME命令?还是数据将被保留在两个地方?一个用于Docker卷(在运行哪个Pod的主机中),另一个是Kubernetes的PV?

提出这个问题的原因是因为我从docker hub部署了一些包含VOLUME命令的容器。同时,我还将PVC贴在我的吊舱上。我在考虑是否在节点中创建本地卷(docker卷,而不是K8 PV)?如果我的Pod已调度到另一个节点,那么是否创建了另一个新卷?


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

  • dockerfile VOLUME到'/ myvol'

  • Kubernetes将PVC安装到'/ anotherMyVol'

在这种情况下,将myvol安装到我的本地节点硬盘上吗?并导致不知道的数据在本地持久化?

Ric*_*ico 5

除非您在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:/#
Run Code Online (Sandbox Code Playgroud)

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

$ pwd
/var/lib/docker/volumes
$ find . | grep greeting
./d0bc20d085243c39c4f386dce2f6cafcd8146128d6b0c8f9dcb27cfb61a7ecab/_data/greeting
Run Code Online (Sandbox Code Playgroud)

您可以使用-vDocker中的选项覆盖它:

$ 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
Run Code Online (Sandbox Code Playgroud)

因此,在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
Run Code Online (Sandbox Code Playgroud)