首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用 Minikube 在 Kubernetes 中快速上手 LINSTOR

使用 Minikube 在 Kubernetes 中快速上手 LINSTOR

作者头像
李亮@LINBIT
发布2026-02-02 15:31:38
发布2026-02-02 15:31:38
751
举报
文章被收录于专栏:SDS和高可用SDS和高可用

本文为你提供了逐步操作说明,用于搭建一个 minikube 虚拟机(VM)环境,以便在 Kubernetes 中测试和探索 LINSTOR®

minikube 是一个运行在单台宿主机上的本地 Kubernetes 环境,人们通常用它来快速启动环境,多用于测试或概念验证(PoC)目的。

由于 minikube 的安装和配置快速且简单,它可以成为在 Kubernetes 中部署和测试 LINSTOR 的一种便捷方式。

按照本文中的说明,你可以在 20 到 30 分钟内完成一个运行中的 LINSTOR + minikube 环境


Kubernetes 中的 LINSTOR 是一个生产就绪(production-ready)的解决方案,已在全球范围内用于配置和管理持久化、高可用的块存储

不同部署和使用场景差异很大。有些组织使用 LINSTOR 在数百个节点上部署和管理数千个存储资源

相比之下,本文中的说明旨在帮助你快速在非生产环境中启动 LINSTOR,用于探索和测试。


在 minikube 中探索和测试 LINSTOR 会很有趣,但如果你需要生产级解决方案,请使用 Kubernetes 中的 LINSTOR

你也可以在 OpenShift 中使用 LINSTOR,或者配合 SUSE Rancher 使用。

LINSTOR 是 OpenShift 和 SUSE 环境的官方认证产品


安装并配置 minikube 环境

在安装 minikube 之前,请确认你满足以下前置条件。你的 Linux 宿主系统应具备:

  • 已安装 KVM 及相关工具,例如 virshqemu-img
  • 大约 23GiB 的可用磁盘空间
  • 大约 20GiB 的可用内存
  • 可用的互联网连接

请将这些磁盘空间和内存建议视为最低基线

如果你部署额外的应用或服务,可能需要更多资源。


重要说明

本文中的说明展示了如何在 minikube 中使用 LINSTOR 客户仓库中的容器和镜像来部署 LINSTOR。

如果你还不是 LINBIT® 客户,可以联系 LINBIT 团队申请免费的评估访问权限

或者,你也可以部署 CNCF Sandbox 中的上游开源项目 Piraeus Datastore


通过下载二进制文件安装 minikube

通过输入以下命令,下载并安装最新的 minikube Linux 二进制版本:

代码语言:javascript
复制
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && \
  rm minikube-linux-amd64

启动 minikube

启动一个由 三个基于 KVM 的虚拟机组成的 minikube 环境:

代码语言:javascript
复制
minikube start \
  --profile linstor-testing \
  --driver=kvm2 \
  --container-runtime containerd \
  --cni calico \
  --nodes 3 \
  --cpus 4 \
  --memory '8g'

你可以根据测试需求调整环境选项。

有关 minikube start 命令及其选项的详细信息,请参考 minikube 官方文档。


安装 kubectl

下载并安装 kubectl 二进制文件:

代码语言:javascript
复制
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl &&
  rm kubectl

验证 kubectl 安装

输入以下命令以验证 kubectl 是否安装成功:

代码语言:javascript
复制
kubectl version
kubectl cluster-info

输出应类似如下内容:

代码语言:javascript
复制
Client Version: v1.35.0
Kustomize Version: v5.7.1
Server Version: v1.34.0
Kubernetes control plane is running at https://192.168.39.135:8443
CoreDNS is running at https://192.168.39.135:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
[...]

为 Bash 安装 kubectl 自动补全

为了方便起见,可以为 kubectl 安装 Bash 自动补全:

代码语言:javascript
复制
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
. /etc/bash_completion.d/kubectl

简化在 minikube 中输入 LINSTOR 命令

安装 kubectl-linstor 工具,以简化在 minikube 中输入 LINSTOR 命令。

可以通过以下命令下载该工具:

代码语言:javascript
复制
KL_VERS=0.3.2
KL_ARCH=linux_amd64
curl -L -O \
https://github.com/piraeusdatastore/kubectl-linstor/releases/download/v$KL_VERS/kubectl-linstor_v"$KL_VERS"_$KL_ARCH.tar.gz

📝 注意

请将 KL_VERS 变量的值修改为 kubectl-linstor 发布页面中显示的最新版本号。


解压 tar 包并安装 kubectl-linstor 工具:

代码语言:javascript
复制
tar xvf kubectl-linstor_v"$KL_VERS"_$KL_ARCH.tar.gz
sudo install kubectl-linstor /usr/local/bin/

在 minikube 中安装 LINSTOR

在部署了一个 3 节点、基于 KVM 的 minikube 集群,并安装了一些用于管理和便利性的工具之后,你就可以开始在 minikube 中安装 LINSTOR 了。

首先,输入以下命令查看所有 Pod 的状态:

代码语言:javascript
复制
kubectl get pods -A

在继续之前,请确认所有 Pod 都已正常运行。


部署 LINSTOR Operator

要在 minikube(或 Kubernetes、OpenShift 或其他 Kubernetes 发行版)中安装 LINSTOR,可以使用 LINSTOR Operator(或 Piraeus Datastore Operator)

作为 LINBIT 客户,或拥有免费评估访问权限的用户,创建一个 kustomization 文件来在 minikube 中部署 LINSTOR Operator。

代码语言:javascript
复制
USERNAME=<LINBIT-customer-username>
PASSWORD=<LINBIT-customer-password>
cat <<EOF > kustomization.yaml
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: linbit-sds
resources:
  - https://charts.linstor.io/static/latest.yaml
generatorOptions:
  disableNameSuffixHash: true
secretGenerator:
  - name: drbdio-pull-secret
    type: kubernetes.io/dockerconfigjson
    literals:
      - .dockerconfigjson={"auths":{"drbd.io":{"username":"$USERNAME","password":"$PASSWORD"}}}
EOF

通过以下命令应用配置:

代码语言:javascript
复制
kubectl apply -k .

最多等待五分钟,直到 linbit-sds 命名空间中的 Pod 就绪:

代码语言:javascript
复制
kubectl wait pod --for=condition=Ready -n linbit-sds --timeout=5m --all && \
  echo "LINSTOR Operator deployed and ready!"

使用 LINSTOR Operator 在 minikube 中部署 LINSTOR

在部署了 LINSTOR Operator 之后,你可以使用它来安装 LINSTOR。

通过以下命令创建一个 LINSTOR 集群配置:

代码语言:javascript
复制
cat << EOF > linstor-deploy.yaml
---
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
  name: linstorcluster
spec: {}
EOF

接下来,应用该配置,在 minikube 中部署 LINSTOR 集群:

代码语言:javascript
复制
kubectl apply -f linstor-deploy.yaml -n linbit-sds

观察并等待 Pod 启动,除了 linstor-csi-node linstor-satellite Pod 之外

代码语言:javascript
复制
watch -c kubectl get pods -n linbit-sds

配置 DRBD 模块加载容器

在 minikube 部署中,linstor-csi-nodelinstor-satellite Pod 将无法启动,因为 VM 中缺少必要的 Linux 内核头文件和 DRBD® 内核模块对象

linstor-satellite Pod 中的 drbd-module-loader 容器需要这些组件来构建 DRBD 内核模块。

为了解决这个问题,你可以应用来自 https://charts.linstor.io 的一个配置文件,该文件为在 minikube 中构建 DRBD 内核模块指定了所需的基础设施。

代码语言:javascript
复制
kubectl apply -f https://charts.linstor.io/deploy/minikube.yaml

最多等待五分钟,直到 linbit-sds 命名空间中的所有 Pod 就绪:

代码语言:javascript
复制
kubectl wait pod --for=condition=Ready -n linbit-sds --timeout=5m --all && \
  echo "LINSTOR installed and ready!"

验证 minikube 中的 LINSTOR 部署

如果你安装了 kubectl-linstor 工具,可以输入以下命令来验证 LINSTOR controller 服务是否在 minikube 中正常运行:

代码语言:javascript
复制
kubectl linstor controller version

如果你没有安装 kubectl-linstor 工具,可以使用以下更长的命令:

代码语言:javascript
复制
kubectl -n linbit-sds exec deployment/linstor-controller -- \
  linstor controller version

输出应显示正在运行的 LINSTOR controller 服务版本:

代码语言:javascript
复制
linstor controller 1.32.3; GIT-hash: 6dac06aed233f2c89ac7cc6b1185d6dce9ec74c4

你还可以通过列出 minikube 中 LINSTOR 集群的节点来进一步验证部署情况:

代码语言:javascript
复制
kubectl linstor node list

输出将类似如下内容:

代码语言:javascript
复制
+------------------------------------------------------------------------+
| Node                | NodeType  | Addresses                   | State  |
|========================================================================|
| linstor-testing     | SATELLITE | 10.244.115.5:3366 (PLAIN)   | Online |
| linstor-testing-m02 | SATELLITE | 10.244.113.5:3366 (PLAIN)   | Online |
| linstor-testing-m03 | SATELLITE | 10.244.136.133:3366 (PLAIN) | Online |
+------------------------------------------------------------------------+

为 LINSTOR 存储准备 minikube VM

在使用 LINSTOR 在 minikube 中部署持久化且高可用的存储卷之前,你还需要执行一些额外步骤来准备 minikube 环境。


创建用于 LINSTOR 存储池的第二块磁盘

本文接下来的说明将展示如何创建由 每个 minikube VM 中的第二块虚拟磁盘 支撑的 LINSTOR 存储资源。

该磁盘目前尚不存在,因此需要先创建并准备这些磁盘。

首先,通过以下命令获取 minikube VM 的名称:

代码语言:javascript
复制
minikube status -p linstor-testing|grep -B 1 type\:

输出应类似如下:

代码语言:javascript
复制
linstor-testing
type: Control Plane
--
linstor-testing-m02
type: Worker
--
linstor-testing-m03
type: Worker

接下来,输入以下命令,显示 QEMU/KVM 中的 minikube VM 名称:

代码语言:javascript
复制
virsh list

输出应类似如下:

代码语言:javascript
复制
 Id   Name                  State
-------------------------------------
 4    linstor-testing       running
 5    linstor-testing-m02   running
 6    linstor-testing-m03   running

请确认 VM 在 QEMU/KVM 中的名称与 minikube 中的名称一致。


为 KVM 创建额外的虚拟磁盘

为每个 minikube VM 创建一个 5GiB 的动态分配 QCOW2 虚拟磁盘,输入以下命令 ¹:

代码语言:javascript
复制
MINIKUBEVMS=`virsh list --all --name | grep linstor-testing`
DISKNAME=vdb
for vm in $MINIKUBEVMS; do
  sudo qemu-img create \
    -f qcow2 \
    -o preallocation=off \
    /var/lib/libvirt/images/"$vm"-"$DISKNAME".qcow2 5G
done

接下来,为每个虚拟磁盘设置权限:

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  sudo chmod 744 /var/lib/libvirt/images/"$vm"-"$DISKNAME".qcow2
done

然后,将新创建的虚拟磁盘持久化地附加到 minikube VM:

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  virsh attach-disk \
    --domain $vm \
    /var/lib/libvirt/images/"$vm"-"$DISKNAME".qcow2 "$DISKNAME" \
    --driver qemu \
    --subdriver qcow2 \
    --targetbus virtio \
    --persistent
done

该命令的输出将显示 “Disk attached successfully”。


验证附加磁盘

输入以下命令,验证 minikube VM 是否显示已附加的额外磁盘:

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  virsh domblklist --domain $vm
done

以下示例输出显示了 linstor-testing-m03 minikube VM 的虚拟磁盘,包括额外的 vdb 磁盘:

代码语言:javascript
复制
Target   Source
----------------------------------------------------------------
hdc      [...]/linstor-testing-m03/boot2docker.iso
hda      [...]linstor-testing-m03/linstor-testing-m03.rawdisk
vdb      /var/lib/libvirt/images/linstor-testing-m03-vdb.qcow2

接下来,重启 minikube VM,使每个 VM 都能识别并使用新磁盘:

代码语言:javascript
复制
minikube stop -p linstor-testing
minikube start -p linstor-testing

最多等待五分钟,直到 linbit-sds 命名空间中的所有 Pod 就绪:

代码语言:javascript
复制
kubectl wait pod --for=condition=Ready -A --timeout=5m --all && \
  echo "All pods are up and running!"

验证 minikube VM 识别额外磁盘

在重启 minikube VM 之后,验证每个 VM 内的操作系统是否检测到额外磁盘:

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  echo $vm\:
  minikube ssh -p linstor-testing -n $vm -- \
    lsblk|grep -E 'vd[a-z]\b'
done

以下示例输出显示 linstor-testing VM 中识别到了额外的 vdb 磁盘:

代码语言:javascript
复制
linstor-testing:
vda    253:0    0 19.5G  0 disk
vdb    253:16   0    5G  0 disk

设置 LVM 全局过滤器

在将 LINSTOR 与 LVM 和 DRBD 一起使用时,应在 LVM 全局配置文件(/etc/lvm/lvm.conf)中设置 global_filter,以忽略由 LINSTOR 创建或管理的 DRBD 及其他设备。

有关更多背景信息,请参阅 LINSTOR 用户指南

首先,创建一个本地 LVM 配置文件,并设置全局过滤器以忽略 DRBD 设备:

代码语言:javascript
复制
sudo lvmconfig --type default > lvm.conf
grep -n global_filter lvm.conf
# change 17 below if the `grep` command shows a line number other than 16
sed -i '17i\        global_filter = [ "r|^/dev/drbd|", "r|^/dev/mapper/[lL]instor|" ]' lvm.conf

将本地 lvm.conf 文件复制到每个 minikube VM:

代码语言:javascript
复制
MINIKUBEVMS=`virsh list --all --name | grep linstor-testing`
for vm in $MINIKUBEVMS; do
  scp -i $(minikube -p linstor-testing -n $vm ssh-key) lvm.conf \
    docker@$(minikube -p linstor-testing -n $vm ip):/home/docker/lvm.conf
  minikube ssh -p linstor-testing -n $vm -- \
    sudo cp /home/docker/lvm.conf /etc/lvm/lvm.conf
done

📝 注意

如果你重启、停止并重新启动了 minikube 集群,每个 minikube VM 的 SSH 主机指纹可能会发生变化。

在复制 lvm.conf 文件之前,你可能需要运行以下命令:

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  ssh-keygen -f "$HOME/.ssh/known_hosts" \
    -R "$(minikube -p linstor-testing -n $vm ip)"
done

输入以下命令,验证每个 minikube VM 中的 LVM 配置文件是否包含忽略 DRBD 设备的 global_filter

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  minikube ssh -p linstor-testing -n $vm -- \
    grep global_filter /etc/lvm/lvm.conf
done

命令输出应显示忽略 DRBD 和 LINSTOR 设备的过滤规则:

代码语言:javascript
复制
        # global_filter=["a|.*|"]
        global_filter = [ "r|^/dev/drbd|", "r|^/dev/mapper/[lL]instor|" ]
        [...]

接下来,通过在每个 minikube VM 中执行物理卷扫描命令来重新加载 LVM 配置:

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  echo $vm\:
  minikube ssh -p linstor-testing -n $vm -- \
    sudo pvscan
done

命令输出可能显示 “No matching physical volumes found”,但仍然会重新加载 LVM 配置。


在 minikube 中测试 LINSTOR

现在,你已经可以使用 Kubernetes 工作流来创建 LINSTOR 存储池,并从中在 minikube 中配置高可用的持久化卷


创建 LINSTOR 存储池

创建一个 LinstorSatelliteConfiguration 配置文件。

当应用该配置时,将创建一个名为 vg1-thin 的 LINSTOR 存储池,该存储池由 LINSTOR 创建的 LVM thin 卷 vg1/thin 支撑:

代码语言:javascript
复制
cat << EOF > linstor-storage-pool-thin.yaml
---
apiVersion: piraeus.io/v1
kind: LinstorSatelliteConfiguration
metadata:
  name: storage-satellites
spec:
  storagePools:
    - name: vg1-thin
      lvmThinPool:
        volumeGroup: vg1
        thinPool: thin
      source:
        hostDevices:
          - /dev/vdb
EOF

应用该配置:

代码语言:javascript
复制
kubectl apply -f linstor-storage-pool-thin.yaml

验证在每个 LINSTOR 节点上都存在名为 vg1-thin 的 LINSTOR 存储池:

代码语言:javascript
复制
kubectl linstor storage-pool list -s vg1-thin

命令输出将类似如下内容:

代码语言:javascript
复制
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ StoragePool ┊ Node                ┊ Driver   ┊ PoolName ┊ FreeCapacity ┊ TotalCapacity ┊ CanSnapshots ┊ State ┊ SharedName                   ┊
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
┊ vg1-thin    ┊ linstor-testing     ┊ LVM_THIN ┊ vg1/thin ┊     4.98 GiB ┊      4.98 GiB ┊ True         ┊ Ok    ┊ linstor-testing;vg1-thin     ┊
┊ vg1-thin    ┊ linstor-testing-m02 ┊ LVM_THIN ┊ vg1/thin ┊     4.98 GiB ┊      4.98 GiB ┊ True         ┊ Ok    ┊ linstor-testing-m02;vg1-thin ┊
┊ vg1-thin    ┊ linstor-testing-m03 ┊ LVM_THIN ┊ vg1/thin ┊     4.98 GiB ┊      4.98 GiB ┊ True         ┊ Ok    ┊ linstor-testing-m03;vg1-thin ┊
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

后续步骤

LINSTOR 存储池为你在 Kubernetes 部署中配置和管理高可用持久化存储提供了基础。

在创建 LINSTOR 存储池之后,下一步可以创建 StorageClass,并通过 PersistentVolumeClaim 从该存储类中配置卷。

前文提到的操作指南 《Kubernetes Persistent Storage Using LINBIT SDS Quick Start》 将引导你完成这些后续步骤。

更多细节请参阅 LINSTOR 用户指南,以及上游 Piraeus Datastore(CNCF Sandbox) 项目的文档。


清理环境

如果你已经完成了在 minikube 中对 LINSTOR 的测试和探索,或者想尝试其他 LINSTOR 存储池配置方式,以下是一些可用的清理命令。


删除 LINSTOR 存储池

代码语言:javascript
复制
kubectl delete -f linstor-storage-pool-thin.yaml

删除 LVM 卷组及其中的卷

代码语言:javascript
复制
MINIKUBEVMS=`virsh list --all --name | grep linstor-testing`
for vm in $MINIKUBEVMS; do
  minikube ssh -p linstor-testing -n $vm -- \
    sudo vgremove vg1
done

删除 LVM 物理卷标签

代码语言:javascript
复制
for vm in $MINIKUBEVMS; do
  minikube ssh -p linstor-testing -n $vm -- \
    sudo pvremove /dev/vdb
done

删除 LINSTOR 命名空间

代码语言:javascript
复制
kubectl delete namespaces linbit-sds

停止 minikube 集群

代码语言:javascript
复制
minikube stop -p linstor-testing

删除 minikube profile 及其关联的 VM

代码语言:javascript
复制
minikube delete -p linstor-testing

当你完全结束 minikube 测试后,可以删除 minikube 数据目录以回收磁盘空间。

默认路径是 $HOME/.minikube,如果你设置了 MINIKUBE_HOME 环境变量,则使用对应路径。

代码语言:javascript
复制
minikube delete --all=true --purge=true

删除第二块虚拟磁盘

如果你已经删除了 linstor-testing 这个 minikube profile,那么该命令会删除 minikube VM 及其附加磁盘。

通常不需要再执行下面的命令,但以防万一,这里仍然给出:

代码语言:javascript
复制
MINIKUBEVMS=`virsh list --all --name | grep linstor-testing`
DISKNAME=vdb
for vm in $MINIKUBEVMS; do
  virsh detach-disk --domain $vm $DISKNAME --persistent
  sudo rm /var/lib/libvirt/images/"$vm"-"$DISKNAME".qcow2
done

本文系外文翻译,前往查看

如有侵权,请联系 [email protected] 删除。

本文系外文翻译前往查看

如有侵权,请联系 [email protected] 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装并配置 minikube 环境
  • 通过下载二进制文件安装 minikube
  • 启动 minikube
  • 安装 kubectl
  • 验证 kubectl 安装
  • 为 Bash 安装 kubectl 自动补全
  • 简化在 minikube 中输入 LINSTOR 命令
  • 在 minikube 中安装 LINSTOR
  • 部署 LINSTOR Operator
  • 使用 LINSTOR Operator 在 minikube 中部署 LINSTOR
  • 配置 DRBD 模块加载容器
  • 验证 minikube 中的 LINSTOR 部署
  • 为 LINSTOR 存储准备 minikube VM
  • 创建用于 LINSTOR 存储池的第二块磁盘
  • 为 KVM 创建额外的虚拟磁盘
  • 验证附加磁盘
  • 验证 minikube VM 识别额外磁盘
  • 设置 LVM 全局过滤器
  • 在 minikube 中测试 LINSTOR
  • 创建 LINSTOR 存储池
  • 后续步骤
  • 清理环境
    • 删除 LINSTOR 存储池
    • 删除 LVM 卷组及其中的卷
    • 删除 LVM 物理卷标签
    • 删除 LINSTOR 命名空间
    • 停止 minikube 集群
    • 删除 minikube profile 及其关联的 VM
    • 删除第二块虚拟磁盘
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档