我找到的最接近的答案是this。
但是我想知道的是,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
是否会安装到我的本地节点硬盘上?并导致不知道的数据在本地持久保存?
答案 0 :(得分:4)
除非您在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
答案 1 :(得分:0)
您需要显式定义PersistentVolumeClaim
和/或PersistentVolume
。尚未为您完成。