在 Docker 群上的多个容器中装载 rexray/ceph 卷

Mount rexray/ceph volume in multiple containers on Docker swarm

我做了什么

我已经构建了一个 Docker Swarm 集群,其中我是 运行 具有持久数据的容器。为了允许容器在发生故障时移动到另一台主机,我需要跨 swarm 的弹性共享存储。在研究了各种选项后,我实现了以下内容:

  1. 在 Swarm 的所有节点上安装了 Ceph 存储集群并创建了 RADOS 块设备 (RBD)。 http://docs.ceph.com/docs/master/start/quick-ceph-deploy/

  2. 在每个节点上安装了 Rexray 并将其配置为使用上面创建的 RBD。 https://rexray.readthedocs.io/en/latest/user-guide/storage-providers/ceph/

  3. 部署 Docker 堆栈,使用 rexray 驱动程序安装卷,例如

    version: '3'
    services:
      test-volume:
        image: ubuntu
        volumes:
          - test-volume:/test
    volumes:
      test-volume:
        driver: rexray
    

此解决方案的工作原理是我可以部署一个堆栈,在 运行 节点上模拟故障,然后在另一个节点上观察堆栈恢复 tar,而不会丢失持久数据.

但是,我无法在多个容器中安装一个 rexray 卷。我这样做的原因是使用一个短暂的"backup container",它只是在容器仍然运行.

时将卷tar发送到快照备份

我的问题

我可以将我的 rexray 卷装载到第二个容器中吗?

第二个容器只需要读取访问权限,因此它可以 tar 将卷备份到快照,同时保留第一个容器 运行。

不幸的是,答案是否定的,在这个用例中,rexray 卷不能安装到第二个容器中。下面的一些信息有望帮助任何人走上类似的道路:

  1. Rexray 不支持多重挂载:

    Today REX-Ray was designed to actually ensure safety among many hosts that could potentially have access to the same host. This means that it forcefully restricts a single volume to only be available to one host at a time. (https://github.com/rexray/rexray/issues/343#issuecomment-198568291)

  2. 但 Rexray 确实支持称为 pre-emption 的功能,其中:

    ..if a second host does request the volume that he is able to forcefully detach it from the original host first, and then bring it to himself. This would simulate a power-off operation of a host attached to a volume where all bits in memory on original host that have not been flushed down is lost. This would support the Swarm use case with a host that fails, and a container trying to be re-scheduled. (https://github.com/rexray/rexray/issues/343#issuecomment-198568291)

  3. 但是,Ceph RBD 支持抢占。 (https://rexray.readthedocs.io/en/stable/user-guide/servers/libstorage/#preemption)

你当然可以有一个附加卷的容器,然后通过 nfs 在专用的群网络上导出它,然后客户端容器可以通过 nfs 访问它