本文为你提供了逐步操作说明,用于搭建一个 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 及相关工具,例如
virsh和qemu-img - 大约 23GiB 的可用磁盘空间
- 大约 20GiB 的可用内存
- 可用的互联网连接
请将这些磁盘空间和内存建议视为最低基线。
如果你部署额外的应用或服务,可能需要更多资源。
❗ 重要说明:
本文中的说明展示了如何在 minikube 中使用 LINSTOR 客户仓库中的容器和镜像来部署 LINSTOR。
如果你还不是 LINBIT® 客户,可以联系 LINBIT 团队申请免费的评估访问权限。
或者,你也可以部署 CNCF Sandbox 中的上游开源项目 Piraeus Datastore。
通过下载二进制文件安装 minikube
通过输入以下命令,下载并安装最新的 minikube Linux 二进制版本:
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 环境:
minikube start \
--profile linstor-testing \
--driver=kvm2 \
--container-runtime containerd \
--cni calico \
--nodes 3 \
--cpus 4 \
--memory '8g'
你可以根据测试需求调整环境选项。
有关 minikube start 命令及其选项的详细信息,请参考 minikube 官方文档。
安装 kubectl
下载并安装 kubectl 二进制文件:
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 是否安装成功:
kubectl version
kubectl cluster-info
输出应类似如下内容:
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 自动补全:
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
. /etc/bash_completion.d/kubectl
简化在 minikube 中输入 LINSTOR 命令
安装 kubectl-linstor 工具,以简化在 minikube 中输入 LINSTOR 命令。
可以通过以下命令下载该工具:
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 工具:
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 的状态:
kubectl get pods -A
在继续之前,请确认所有 Pod 都已正常运行。
部署 LINSTOR Operator
要在 minikube(或 Kubernetes、OpenShift 或其他 Kubernetes 发行版)中安装 LINSTOR,可以使用 LINSTOR Operator(或 Piraeus Datastore Operator)。
作为 LINBIT 客户,或拥有免费评估访问权限的用户,创建一个 kustomization 文件来在 minikube 中部署 LINSTOR Operator。
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
通过以下命令应用配置:
kubectl apply -k .
最多等待五分钟,直到 linbit-sds 命名空间中的 Pod 就绪:
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 集群配置:
cat << EOF > linstor-deploy.yaml
---
apiVersion: piraeus.io/v1
kind: LinstorCluster
metadata:
name: linstorcluster
spec: {}
EOF
接下来,应用该配置,在 minikube 中部署 LINSTOR 集群:
kubectl apply -f linstor-deploy.yaml -n linbit-sds
观察并等待 Pod 启动,除了 linstor-csi-node 和 linstor-satellite Pod 之外:
watch -c kubectl get pods -n linbit-sds
配置 DRBD 模块加载容器
在 minikube 部署中,linstor-csi-node 和 linstor-satellite Pod 将无法启动,因为 VM 中缺少必要的 Linux 内核头文件和 DRBD® 内核模块对象。
linstor-satellite Pod 中的 drbd-module-loader 容器需要这些组件来构建 DRBD 内核模块。
为了解决这个问题,你可以应用来自 https://charts.linstor.io 的一个配置文件,该文件为在 minikube 中构建 DRBD 内核模块指定了所需的基础设施。
kubectl apply -f https://charts.linstor.io/deploy/minikube.yaml
最多等待五分钟,直到 linbit-sds 命名空间中的所有 Pod 就绪:
kubectl wait pod --for=condition=Ready -n linbit-sds --timeout=5m --all && \
echo "LINSTOR installed and ready!"
验证 minikube 中的 LINSTOR 部署
如果你安装了 kubectl-linstor 工具,可以输入以下命令来验证 LINSTOR controller 服务是否在 minikube 中正常运行:
kubectl linstor controller version
如果你没有安装 kubectl-linstor 工具,可以使用以下更长的命令:
kubectl -n linbit-sds exec deployment/linstor-controller -- \
linstor controller version
输出应显示正在运行的 LINSTOR controller 服务版本:
linstor controller 1.32.3; GIT-hash: 6dac06aed233f2c89ac7cc6b1185d6dce9ec74c4
你还可以通过列出 minikube 中 LINSTOR 集群的节点来进一步验证部署情况:
kubectl linstor node list
输出将类似如下内容:
+------------------------------------------------------------------------+
| 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 的名称:
minikube status -p linstor-testing|grep -B 1 type\:
输出应类似如下:
linstor-testing
type: Control Plane
--
linstor-testing-m02
type: Worker
--
linstor-testing-m03
type: Worker
接下来,输入以下命令,显示 QEMU/KVM 中的 minikube VM 名称:
virsh list
输出应类似如下:
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 虚拟磁盘,输入以下命令 ¹:
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
接下来,为每个虚拟磁盘设置权限:
for vm in $MINIKUBEVMS; do
sudo chmod 744 /var/lib/libvirt/images/"$vm"-"$DISKNAME".qcow2
done
然后,将新创建的虚拟磁盘持久化地附加到 minikube VM:
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 是否显示已附加的额外磁盘:
for vm in $MINIKUBEVMS; do
virsh domblklist --domain $vm
done
以下示例输出显示了 linstor-testing-m03 minikube VM 的虚拟磁盘,包括额外的 vdb 磁盘:
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 都能识别并使用新磁盘:
minikube stop -p linstor-testing
minikube start -p linstor-testing
最多等待五分钟,直到 linbit-sds 命名空间中的所有 Pod 就绪:
kubectl wait pod --for=condition=Ready -A --timeout=5m --all && \
echo "All pods are up and running!"
验证 minikube VM 识别额外磁盘
在重启 minikube VM 之后,验证每个 VM 内的操作系统是否检测到额外磁盘:
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 磁盘:
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 设备:
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:
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 文件之前,你可能需要运行以下命令:
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:
for vm in $MINIKUBEVMS; do
minikube ssh -p linstor-testing -n $vm -- \
grep global_filter /etc/lvm/lvm.conf
done
命令输出应显示忽略 DRBD 和 LINSTOR 设备的过滤规则:
# global_filter=["a|.*|"]
global_filter = [ "r|^/dev/drbd|", "r|^/dev/mapper/[lL]instor|" ]
[...]
接下来,通过在每个 minikube VM 中执行物理卷扫描命令来重新加载 LVM 配置:
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 支撑:
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
应用该配置:
kubectl apply -f linstor-storage-pool-thin.yaml
验证在每个 LINSTOR 节点上都存在名为 vg1-thin 的 LINSTOR 存储池:
kubectl linstor storage-pool list -s vg1-thin
命令输出将类似如下内容:
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
┊ 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 存储池
kubectl delete -f linstor-storage-pool-thin.yaml
删除 LVM 卷组及其中的卷
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 物理卷标签
for vm in $MINIKUBEVMS; do
minikube ssh -p linstor-testing -n $vm -- \
sudo pvremove /dev/vdb
done
删除 LINSTOR 命名空间
kubectl delete namespaces linbit-sds
停止 minikube 集群
minikube stop -p linstor-testing
删除 minikube profile 及其关联的 VM
minikube delete -p linstor-testing
当你完全结束 minikube 测试后,可以删除 minikube 数据目录以回收磁盘空间。
默认路径是 $HOME/.minikube,如果你设置了 MINIKUBE_HOME 环境变量,则使用对应路径。
minikube delete --all=true --purge=true
删除第二块虚拟磁盘
如果你已经删除了 linstor-testing 这个 minikube profile,那么该命令会删除 minikube VM 及其附加磁盘。
通常不需要再执行下面的命令,但以防万一,这里仍然给出:
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