如何将 docker 镜像中的数据与 kubernetes 卷 (NFS) 合并

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 以另一种方式处理这个问题是有原因的,并且有一些可能性可以获得我需要的东西。

那么,有人可以看看我的问题并帮助我找到一种方法来实现以下行为吗?

  • 我的图像中的文件位于某个目录中
  • 我想将 NFS 卷挂载到该目录,因为我需要保留数据,例如当我的 Pod 崩溃并移动到另一台主机时,或者当我的 Pod 由于某种原因暂时关闭时。
  • 当我的 Pod 启动时,我希望使用映像中的文件填充该卷

当然,如果有人能向我解释为什么 Kubernetes 和 docker swarm 的行为如此不同,我会非常高兴。

预先非常感谢

abi*_*net 6

这通常可以在 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