写过一篇 发表于 2024-9-28 07:33:07

k8s 分布式存储平台 -- Longhorn

目次

[*]一、什么是 Longhorn
[*]二、架构设计

[*]1、工作原理
[*]2、工作流程
[*]3、基于微服务设计的优势

[*]三、安装

[*]1、安装要求
[*]2、使用 Longhorn 命令行工具(验证方式一)
[*]3、使用环境查抄脚本(验证方式之二)

[*]3.1、安装 jq
[*]3.2、运行脚本

[*]4、安装 open-iscsi

[*]4.1、SUSE 和 openSUSE
[*]4.2、Debian 和 Ubuntu
[*]4.3、RHEL、CentOS 和 EKS (带有 AmazonLinux2 映像的 EKS Kubernetes Worker AMI)
[*]4.4、open-iscsi 安装程序

[*]5、安装 NFSv4 客户端

[*]5.1、Debian 和 Ubuntu
[*]5.2、对于 RHEL、CentOS 和 EKS (EKS Kubernetes Worker AMI with AmazonLinux2 image)
[*]5.3、SUSE/OpenSUSE
[*]5.4、nfs 安装程序

[*]6、查抄 Kubernetes 版本
[*]7、安装 Cryptsetup 和 LUKS

[*]7.1、Debian 和 Ubuntu
[*]7.2、RHEL、CentOS、Rocky Linux 和 EKS(EKS Kubernetes Worker AMI with AmazonLinux2 image)
[*]7.3、SUSE/OpenSUSE

[*]8、验证
[*]9、【ERROR】kernel module iscsi_tcp is not enabled on k8s-node1/2

[*]9.1、办理方案


[*]四、摆设

[*]1、添加 Longhorn Helm 存储库
[*]2、helm 安装 1.7.1 版本的 longhorn
[*]3、查看应用 pod 状态
[*]4、开启 UI

[*]4.1、编辑使用 NodePort 类型的 svc 资源清单
[*]4.2、创建 SVC
[*]4.3、访问 Longhorn UI

[*]5、查看默认创建的存储类 StorageClass

[*]五、使用 Longhorn 为 MySQL 应用提供数据恒久化

[*]1、创建 PVC 测试使用 longhorn 动态创建 PV
[*]2、摆设一个 MySQL 应用来使用上面的 PVC 进行数据恒久化
[*]3、创建上面的 PVC、Deployment
[*]4、进入容器内部创建数据
[*]5、登录到 Pod 所在节点验证数据是否存在
[*]6、重建 Pod 查看数据是否依然存在
[*]7、【ERROR】Scheduling Failure Replica Scheduling Failure Error Message: replica scheduling failed

[*]7.1、原因
[*]7.2、办理方案
[*]7.3、再次动态创建 PV 恒久卷


[*]六、使用 Longhorn 备份恢复

[*]1、对测试的 MySQL 卷创建快照
[*]2、查看 Pod 的调度节点数据目次
[*]3、创建周期使命 Create Recurring Job
[*]4、使用 Longhorn 的 StorageClass 创建快照
[*]5、创建 RecurringJob 以创建重复快照和备份(重复作业)

[*]5.1、设置参数

[*]6、备份卷

[*]6.1、设置备份目标为 NFS 服务以备份卷
[*]6.2、【ERROR】为什么设置了备份目标 BackupTarget 选择卷 Create Backup选项是不可选的呢?

[*]6.2.1、原因
[*]6.2.2、办理方案
[*]6.2.3、验证

[*]6.3、查看对应备份数据
[*]6.4、backupvolumes 对象
[*]6.5、查看 NFS 服务器上备份的数据
[*]6.6、选择需要备份的快照
[*]6.7、基于备份数据恢复数据


[*]七、ReadWriteMany 卷的使用

[*]1、创建访问模式为 RWX 的 PVC
[*]2、创建 Deployment 使用上面创建的 PVC 做恒久化数据
[*]3、查看 share-manager 的 Pod 日志信息
[*]4、创建一个用来读取数据的 Pod
[*]5、创建 NodePort 类型的 SVC 访问应用
[*]6、通过 NodePort 访问应用
[*]7、从 reader Pod 中写入数据验证 RWX 数据是否精确

[*]八、CSI 卷快照

[*]1、什么是卷快照
[*]2、卷快照的生命周期

[*]2.1、资源供应
[*]2.2、资源绑定
[*]2.3、对使用中的 PVC 的保护机制
[*]2.4、资源删除

[*]3、查看 csi-snapshotter Pod
[*]4、安装CRDs

[*]4.1、克隆 snapshotter 堆栈地址
[*]4.2、切换对应分支使用 kustomize 工具来构建指定目次下的资源设置
[*]4.3、验证创建的 Snapshot CRDs
[*]4.4、查看 csi-snapshotter Leader Pod 日志情况
[*]4.5、安装通用快照控制器

[*]4.5.1、【ERROR】snapshot-controller 拉取镜像在 ImagePullBackOff 与 ErrImagePull 状态间反复横跳


[*]5、使用 CSI 卷快照功能

[*]5.1、创建 VolumeSnapshot 对象
[*]5.2、创建存储快照类 VolumeSnapshotClass
[*]5.3、创建并查看资源对象
[*]5.4、查看动态创建的 VolumeSnapshotContent 对象

[*]6、基于快照创建/恢复新的 PVC

[*]6.1、基于创建的 volumesnapshot 创建新的 PVC

[*]7、卷克隆

[*]7.1、对 mysql-pvc 存储卷克隆
[*]7.2、与源 PVC 的对比
[*]7.3、在 Longhorn UI 进行查看

[*]8、卷动态扩容

[*]8.1、通过 Longhorn UI 进行卷扩容
[*]8.2、通过 PVC 进行扩容

[*]8.2.1、确认 StroageClass longhorn 开启了 allowVolumeExpansion
[*]8.2.2、修改 spec.resources.requests.storage 的值
[*]8.2.3、查看 PVC 的 events 信息

[*]8.3、通过 Longhorn UI 查看



一、什么是 Longhorn

Longhorn官网
Longhorn 是针对 Kubernetes 的轻量级、可靠且易于使用的分布式块存储系统。
Longhorn 是一款免费的开源软件。它最初由 Rancher Labs 开发,目前正作为云原生计算基金会的孵化项目进行开发。
使用 Longhorn,可以:

[*]使用 Longhorn 卷作为 Kubernetes 集群中分布式有状态应用程序的恒久存储
[*]将块存储分区为 Longhorn 卷,这样无论是否有云提供商,都可以使用 Kubernetes 卷
[*]跨多个节点和数据中央复制块存储以提高可用性
[*]将备份数据存储在外部存储中,比方 NFS 或 AWS S3
[*]创建跨集群灾难恢复卷,以便可以从第二个 Kubernetes 集群的备份中快速恢复主 Kubernetes 集群的数据
[*]安排卷的定期快照,并安排定期备份到 NFS 或 S3 兼容的辅助存储
[*]从备份恢复卷
[*]在不破坏恒久卷的情况下升级 Longhorn
Longhorn 带有独立的 UI,可以使用 Helm、kubectl 或 Rancher 应用程序目次进行安装。
二、架构设计

Longhorn 设计有两层:数据平面和控制平面。Longhorn Engine 是存储控制器,对应数据平面,Longhorn Manager 对应控制平面。
1、工作原理

Longhorn Manager Pod 作为 Kubernetes DaemonSet在 Longhorn 集群中的每个节点上运行。它负责在 Kubernetes 集群中创建和管理卷,并处置惩罚来自 UI 或 Kubernetes 卷插件的 API 调用。它遵照 Kubernetes 控制器模式,偶然也称为操纵员模式。
Longhorn Manager 与 Kubernetes API 服务器通信以创建一个新的 Longhorn 卷CR。然后 Longhorn Manager 监督 API 服务器的响应,当它看到 Kubernetes API 服务器创建了新的 Longhorn 卷 CR 时,Longhorn Manager 就会创建一个新的卷。
当 Longhorn Manager 被要求创建卷时,它会在卷所连接的节点上创建一个 Longhorn Engine 实例,并在将要放置副本的每个节点上创建一个副本。副本应放置在单独的主机上以确保最大可用性。
副本的多条数据路径包管了 Longhorn 卷的高可用性,纵然某个副本或者 Engine 出现题目,也不会影响所有副本或者 Pod 对卷的访问,Pod 依然可以正常运行。
Longhorn Engine 始终与使用 Longhorn 卷的 Pod 运行在同一个节点上。它会在存储在多个节点上的多个副本之间同步复制该卷。
引擎和副本使用 Kubernetes 进行编排。
2、工作流程

Longhorn 引擎、副本实例和磁盘之间的读/写数据流
下图所示

[*]有三个具有 Longhorn 卷的实例。
[*]每个卷都有一个专用的控制器,称为 Longhorn Engine,作为 Linux 进程运行。
[*]每个 Longhorn 卷都有两个副本,每个副本都是一个 Linux 进程。
[*]图中的箭头表示卷、控制器实例、副本实例和磁盘之间的读写数据流。
[*]通过为每个卷创建一个单独的 Longhorn Engine,如果一个控制器出现故障,其他卷的功能不会受到影响。
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232823829-442534220.svg
3、基于微服务设计的优势

在 Longhorn 中,每个 Engine 只需服务一个卷,从而简化了存储控制器的设计。由于控制器软件的故障域被隔离到各个卷,因此控制器瓦解只会影响一个卷。
Longhorn 引擎充足简单和轻量,因此我们可以创建多达 100,000 个独立引擎。Kubernetes 调度这些独立引擎,从一组共享磁盘中提取资源,并与 Longhorn 一起形成一个弹性分布式块存储系统。
由于每个卷都有本身的控制器,因此每个卷的控制器和副本实例也可以升级,而不会导致 IO 操纵显着中断。
Longhorn 可以创建一个恒久运行的作业来协调所有运动卷的升级,而不会中断系统的持续运行。为了确保升级不会导致不可预见的题目,Longhorn 可以选择升级一小部门卷,如果升级过程中出现题目,则回滚到旧版本。
三、安装

1、安装要求

安装 Longhorn 的 Kubernetes 集群中的每个节点都必须满足以下要求:

[*]与 Kubernetes 兼容的容器运行时(Docker v1.13+、containerd v1.3.7+ 等)
[*]Kubernetes >= v1.21
[*]open-iscsi 已安装,并且iscsid 守卫程序在所有节点上运行。Longhorn 依赖于 iscsiadm 主机为 Kubernetes 提供恒久卷。
[*]RWX 支持要求每个节点都安装 NFSv4 客户端。
[*]主机文件系统支持file extents存储数据的功能。目前我们支持:

[*]ext4
[*]XFS

[*]bash,curl,findmnt,grep,awk,blkid,lsblk 必须安装。
[*]Mount propagation 必须启用,它允许将一个容器挂载的卷与同一 pod 中的其他容器共享,甚至可以与同一节点上的其他 pod 共享

[*]Mount propagation

为了精确摆设和运行 Longhorn,Longhorn 工作负载必须能够以 root 身份运行。
2、使用 Longhorn 命令行工具(验证方式一)

该 longhornctl 工具是用于 Longhorn 操纵的 CLI。要查抄先决条件和设置,请下载该工具并运行 check 子命令:
# For AMD64 platform
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.7.1/longhornctl-linux-amd64
# For ARM platform
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.7.1/longhornctl-linux-arm64

chmod +x longhornctl
./longhornctl check preflighthttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232823423-2075647495.png
3、使用环境查抄脚本(验证方式之二)

自 Longhorn v1.7.0 以来,引入了Longhorn 命令行工具。环境查抄脚本environment_check.sh的功能与 Longhorn 命令行工具的功能重叠。因此,该脚本已在 v1.7.0 中弃用,并筹划在 v1.8.0 中删除。
3.1、安装 jq

jq ,在运行环境查抄脚本之前可能需要在本地安装。
yum install -y jq3.2、运行脚本

curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/scripts/environment_check.sh | bashhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232823010-1332264503.png
4、安装 open-iscsi

4.1、SUSE 和 openSUSE

zypper install open-iscsi
systemctl enable iscsid
systemctl start iscsid4.2、Debian 和 Ubuntu

apt-get install open-iscsi4.3、RHEL、CentOS 和 EKS (带有 AmazonLinux2 映像的 EKS Kubernetes Worker AMI)

yum --setopt=tsflags=noscripts install iscsi-initiator-utils
echo "InitiatorName=$(/sbin/iscsi-iname)" > /etc/iscsi/initiatorname.iscsi
systemctl enable iscsid
systemctl start iscsidhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232822494-450711066.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232821596-1831293613.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232821140-1730439119.png
4.4、open-iscsi 安装程序

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/deploy/prerequisite/longhorn-iscsi-installation.yaml# 检查安装程序的 pod 状态
kubectl get pod | grep longhorn-iscsi-installation5、安装 NFSv4 客户端

在 Longhorn 系统中,备份功能需要 NFSv4、v4.1 或 v4.2,而 ReadWriteMany (RWX) 卷功能需要 NFSv4.1。在安装 NFSv4 客户端用户空间守卫程序和实用程序之前,请确保在每个 Longhorn 节点上都启用了客户端内核支持。

[*]查抄NFSv4.1内核是否启用了支持
cat /boot/config-`uname -r`| grep CONFIG_NFS_V4_1

[*]查抄NFSv4.2内核是否启用了支持
cat /boot/config-`uname -r`| grep CONFIG_NFS_V4_2https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232820558-35767210.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232820117-313899514.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232819756-576483779.png
5.1、Debian 和 Ubuntu

apt-get install nfs-common5.2、对于 RHEL、CentOS 和 EKS (EKS Kubernetes Worker AMI with AmazonLinux2 image)

yum install -y nfs-utils5.3、SUSE/OpenSUSE

zypper install nfs-client5.4、nfs 安装程序

kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/deploy/prerequisite/longhorn-nfs-installation.yaml# 检查安装程序的 pod 状态
kubectl get pod | grep longhorn-nfs-installation6、查抄 Kubernetes 版本

kubectl version --shorthttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232819390-820626431.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232818998-1020945793.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232818633-177953238.png
应该Server Version是> = v1.21。
7、安装 Cryptsetup 和 LUKS

7.1、Debian 和 Ubuntu

apt-get install cryptsetup

apt-get install dmsetup7.2、RHEL、CentOS、Rocky Linux 和 EKS(EKS Kubernetes Worker AMI with AmazonLinux2 image)

yum install -y cryptsetup

yum install -y device-mapper7.3、SUSE/OpenSUSE

zypper install cryptsetup

zypper install device-mapper8、验证

curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/scripts/environment_check.sh | bashhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232818227-277707572.png
9、【ERROR】kernel module iscsi_tcp is not enabled on k8s-node1/2

https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232817814-291858682.png
9.1、办理方案

# 将iscsi_tcp模块加载到内核中
modprobe iscsi_tcp

# 验证模块是否成功加载
lsmod | grep iscsi_tcphttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232817370-1486909794.png
https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232816951-60476836.png
再次重新运行查抄脚本应该就没有题目了
四、摆设


[*]Rancher catalog app
[*]kubectl
[*]Helm
[*]Fleet
[*]Flux
[*]ArgoCD
我们使用 helm 摆设
1、添加 Longhorn Helm 存储库

helm repo add longhorn https://charts.longhorn.io

helm repo updatehttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232816509-1724729817.png
2、helm 安装 1.7.1 版本的 longhorn

helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.7.1https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232816067-721230873.png
3、查看应用 pod 状态

kubectl get pods -n longhorn-systemhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232815675-1064182634.png

[*]csi-attacher-xxx、csi-provisioner-xxx、csi-resizer-xxx、csi-snapshotter-xxx 是 csi 原生的组件
[*]longhorn-manager-xxx 是运行在每个节点上的 Longhorn Manager,是一个控制器,也为 Longhorn UI 或者 CSI 插件提供 API,主要功能是通过修改 Kubernetes CRD 来触发控制循环,比如 volume attach/detach 操纵
[*]longhorn-ui-xxx 提供 Longhorn UI 服务,提供一个可视化的控制页面
[*]Longhorn Engine 数据平面,提供两种工作模式:Engine Mode(instance-manager-e-xxx 的 Pod)、Replica Mode(instance-manager-r-xxx 的 Pod),Replica 负责现实数据的写入,每个副本包罗数据的完备副本,Engine 连接到副本实现 volume 的数据平面,任何写操纵都会同步到所有副本,读操纵从任意一个副本读取数据
4、开启 UI

直接使用 NodePort 开放 longhorn UI 服务
4.1、编辑使用 NodePort 类型的 svc 资源清单

cat >> longhorn-ui-svc.yaml << EOF
kind: Service
apiVersion: v1
metadata:
name: longhorn-ui-nodeport
namespace: longhorn-system
labels:
    app: longhorn-ui
spec:
ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: http
      nodePort: 32222
selector:
    app: longhorn-ui
clusterIP:
type: NodePort
EOFkubectl apply -f longhorn-ui-svc.yamlhttps://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232757307-1890729612.png
3、查看 share-manager 的 Pod 日志信息

http://192.168.112.10:32222https://img2023.cnblogs.com/blog/3332572/202409/3332572-20240927232756800-286061075.png
4、创建一个用来读取数据的 Pod

cat >> html-reader.yaml > reader.yaml > snapshot-mysql.yaml > snapshotclass.yaml >restore-mysql.yaml > mysql-clone-pvc.yaml
页: [1]
查看完整版本: k8s 分布式存储平台 -- Longhorn