tig*_*igu 2 nfs volume docker kubernetes docker-swarm
我有一个 docker 映像,其中包含控制器 /opt/myfiles 中的数据,可以这么说: /opt/myfiles/file1.txt /opt/myfiles/file2.dat
我想将该映像部署到 kubernetes 并将 NFS 卷挂载到该目录,以便在删除 pod 时保留对这些文件的更改。
当我在 docker swarm 中执行此操作时,我只需将一个空的 NFS 卷安装到 /opt/myfiles/ ,然后启动我的 docker swarm 服务,该卷将填充映像中的文件,然后我可以使用我的服务,当我删除服务后,我的 NFS 服务器上仍然有文件,因此下次启动服务时,我会恢复之前的状态。
在 kubernetes 中,当我将空 NFS 卷挂载到 /opt/myfiles/ 时,pod 会启动,并且 /opt/myfiles/ 会被空目录覆盖,因此我的 pod 不再看到映像中的文件。
我的卷挂载和卷定义:
[...]
volumeMounts:
- name: myvol
mountPath: /opt/myfiles
[...]
volumes:
- name: myvol
nfs:
server: nfs-server.mydomain.org
path: /srv/shares/myfiles
Run Code Online (Sandbox Code Playgroud)
我读了一些关于类似问题的帖子(例如K8s 不会在 Persistent Volume 上挂载文件),并尝试了一些使用subPath和 的内容subPathExpr,如文档中所示(https://kubernetes.io/docs/concepts/storage/volumes/#using- subpath),但我的任何更改都没有执行 docker swarm 默认情况下执行的操作。
kubernetes 的行为对我来说似乎很奇怪,因为我已经使用 docker swarm 有一段时间了,并且我熟悉 docker swarm 处理该问题的方式。但我确信 kubernetes 以另一种方式处理这个问题是有原因的,并且有一些可能性可以获得我需要的东西。
那么,有人可以看看我的问题并帮助我找到一种方法来实现以下行为吗?
当然,如果有人能向我解释为什么 Kubernetes 和 docker swarm 的行为如此不同,我会非常高兴。
预先非常感谢
这通常可以在 Kubernetes 中使用 init-container 来实现。让我们有一个图像,其中的文件存储在/mypath文件夹中。如果您能够重新配置容器以使用不同的路径(例如),您可以使用 init 容器在pod 启动时/persistent将文件复制到。/mypath/persistent
containers:
- name: myapp-container
image: myimage
env:
- name: path
value: /persistent
volumeMounts:
- name: myvolume
path: /persistent
initContainers:
- name: copy-files
image: myimage
volumeMounts:
- name: myvolume
path: /persistent
command: ['sh', '-c', 'cp /mypath/*.* /persistent']
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您有一个myapp-container使用/persistentNFS 卷中文件夹中的文件的主容器,每次容器启动时, /mypathinit 容器 都会将其中的文件复制到该文件夹中copy-files。