云原生存储系统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,如果一个控制器发生故障,则其他卷的功能不会受到影响;
2、Longhorn的安装与部署
提示:yaml文件中,已经根据实际生产情况做了优化调整(请参考最佳实践),并添加了NFS备份存储服务器,卷数据的备份将统一使用NFS进行管理和存储;
1 [root@DEVOPSSRV01 ~]# kubectl apply /k8s_yml/longhorn_deployment/longhorn-v1.1.0.yaml
3、创建volume
Longhorn可创建的卷类型大致分为
Block Volume
、CSI Persistent Volume
、静态PVC
、动态PVC
;
3.1、创建静态PVC逻辑卷
静态PVC:顾名思义需要编写PVC.yaml,通过手工指定PVC的metadata_name,申请PV资源,才可以挂载到对应的namespace下供pod使用;
1 | #创建PVC资源,向longhorn申请PV存储卷 |
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的存储协议进行网络通信,块设备则像一个本地磁盘一样挂载至服务器进行使用,
4、数据备份与恢复
提示:备份与恢复统一使用Longhron的UI进行
查看创建的volume
对卷:
pvc-064fc5f5-ba4c-4e50-b61a-dfe548e699a4
进行手工备份选择Backup标签
根据刚才备份的卷名,查看备份情况
模拟数据丢失
通过Longhorn刚才的备份进行恢复
恢复到一个名为:skywalking-restore的PV卷中
创建PVC
将PVC挂载至容器,恢复数据即可
6、性能测试
使用fio磁盘性能测试工具:fio可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件,EPEL源,使用yum install fio -y安装
测试随机写 IOPS,运行以下命令:
1
2
3fio -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
3fio -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
3fio -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
3fio -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
2read : 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、其他
- 官方手册:Longhorn文档
- GITHUB地址:longhorn
- 最佳实践:生产环境中部署Longhorn
- 基于K8S的安装模板:Install With Kubectl
- Longhorn配置参数详解:Settings Reference
- 基本K8S的使用案列:Examples
- Longhorn备份与恢复手册:Setting a Backup Target