云原生存储系统Longhorn的部署与基本使用

云原生存储系统Longhorn的部署与基本使用

1、Longhorn基本介绍

  • Longhorn是用于Kubernetes的轻量级,可靠且易于使用的分布式块存储系统;
  • Longhorn轻巧,可靠且功能强大。您可以使用一个kubectl; apply命令或使用Helm图表在现有Kubernetes集群上安装Longhorn 。一旦安装Longhorn,它将为Kubernetes集群添加持久的卷支持。
  • Longhorn使用容器和微服务实现分布式块存储。Longhorn为每个块设备卷创建一个专用的存储控制器,并跨多个节点上存储的多个副本同步复制该卷。存储控制器和副本本身使用Kubernetes进行编排。以下是Longhorn的一些显着功能:
    • 企业级分布式存储,无单点故障:
    • 块存储的增量快照;
    • 备份到基于有效更改块检测的辅助存储(与NFSv4或S3兼容的对象存储);
    • 定期快照和备份;
    • 自动化无中断升级。您可以升级整个Longhorn软件堆栈,而无需中断运行卷!;
    • 直观的GUI仪表板;

1.1、Longhorn架构

Longhorn设计有两层:数据层和控制层。Longhorn Engine是与数据平面相对应的存储控制器,而Longhorn Manager与控制平面相对应;

  • 在下图中:
    • 有Longhorn卷的三个实例;
    • 每个卷都有一个专用的控制器,称为Longhorn Engine,并作为Linux进程运行;
    • 每个Longhorn卷都有两个副本,每个副本都是Linux进程;
    • 图中的箭头表示卷,控制器实例,副本实例和磁盘之间的读/写数据流;
    • 通过为每个卷创建一个单独的Longhorn Engine,如果一个控制器发生故障,则其他卷的功能不会受到影响;

微信图片_20210322171215.png-58.5kB

2、Longhorn的安装与部署

提示:yaml文件中,已经根据实际生产情况做了优化调整(请参考最佳实践),并添加了NFS备份存储服务器,卷数据的备份将统一使用NFS进行管理和存储;

1
[root@DEVOPSSRV01 ~]# kubectl apply /k8s_yml/longhorn_deployment/longhorn-v1.1.0.yaml

3、创建volume

Longhorn可创建的卷类型大致分为Block VolumeCSI Persistent Volume静态PVC动态PVC

3.1、创建静态PVC逻辑卷

静态PVC:顾名思义需要编写PVC.yaml,通过手工指定PVC的metadata_name,申请PV资源,才可以挂载到对应的namespace下供pod使用;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#创建PVC资源,向longhorn申请PV存储卷
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-volv-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
name: volume-test
namespace: default
spec:
restartPolicy: Always
containers:
- name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- ls
- /data/lost+found
initialDelaySeconds: 5
periodSeconds: 5
volumeMounts:
- name: volv
mountPath: /data
ports:
- containerPort: 80
#挂载卷组,指定pvc名称
volumes:
- name: volv
persistentVolumeClaim:
claimName: longhorn-volv-pvc

3.2、创建动态PVC逻辑卷

动态PVC:使用动态PVC供应逻辑卷,用户必须预先创建一个或多个 StorageClass 对象,在有状态的POD控制器(StatefulSet)下,使用动态PVC,指定容量大小、存储类名等简单的参数后,即可实现按需创建存储的机制,一般用在独立POD,且独立数据卷的场景下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
selector:
app: nginx
type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 2 # by default is 1
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
livenessProbe:
exec:
command:
- ls
- /usr/share/nginx/html/lost+found
initialDelaySeconds: 5
periodSeconds: 5
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
#动态PVC配置模板
volumeClaimTemplates:
- metadata:
name: www
spec:
#访问模式,如使用longhorn支持多路读写“ReadWriteMany”
accessModes: [ "ReadWriteOnce" ]
#存储类名,默认安装为longhorn,官方建议不要修改此名称
storageClassName: "longhorn"
resources:
#可限定容量大小,IOPS等参数
requests:
storage: 1Gi

3.2、创建Block块设备

提示:块设备类似于一块硬盘,可以想象为虚拟机或云服务器中新增一块磁盘,那么就要经历分区、格式化、挂载等一系列操作,容器内使用,建议还是采用卷的方式,由于格式化需要超级权限,若不想设定容器为特权模式,就需要sidecar及init容器来支持使用;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-block-vol
namespace: centos-deployment
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
storageClassName: longhorn
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: centos2009
namespace: centos-deployment
spec:
selector:
matchLabels:
app: os
replicas: 1
template:
metadata:
labels:
app: os
spec:
containers:
- name: centos2009-deployment
image: 192.168.6.10/szzt_production/centos:centos7.9.2009
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 30; done;" ]
securityContext:
privileged: true
runAsUser: 0
env:
- name: TZ
value: Asia/Shanghai
volumeDevices:
- devicePath: /dev/longhorn/testblk
name: block-vol
volumes:
- name: block-vol
persistentVolumeClaim:
claimName: longhorn-block-vol

3.3、使用块设备及存储卷

  • 块设备与数据卷的区别如下图:数据卷采用ISCSI的存储协议进行网络通信,块设备则像一个本地磁盘一样挂载至服务器进行使用,
    微信图片_20210323144214.jpg-26.6kB

4、数据备份与恢复

提示:备份与恢复统一使用Longhron的UI进行

  • 查看创建的volume
    image_1f1euuia4jie8vhr8p1g511q9h56.png-126.5kB

  • 对卷:pvc-064fc5f5-ba4c-4e50-b61a-dfe548e699a4进行手工备份
    image_1f1ev20kg5nh1rdp21r1r6010pg60.png-145.3kB

  • 选择Backup标签
    image_1f1ev38m917tdm3d1u63154a6ha6d.png-80.4kB

  • 根据刚才备份的卷名,查看备份情况
    image_1f1ev48n91k518pd195sejlico6q.png-108.7kB

  • 模拟数据丢失
    image_1f1ev7pddub972u1eb1o8do877.png-52.4kB

  • 通过Longhorn刚才的备份进行恢复
    image_1f1ev9u3bq5opnq1vl81fnivgb7k.png-115.1kB

  • 恢复到一个名为:skywalking-restore的PV卷中
    image_1f1evb81vpis112m1gsbb12u3881.png-109.6kB
    image_1f1evc6fndkb1vac1t0msch1dbl8e.png-138.9kB

  • 创建PVC
    image_1f1evrh301fo013291e2or37dr798.png-153.7kB
    image_1f1evsmphpnq7ptdkbuih2hta2.png-151.3kB

  • 将PVC挂载至容器,恢复数据即可
    image_1f1evvic78421d5g4nv5a81mhaaf.png-38.4kB
    image_1f1f02uvv1iv116p5hja1bl9lfsas.png-41.6kB
    image_1f1f08sqv1km51dhkm2rbsejob9.png-59.1kB

6、性能测试

使用fio磁盘性能测试工具:fio可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件,EPEL源,使用yum install fio -y安装

  • 测试随机写 IOPS,运行以下命令:

    1
    2
    3
    fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=512M -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Write_Testing
    #结果
    write: IOPS=2006, BW=8027KiB/s (8219kB/s)(512MiB/65319msec)
  • 测试随机读 IOPS,运行以下命令:

    1
    2
    3
    fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=512M  -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Rand_Read_Testing
    #结果
    read: IOPS=8700, BW=33.0MiB/s (35.6MB/s)(512MiB/15065msec)
  • 测试顺序写吞吐量,运行以下命令:

    1
    2
    3
    fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=512M  -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Write_PPS_Testing
    #结果
    write: IOPS=36, BW=36.2MiB/s (38.0MB/s)(512MiB/14128msec)
  • 测试顺序读吞吐量,运行以下命令:

    1
    2
    3
    fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=512M  -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=Read_PPS_Testing
    #结果
    read: IOPS=82, BW=82.6MiB/s (86.6MB/s)(512MiB/6202msec)
  • 输出结果解读,

    1
    2
    read : io=1024.0MB, bw=80505KB/s, iops=20126, runt= 13025msec
    表示 fio 做了 512M I/O,速率约为 80 MB/s,总 IOPS 为 20126,运行时间为 13 秒。

总结:Longhorn的性能受整个K8S集群的影响,其服务是建立在K8S集群之上的,所以集群中如果CPU压力过大、内存不足、API调用超时等等因素都会影响存储性能,所以Longhorn中有一项参数:Guaranteed Engine CPU,给Longhorn Instance Manager Pod保留一定数量的CPU,这将有助于在高节点工作负载期间保持引擎稳定性。严格的测试应该在一个干净的K8S集群上进行测试,并尽量使用光纤或者万兆网络进行互连,发挥其最大化性能,评判一个磁盘性能除了读写速率外,一般要看IOPS这个指标,SSD的随机读写IOPS可达上万,普通的机械硬盘最多可能才几百,顺序读写的场景一般是单个大文件,而实际生产,我们大部分是零碎的小文件,这个时候就特别考验随机读写的性能,那么测试结果中IOPS的数值越大,代表其性能越佳,如果要投产使用,请参考官网的最佳实践!

7、其他

-------------本文结束感谢您的阅读-------------
LiGuanCheng wechat
如有问题,请与我微信交流或通过右下角“daovoice”与我联系~。
请我喝一杯咖啡~