运行 Docker Swarm 中的 LINSTOR

Running LINSTOR in Docker Swarm

我目前正在我的实验室中试用 linstor。我正在尝试设置 computestorage 节点的分离。 运行s linstor 的存储节点,而计算节点是 运行ning Docker Swarm 或 K8s。我在这个测试中设置了 1 个 linstor 节点和 1 个 docker swarm 节点。 Linstor节点配置成功。

Linstor 节点

DRBD9.1.2

╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool          ┊ Node       ┊ Driver   ┊ PoolName       ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊ SharedName ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ DfltDisklessStorPool ┊ instance-2 ┊ DISKLESS ┊                ┊              ┊               ┊ False        ┊ Ok    ┊            ┊
┊ pd-std-pool          ┊ instance-2 ┊ LVM_THIN ┊ vg/lvmthinpool ┊   199.80 GiB ┊    199.80 GiB ┊ True         ┊ Ok    ┊            ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
# linstor node list
╭─────────────────────────────────────────────────────────────╮
┊ Node       ┊ NodeType ┊ Addresses                ┊ State    ┊
╞═════════════════════════════════════════════════════════════╡
┊ instance-2 ┊ COMBINED ┊ 10.100.0.29:3366 (PLAIN) ┊ Online   ┊
╰─────────────────────────────────────────────────────────────╯

Docker节点

在另一个节点中,我有 Docker Swarm 运行ning。此节点没有安装任何工具,例如 drbd、drbdtop、drbdsetup ...等。从技术上讲,运行 是一个最小的安装,足以 运行 仅 Docker 以保持其轻量级。 Docker 版本为 20.10.3。我还安装了用 golang 编写的 linstor docker 卷。

下面是我的 /etc/linstor/docker-volume.conf 和 docker 卷插件安装在我的 Docker Swarm 节点

$ docker plugin ls
ID             NAME                                  DESCRIPTION                        ENABLED
6300029b3178   linbit/linstor-docker-volume:latest   Linstor volume plugin for Docker   true

$ cat /etc/linstor/docker-volume.conf
[global]
controllers = linstor://instance-2
fs = xfs

我在尝试使用 linstor 创建的卷时遇到错误。我已确认我可以在 instance-2 ping linstor 控制器并在防火墙中打开所有端口。这是错误和重现的步骤

$ docker volume create -d linbit/linstor-docker-volume:latest  --name=first --opt size=20 --opt replicas=1 --opt storage-pool=pd-std-pool
$ docker volume ls
DRIVER                                VOLUME NAME
local                                 64f864db31990baa6b790dde34513a7f6fc466ca0c5e72ffab7024365a9f45da
linbit/linstor-docker-volume:latest   first
$ docker volume inspect first
[
    {
        "CreatedAt": "0001-01-01T00:00:00Z",
        "Driver": "linbit/linstor-docker-volume:latest",
        "Labels": {},
        "Mountpoint": "",
        "Name": "first",
        "Options": {
            "replicas": "1",
            "size": "20",
            "storage-pool": "pd-std-pool"
        },
        "Scope": "global"
    }
]
$ docker run --rm -it -v first:/data alpine sh
docker: Error response from daemon: error while mounting volume '': VolumeDriver.Mount: 404 Not Found.
ERRO[0000] error waiting for container: context canceled 

问题

LINSTOR 通过使用 DRDB(分布式复制块设备)跨节点复制数据来管理 LVM 或 ZFS 卷(或我说的裸分区)内复制磁盘 space 的节点集群中的存储,根据官方文档:

"LINSTOR is a configuration management system for storage on Linux systems. It manages LVM logical volumes and/or ZFS ZVOLs on a cluster of nodes. It leverages DRBD for replication between different nodes and to provide block storage devices to users and applications. It manages snapshots, encryption and caching of HDD backed data in SSDs via bcache."

所以我会说是的,您确实需要在要使用驱动程序的每个节点上安装驱动程序(我确实看到 Docker 的存储插件尝试在本地安装 DRBD 卷)

但是,您不一定需要在计算节点上拥有存储 space 本身,因为您可以从复制的卷挂载无盘 DRBD 资源在不同的节点上所以我会说你的想法应该可行,除非驱动程序本身有一些我还没有发现的错误:你的计算节点需要注册为所有所需池的无盘节点(我没试过这个,但记得读过它不仅可行,而且推荐用于某些类型的数据迁移。

当然,如果您的存储节点不超过 1 个,那么使用 LINSTOR/drbd 不会有太多好处(节点或磁盘故障将使您无盘)。我的用例是在不同数据中心的不同服务器之间复制存储,这样下次烧毁时我就可以在几分钟而不是几天后得到我的数据和容器 运行...