GlusterFS作为Kubernetes的外部存储

图片
寻找最佳存储空间是一个相当复杂的过程,每件事都有其优缺点。当然,该类别的领导者是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  
      - ip: 10.10.6.71
    ports:
      #    1,    
      - 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倍。

All Articles