寻找最佳存储空间是一个相当复杂的过程,每件事都有其优缺点。当然,该类别的领导者是CEPH,但这是一个相当复杂的系统,尽管功能非常丰富。对于我们来说,这样的系统是多余的,因为我们需要以master-master模式存储几个TB的简单复制存储。在研究了很多材料之后,我们决定针对我们感兴趣的电路测试市场上最时尚的产品。由于尚未找到此类计划的现成解决方案,因此,我想分享有关此主题的最佳实践,并描述在部署过程中遇到的问题。目标
我们对新存储库有什么期望:- 能够使用偶数个节点进行复制。
- 易于安装,设置,支持
- 该系统必须是成人的,经过时间考验的并且是用户
- 无需停机即可扩展存储空间的能力
- 存储必须与Kubernetes兼容
- 当其中一个节点崩溃时,应该有一个自动故障转移
关于最后一点,我们还有很多问题。部署方式
为了进行部署,在CentO 8上创建了两个虚拟机。每个虚拟机都通过带有存储的附加磁盘连接。初步准备
对于GlusterFS,您需要使用XFS分配一个单独的磁盘,这样它就不会以任何方式影响系统。选择分区:$ fdisk /dev/sdb
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-16777215, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-16777215, default 16777215):
Created a new partition 1 of type ‘Linux’ and of size 8 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table. Syncing disks.
在XFS中格式化并挂载:$ mkfs.xfs /dev/sdb1
$ mkdir /gluster
$ mount /dev/sdb1 /gluster
最重要的是,将条目放在/ etc / fstab中以在系统启动时自动安装目录:/dev/sdb1 /gluster xfs defaults 0 0
安装
关于安装,已经写了许多文章,在这方面我们将不深入讨论该过程,我们只考虑值得关注的内容。在两个节点上,安装并运行最新版本的glusterfs:$ wget -P /etc/yum.repos.d https://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-rhel8.repo
$ yum -y install yum-utils
$ yum-config-manager --enable PowerTools
$ yum install -y glusterfs-server
$ systemctl start glusterd
接下来,您需要告诉glaster他的相邻节点在哪里。它仅用一个节点完成。重要的一点:如果您具有域网络,则必须使用域指定服务器名称,否则将来您将必须重做所有操作。$ gluster peer probe gluster-02.example.com
如果成功,则我们使用两个服务器上的命令检查连接:$ gluster peer status
Number of Peers: 1
Hostname: gluster-02.example.com
Uuid: a6de3b23-ee31-4394-8bff-0bd97bd54f46
State: Peer in Cluster (Connected)
Other names:
10.10.6.72
现在您可以创建一个我们将在其中编写的卷。gluster volume create main replica 2 gluster-01.example.com:/gluster/main gluster-02.example.com:/gluster/main force
哪里:- 主要-名称卷
- 复制副本-类型的卷(更多详细信息可以在官方文档中找到)
- 2-副本数
运行卷并检查其性能:gluster volume start main
gluster volume status main
对于复制的卷,建议您设置以下参数:$ gluster volume set main network.ping-timeout 5
$ gluster volume set main cluster.quorum-type fixed
$ gluster volume set main cluster.quorum-count 1
$ gluster volume set main performance.quick-read on
通过这些简单的步骤,我们构建了一个GlusterFS集群。它仍然可以连接到它并检查性能。Ubuntu安装在客户端计算机上,要进行安装,您需要安装客户端:$ add-apt-repository ppa:gluster/glusterfs-7
$ apt install glusterfs-client
$ mkdir /gluster
$ mount.glusterfs gluster-01.example.com:/main /gluster
Gluster连接到其中一个节点时,会提供所有节点的地址并自动连接到所有节点。如果客户端已经连接,则节点之一的故障不会导致停止。但是,如果第一个节点不可用,则在会话中断的情况下将无法连接。为此,在挂载时,可以传递指示第二个节点的backupvolfile参数。mount.glusterfs gluster-01.example.com:/main /gluster -o backupvolfile-server=gluster-02.example.com
重要一点:gluster仅在节点之间的文件更改是通过装入的卷时才在它们之间同步文件。如果直接在节点上进行更改,则文件将不同步。连接到Kubernetes
在这个阶段,问题开始了:“如何连接?”。并且有几种选择。考虑他们。赫克蒂
最受欢迎和推荐的方法是使用外部服务:heketi。heketi是kubernetes和gluster之间的一层,它使您可以通过http管理和使用存储。但是heketi将会是单点故障,因为 服务未群集。此服务的第二个实例将无法独立运行,因为 任何更改都存储在本地数据库中。在kubernetes中运行此服务也不适合,因为 他需要一个静态磁盘,数据库将存储在该磁盘上。在这方面,该选项被认为是最不合适的。Kubernetes的端点
如果您在具有软件包管理器的系统上使用Kubernetes,那么这是一个非常方便的选择。关键是要为Kubernetes中的所有GlusteFS服务器创建一个公共端点。该端点上挂有一个服务,我们已经被挂载在该服务上。为了使此选项起作用,必须在每个Kubernetes节点上安装glusterfs-client并确保可以安装它。在Kubernetes中,部署以下配置:apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs-cluster
subsets:
- addresses:
- ip: 10.10.6.71
ports:
- port: 1
- addresses:
- ip: 10.10.6.72
ports:
- port: 1
---
apiVersion: v1
kind: Service
metadata:
name: glusterfs-cluster
spec:
ports:
- port: 1
现在,我们可以创建一个简单的测试部署,并检查安装的工作方式。下面是一个简单的测试部署示例:apiVersion: apps/v1
kind: Deployment
metadata:
name: gluster-test
spec:
replicas: 1
selector:
matchLabels:
app: gluster-test
template:
metadata:
labels:
app: gluster-test
spec:
volumes:
- name: gluster
glusterfs:
endpoints: glusterfs-cluster
path: main
containers:
- name: gluster-test
image: nginx
volumeMounts:
- name: gluster
mountPath: /gluster
这个选项不适合我们,因为我们在所有Kubernetes节点上都有container-linux。软件包管理器不存在,因此无法安装gluster-client进行安装。在这方面,找到了第三个选择方案,决定使用。GlusterFS + NFS + keepalived
直到最近,GlusterFS都提供了自己的NFS服务器,但是现在外部服务nfs-ganesha用于NFS。关于这一点已经写了很多,与此相关的我们将弄清楚如何配置它。该存储库必须手动注册。为此,在文件/etc/yum.repos.d/nfs-ganesha.repo中添加:[nfs-ganesha]
name=nfs-ganesha
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/$basearch/
enabled=1
gpgcheck=1
[nfs-ganesha-noarch]
name=nfs-ganesha-noarch
baseurl=https://download.nfs-ganesha.org/2.8/2.8.0/RHEL/el-8/noarch/
enabled=1
gpgcheck=1
并安装:yum -y install nfs-ganesha-gluster --nogpgcheck
安装后,我们在文件/etc/ganesha/ganesha.conf中进行基本配置。# create new
NFS_CORE_PARAM {
# possible to mount with NFSv3 to NFSv4 Pseudo path
mount_path_pseudo = true;
# NFS protocol
Protocols = 3,4;
}
EXPORT_DEFAULTS {
# default access mode
Access_Type = RW;
}
EXPORT {
# uniq ID
Export_Id = 101;
# mount path of Gluster Volume
Path = "/gluster/main";
FSAL {
# any name
name = GLUSTER;
# hostname or IP address of this Node
hostname="gluster-01.example.com";
# Gluster volume name
volume="main";
}
# config for root Squash
Squash="No_root_squash";
# NFSv4 Pseudo path
Pseudo="/main";
# allowed security options
SecType = "sys";
}
LOG {
# default log level
Default_Log_Level = WARN;
}
我们需要启动服务,为卷启用nfs并检查它是否已打开。$ systemctl start nfs-ganesha
$ systemctl enable nfs-ganesha
$ gluster volume set main nfs.disable off
$ gluster volume status main
结果,该状态应表明该卷的nfs服务器已启动。您需要安装并检查。mkdir /gluster-nfs
mount.nfs gluster-01.example.com:/main /gluster-nfs
但是此选项不是容错的,因此您需要创建一个VIP地址,该地址将在我们两个节点之间传播,并在其中一个节点掉落时帮助切换流量。立即通过程序包管理器在KentO中安装keepalived。$ yum install -y keepalived
我们在文件/etc/keepalived/keepalived.conf中配置服务:global_defs {
notification_email {
admin@example.com
}
notification_email_from alarm@example.com
smtp_server mail.example.com
smtp_connect_timeout 30
vrrp_garp_interval 10
vrrp_garp_master_refresh 30
}
#C , . , VIP .
vrrp_script chk_gluster {
script "pgrep glusterd"
interval 2
}
vrrp_instance gluster {
interface ens192
state MASTER # BACKUP
priority 200 # , 100
virtual_router_id 1
virtual_ipaddress {
10.10.6.70/24
}
unicast_peer {
10.10.6.72 #
}
track_script {
chk_gluster
}
}
现在,我们可以启动服务并检查节点上的VIP是否出现:$ systemctl start keepalived
$ systemctl enable keepalived
$ ip addr
1: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:97:55:eb brd ff:ff:ff:ff:ff:ff
inet 10.10.6.72/24 brd 10.10.6.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 10.10.6.70/24 scope global secondary ens192
valid_lft forever preferred_lft forever
如果一切对我们都有效,那么仍然需要将PersistentVolume添加到Kubernetes并创建测试服务以验证操作。---
apiVersion: v1
kind: PersistentVolume
metadata:
name: gluster-nfs
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 10.10.6.70
path: /main
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
volumeName: "gluster-nfs"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gluster-test
labels:
app: gluster-test
spec:
replicas: 1
selector:
matchLabels:
app: gluster-test
template:
metadata:
labels:
app: gluster-test
spec:
volumes:
- name: gluster
persistentVolumeClaim:
claimName: gluster-nfs
containers:
- name: gluster-test
image: nginx
volumeMounts:
- name: gluster
mountPath: /gluster
使用此配置,如果主节点掉落,它将闲置大约一分钟,直到安装超时超时并切换。对于这种存储而言,只需花一分钟的时间,这不是正常情况,我们很少遇到这种情况,但是在这种情况下,系统将自动切换并继续工作,我们将能够解决问题并进行恢复而无需担心简单性。摘要
在本文中,我们研究了将GlusterFS连接到Kubernetes的3个可能的选项,在我们的版本中,可以向Kubernetes添加一个预配器,但是我们还不需要它。仍然需要在同一节点上的NFS和Gluster之间添加性能测试的结果。1Mb上的文件:sync; dd if=/dev/zero of=tempfile bs=1M count=1024; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.63496 s, 407 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 5.4527 s, 197 MB/s
1Kb上的文件:sync; dd if=/dev/zero of=tempfile bs=1K count=1048576; sync
Gluster: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 70.0508 s, 15.3 MB/s
NFS: 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.95208 s, 154 MB/s
NFS对于任何文件大小都可以工作,但速度差异不是特别明显,这与GlusterFS不同,后者对于小文件而言会大大降低。但是同时,对于大文件,NFS的性能比Gluster低2-3倍。