k8s 分布式存储平台 -- Longhorn

打印 上一主题 下一主题

主题 1655|帖子 1655|积分 4965

目次

一、什么是 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,如果一个控制器出现故障,其他卷的功能不会受到影响。

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 共享

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

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

3、使用环境查抄脚本(验证方式之二)

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

jq ,在运行环境查抄脚本之前可能需要在本地安装。
  1. yum install -y jq
复制代码
3.2、运行脚本
  1. curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/scripts/environment_check.sh | bash
复制代码

4、安装 open-iscsi

4.1、SUSE 和 openSUSE
  1. zypper install open-iscsi
  2. systemctl enable iscsid
  3. systemctl start iscsid
复制代码
4.2、Debian 和 Ubuntu
  1. apt-get install open-iscsi
复制代码
4.3、RHEL、CentOS 和 EKS (带有 AmazonLinux2 映像的 EKS Kubernetes Worker AMI)
  1. yum --setopt=tsflags=noscripts install iscsi-initiator-utils
  2. echo "InitiatorName=$(/sbin/iscsi-iname)" > /etc/iscsi/initiatorname.iscsi
  3. systemctl enable iscsid
  4. systemctl start iscsid
复制代码



4.4、open-iscsi 安装程序
  1. kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/deploy/prerequisite/longhorn-iscsi-installation.yaml
复制代码
  1. # 检查安装程序的 pod 状态
  2. kubectl get pod | grep longhorn-iscsi-installation
复制代码
5、安装 NFSv4 客户端

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

  • 查抄NFSv4.1内核是否启用了支持
  1. cat /boot/config-`uname -r`| grep CONFIG_NFS_V4_1
复制代码

  • 查抄NFSv4.2内核是否启用了支持
  1. cat /boot/config-`uname -r`| grep CONFIG_NFS_V4_2
复制代码



5.1、Debian 和 Ubuntu
  1. apt-get install nfs-common
复制代码
5.2、对于 RHEL、CentOS 和 EKS (EKS Kubernetes Worker AMI with AmazonLinux2 image)
  1. yum install -y nfs-utils
复制代码
5.3、SUSE/OpenSUSE
  1. zypper install nfs-client
复制代码
5.4、nfs 安装程序
  1. kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/deploy/prerequisite/longhorn-nfs-installation.yaml
复制代码
  1. # 检查安装程序的 pod 状态
  2. kubectl get pod | grep longhorn-nfs-installation
复制代码
6、查抄 Kubernetes 版本
  1. kubectl version --short
复制代码



应该Server Version是> = v1.21。
7、安装 Cryptsetup 和 LUKS

7.1、Debian 和 Ubuntu
  1. apt-get install cryptsetup
  2. apt-get install dmsetup
复制代码
7.2、RHEL、CentOS、Rocky Linux 和 EKS(EKS Kubernetes Worker AMI with AmazonLinux2 image)
  1. yum install -y cryptsetup
  2. yum install -y device-mapper
复制代码
7.3、SUSE/OpenSUSE
  1. zypper install cryptsetup
  2. zypper install device-mapper
复制代码
8、验证
  1. curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/v1.7.1/scripts/environment_check.sh | bash
复制代码

9、【ERROR】kernel module iscsi_tcp is not enabled on k8s-node1/2


9.1、办理方案
  1. # 将iscsi_tcp模块加载到内核中
  2. modprobe iscsi_tcp
  3. # 验证模块是否成功加载
  4. lsmod | grep iscsi_tcp
复制代码


再次重新运行查抄脚本应该就没有题目了
四、摆设

我们使用 helm 摆设
1、添加 Longhorn Helm 存储库
  1. helm repo add longhorn https://charts.longhorn.io
  2. helm repo update
复制代码

2、helm 安装 1.7.1 版本的 longhorn
  1. helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.7.1
复制代码

3、查看应用 pod 状态
  1. kubectl get pods -n longhorn-system
复制代码


  • 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 资源清单
  1. cat >> longhorn-ui-svc.yaml << EOF
  2. kind: Service
  3. apiVersion: v1
  4. metadata:
  5.   name: longhorn-ui-nodeport
  6.   namespace: longhorn-system
  7.   labels:
  8.     app: longhorn-ui
  9. spec:
  10.   ports:
  11.     - name: http
  12.       protocol: TCP
  13.       port: 80
  14.       targetPort: http
  15.       nodePort: 32222
  16.   selector:
  17.     app: longhorn-ui
  18.   clusterIP:
  19.   type: NodePort
  20. EOF
复制代码
  1. kubectl apply -f longhorn-ui-svc.yaml
复制代码

3、查看 share-manager 的 Pod 日志信息
  1. http://192.168.112.10:32222
复制代码

4、创建一个用来读取数据的 Pod

[code]cat >> html-reader.yaml > reader.yaml > snapshot-mysql.yaml > snapshotclass.yaml >  restore-mysql.yaml > mysql-clone-pvc.yaml

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表