
本文为你提供了逐步操作说明,用于搭建一个 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 之前,请确认你满足以下前置条件。你的 Linux 宿主系统应具备:
virsh 和 qemu-img请将这些磁盘空间和内存建议视为最低基线。
如果你部署额外的应用或服务,可能需要更多资源。
❗ 重要说明:
本文中的说明展示了如何在 minikube 中使用 LINSTOR 客户仓库中的容器和镜像来部署 LINSTOR。
如果你还不是 LINBIT® 客户,可以联系 LINBIT 团队申请免费的评估访问权限。
或者,你也可以部署 CNCF Sandbox 中的上游开源项目 Piraeus Datastore。
通过输入以下命令,下载并安装最新的 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启动一个由 三个基于 KVM 的虚拟机组成的 minikube 环境:
minikube start \
--profile linstor-testing \
--driver=kvm2 \
--container-runtime containerd \
--cni calico \
--nodes 3 \
--cpus 4 \
--memory '8g'你可以根据测试需求调整环境选项。
有关 minikube start 命令及其选项的详细信息,请参考 minikube 官方文档。
下载并安装 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 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
[...]为了方便起见,可以为 kubectl 安装 Bash 自动补全:
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl
. /etc/bash_completion.d/kubectl安装 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/在部署了一个 3 节点、基于 KVM 的 minikube 集群,并安装了一些用于管理和便利性的工具之后,你就可以开始在 minikube 中安装 LINSTOR 了。
首先,输入以下命令查看所有 Pod 的状态:
kubectl get pods -A在继续之前,请确认所有 Pod 都已正常运行。
要在 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 之后,你可以使用它来安装 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在 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!"如果你安装了 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 中部署持久化且高可用的存储卷之前,你还需要执行一些额外步骤来准备 minikube 环境。
本文接下来的说明将展示如何创建由 每个 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 中的名称一致。
为每个 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 之后,验证每个 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在将 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 配置。
现在,你已经可以使用 Kubernetes 工作流来创建 LINSTOR 存储池,并从中在 minikube 中配置高可用的持久化卷。
创建一个 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 存储池配置方式,以下是一些可用的清理命令。
kubectl delete -f linstor-storage-pool-thin.yamlMINIKUBEVMS=`virsh list --all --name | grep linstor-testing`
for vm in $MINIKUBEVMS; do
minikube ssh -p linstor-testing -n $vm -- \
sudo vgremove vg1
donefor vm in $MINIKUBEVMS; do
minikube ssh -p linstor-testing -n $vm -- \
sudo pvremove /dev/vdb
donekubectl delete namespaces linbit-sdsminikube stop -p linstor-testingminikube 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本文系外文翻译,前往查看
如有侵权,请联系 [email protected] 删除。
本文系外文翻译,前往查看
如有侵权,请联系 [email protected] 删除。