一、GlusterFS简介

     GlusterFS(GNU ClusterFile System)是一种全对称的开源分布式文件系统,所谓全对称是指GlusterFS采用弹性哈希算法,没有中心节点,所有节点全部平等。GlusterFS配置方便,稳定性好,可轻松达到PB级容量,数千个节点。

二、GlusterFS重要概念

  • birck:GlusterFS的基本元素,以节点服务器目录形式展现;
  • volume:多个brick的逻辑集合;
  • metadata:元数据,用于描述文件、目录等的信息;
  • self-heal:用于后台运行检测副本卷中文件和目录的不一致性并解决这些不一致;
  • FUSE:Filesystem Userspace是一个可加载的内核模块,其支持非特权用户创建自己的文件系统而不需要修改内核代码通过在用户空间运行文件系统的代码通过FUSE代码与内核进行桥接;
  • Gluster Server:数据存储服务器,即组成GlusterFS存储集群的节点;
  • Gluster Client:使用GlusterFS存储服务的服务器,如KVM、OpenStack、LB RealServer、HA node。

三、GlusterFS部署

  1. 环境准备

  • 操作系统:CentOS Linux release 7.6.1810 (Core)
  • 内核版本:3.10.0-957.el7.x86_64
  • 关闭防火墙、关闭selinux,hostname能互相解析

主机:10.210.10.67 master
主机:10.210.10.68 node68
主机:10.210.10.69 node69

  1. 软件包安装(三台都执行)

# yum -y install centos-release-gluster
# yum -y install glusterfs glusterfs-server glusterfs-fuse

-- 如果是客户端只需要 glusterfs glusterfs-fuse即可.

  1. 启动服务
 启动/关闭/查看glusterd服务
# systemctl start glusterd.service
# systemctl stop glusterd.service
# systemctl status glusterd.service

  1. 开机自动启动glusterd服务
# systemctl enable glusterd.service

四、通过heketi 进行集群管理

  • 在 server1 上下载 Heketi。

wget https://dowload.fastgit.org/heketi/heketi/releases/download/v7.0.0/heketi-v7.0.0.linux.amd64.tar.gz

    • 备注

您也可以在单独的机器上安装 Heketi。

  • 将文件解压缩。

tar -xf heketi-v7.0.0.linux.amd64.tar.gz

cd heketi

cp heketi /usr/bin

cp heketi-cli /usr/bin

  • 创建 Heketi 服务文件(用于系统启动)。

vi /lib/systemd/system/heketi.service

      [Unit]

      Description=Heketi Server

      [Service]

      Type=simple

      WorkingDirectory=/var/lib/heketi

      ExecStart=/usr/bin/heketi --config=/etc/heketi/heketi.json

      Restart=on-failure

      StandardOutput=syslog

      StandardError=syslog

      [Install]

      WantedBy=multi-user.target

  • 创建 Heketi 文件夹。

mkdir -p /var/lib/heketi

mkdir -p /etc/heketi

  • 创建 JSON 文件以配置 Heketi。

    vi /etc/heketi/heketi.json

示例文件:

{

 "_port_comment": "Heketi Server Port Number",

 "port": "8080",

  

 "_use_auth": "Enable JWT authorization. Please enable for deployment",

 "use_auth": false,

  

 "_jwt": "Private keys for access",

 "jwt": {

  "_admin": "Admin has access to all APIs",

  "admin": {

   "key": "123456"

  },

  "_user": "User only has access to /volumes endpoint",

  "user": {

   "key": "123456"

  }

 },

  

 "_glusterfs_comment": "GlusterFS Configuration",

 "glusterfs": {

  "_executor_comment": [

   "Execute plugin. Possible choices: mock, ssh",

   "mock: This setting is used for testing and development.",

   "   It will not send commands to any node.",

   "ssh: This setting will notify Heketi to ssh to the nodes.",

   "   It will need the values in sshexec to be configured.",

   "kubernetes: Communicate with GlusterFS containers over",

   "       Kubernetes exec api."

  ],

  "executor": "ssh",

  

  "_sshexec_comment": "SSH username and private key file information",

  "sshexec": {

   "keyfile": "/root/.ssh/id_rsa",

   "user": "root"

  },

  

  "_kubeexec_comment": "Kubernetes configuration",

  "kubeexec": {

   "host" :"https://kubernetes.host:8443",

   "cert" : "/path/to/crt.file",

   "insecure": false,

   "user": "kubernetes username",

   "password": "password for kubernetes user",

   "namespace": "Kubernetes namespace",

   "fstab": "Optional: Specify fstab file on node. Default is /etc/fstab"

  },

  

  "_db_comment": "Database file name",

  "db": "/var/lib/heketi/heketi.db",

  "brick_max_size_gb" : 1024,

 "brick_min_size_gb" : 1,

 "max_bricks_per_volume" : 33,

  

  

  "_loglevel_comment": [

   "Set log level. Choices are:",

   " none, critical, error, warning, info, debug",

   "Default is warning"

  ],

  "loglevel" : "debug"

 }

}

    • 备注

在安装 GlusterFS 作为 KubeSphere 集群的存储类型时,必须提供帐户 admin 及其 Secret 值。

  • 启动 Heketi。

systemctl start heketi

  • 检查 Heketi 的状态。

systemctl status heketi

如果出现了 active (running),则意味着安装成功。预计输出:

 heketi.service - Heketi Server

  Loaded: loaded (/lib/systemd/system/heketi.service; disabled; vendor preset: enabled)

  Active: active (running) since Tue 2021-03-09 13:04:30 CST; 4s ago

 Main PID: 9282 (heketi)

  Tasks: 8

  Memory: 6.5M

   CPU: 62ms

  CGroup: /system.slice/heketi.service

​      └─9282 /usr/bin/heketi --config=/etc/heketi/heketi.json

  

Mar 09 13:04:30 server1 systemd[1]: Started Heketi Server.

Mar 09 13:04:30 server1 heketi[9282]: Heketi v7.0.0

Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Loaded ssh executor

Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Adv: Max bricks per volume set to 33

Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Adv: Max brick size 1024 GB

Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Adv: Min brick size 1 GB

Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 GlusterFS Application Loaded

Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Started Node Health Cache Monitor

Mar 09 13:04:30 server1 heketi[9282]: Listening on port 8080

  • 启用 Heketi。

 systemctl enable heketi

  • 为 Heketi 创建拓扑配置文件,该文件包含添加到 Heketi 的集群、节点和磁盘的信息。
    • vi /etc/heketi/topology.json

   {
    "clusters": [
       {
         "nodes": [
           {
             "node": {
               "hostnames": {
                 "manage": [
                   "master" 
                ],
                "storage": [
                  "10.210.10.67" 
                ]
              },
              "zone": 1
            },
            "devices": [
              "/dev/vdb" 
            ]
          },
          {
            "node": {
              "hostnames": {
                "manage": [
                  "node68" 
                ],
                "storage": [
                  "10.210.10.68"
                ]
              },
              "zone": 1
            },
            "devices": [
              "/dev/vdb" 
            ]
          },
          {
             "node": {
               "hostnames": {
                 "manage": [
                   "node69"
                ],
                "storage": [
                  "10.210.10.69"  
                ]
              },
              "zone": 1
            },
            "devices": [
              "/dev/vdb"
            ]
          }
        ]
      }
    ]
  }

  • 备注
    • 请使用您自己的 IP 替换上述 IP 地址。
    • 请在 devices 一栏添加您自己的磁盘名称。
  • 加载 Heketi JSON 文件。

 export HEKETI_CLI_SERVER=http://localhost:8080
 heketi-cli topology load --json=/etc/heketi/topology.json

预计输出:

Creating cluster ... ID: 2d9e11adede04fe6d07cb81c5a1a7ea4

  Allowing file volumes on cluster.

  Allowing block volumes on cluster.

  Creating node 192.168.0.2 ... ID: 0a9f240ab6fd96ea014948c5605be675

​    Adding device /dev/vdd ... OK

  Creating node 192.168.0.3 ... ID: 2468086cadfee8ef9f48bc15db81c88a

​    Adding device /dev/vdd ... OK

  Creating node 192.168.0.4 ... ID: 4c21b33d5c32029f5b7dc6406977ec34

​    Adding device /dev/vdd ... OK

  • 以上输出同时显示了集群 ID 和节点 ID。运行以下命令查看集群信息。

heketi-cli cluster info 2d9e11adede04fe6d07cb81c5a1a7ea4 # Use your own cluster ID.

预计输出:

Cluster id: 2d9e11adede04fe6d07cb81c5a1a7ea4

Nodes:

0a9f240ab6fd96ea014948c5605be675

2468086cadfee8ef9f48bc15db81c88a

4c21b33d5c32029f5b7dc6406977ec34

Volumes:

  

Block: true

  

File: true

五、Kubernetes 使用GlusterFS(通过storageclass)

k8s中使用glusterfs的时候, 会根据pvc的申请自动创建对应的pv, 然后绑定。 这样我们在pod里面就可以指定具体的pvc了。

创建storageclass

apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: kube-system
type: kubernetes.io/glusterfs
data:
  key: "MTIzNDU2Cg=="    #请替换为您自己的密钥。Base64 编码。
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  annotations:
    storageclass.beta.kubernetes.io/is-default-class: "true"
    storageclass.kubesphere.io/supported-access-modes: '["ReadWriteOnce","ReadOnlyMany","ReadWriteMany"]'
  name: glusterfs
parameters:
  clusterid: "b62eab25e53b9ebc476322affac8ad4b"    #请替换为您自己的 GlusterFS 集群 ID。
  gidMax: "50000"
  gidMin: "40000"
  restauthenabled: "true"
  resturl: "http://10.210.10.186:8080"    #Gluster REST 服务/Heketi 服务 URL 可按需供应 gluster 存储卷。请替换为您自己的 URL。
  restuser: admin
  secretName: heketi-secret
  secretNamespace: kube-system
  volumetype: "replicate:3"    #请替换为您自己的存储卷类型。(不开启副本 volumetype: "none")
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true

创建pvc

[root@master ~]# cat pvc.yml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc1
  namespace: default
  annotations:
    volume.beta.kubernetes.io/storage-class: "glusterfs"
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
[root@master ~]# kubectl apply -f pvc.yml  
[root@master ~]# kubectl get pvc           
NAME   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc1   Bound    pvc-affe7efc-21fe-11e9-9d1f-000c2987cf81   2Gi        RWX            glusterfs      19s

GlusterFS常用命令小结

1.    启动/关闭/查看glusterd服务

# /etc/init.d/glusterd start

# /etc/init.d/glusterd stop

# /etc/init.d/glusterd status

2.    开机自动启动glusterd服务

# chkconfig glusterd on # Red Hat

# update-rc.d glusterd defaults # Debian

# echo "glusterd" >>/etc/rc.local # Others

3.    查看配置信息

# cat /etc/rc.local

4.    为存储池添加/移除服务器节点

在其中一个节点上操作即可:

# gluster peer probe

# gluster peer detach

注意,移除节点时,需要提前将该节点上的Brick移除。

查看所有节点的基本状态(显示的时候不包括本节点):

# gluster peer status

5.    挂载分区

# mount -t ext4 /dev/sdd1 /mnt/brick1

6.    创建/启动/停止/删除卷

# gluster volume create [stripe | replica ] [transport [tcp | rdma | tcp,rdma]] ...

# gluster volume start

# gluster volume stop

# gluster volume delete

注意,删除卷的前提是先停止卷。

7.    客户端以glusterfs方式挂载

# mount -t glusterfs :/

对于OpenStack,计算和控制节点都要挂载/var/lib/nova/instances,控制节点还要挂载/var/lib/glance/images。

8.    查看卷信息

列出集群中的所有卷:

# gluster volume list

查看集群中的卷信息:

# gluster volume info [all]

查看集群中的卷状态:

# gluster volume status [all]

# gluster volume status [detail| clients | mem | inode | fd]

查看本节点的文件系统信息:

# df -h []

查看本节点的磁盘信息:

# fdisk -l

9.    配置卷

# gluster volume set

10.  扩展卷

# gluster volume add-brick

注意,如果是复制卷或者条带卷,则每次添加的Brick数必须是replica或者stripe的整数倍。

11.  收缩卷

先将数据迁移到其它可用的Brick,迁移结束后才将该Brick移除:

# gluster volume remove-brick start

在执行了start之后,可以使用status命令查看移除进度:

# gluster volume remove-brick status

不进行数据迁移,直接删除该Brick:

# gluster volume remove-brick commit

注意,如果是复制卷或者条带卷,则每次移除的Brick数必须是replica或者stripe的整数倍。

12.  迁移卷

使用start命令开始进行迁移:

# gluster volume replace-brick start

在数据迁移过程中,可以使用pause命令暂停迁移:

# gluster volume replace-brick pause

在数据迁移过程中,可以使用abort命令终止迁移:

# gluster volume replace-brick abort

在数据迁移过程中,可以使用status命令查看迁移进度:

# gluster volume replace-brick status

在数据迁移结束后,执行commit命令来进行Brick替换:

# gluster volume replace-brick commit

13.  重新均衡卷

不迁移数据:

# gluster volume rebalance lay-outstart

# gluster volume rebalance start

# gluster volume rebalance startforce

# gluster volume rebalance status

# gluster volume rebalance stop

14.  系统扩展维护

开启/关闭系统配额:

# gluster volume quota enable | disable

设置目录配额:

# gluster volume quota limit-usage

查看配额:

# gluster volume quota list [

]

地域复制(geo-replication):

# gluster volume geo-replication start | status | stop

IO信息查看:

# gluster volume profile start | info | stop

Top监控:

Top命令允许你查看Brick的性能,例如:read,write, file open calls, file read calls, file write calls, directory opencalls, and directory real calls。所有的查看都可以设置 top数,默认100。

查看打开的 fd:

# gluster volume top open[brick ] [list-cnt ]

其中,open可以替换为read, write, opendir, readdir等。

查看每个 Brick 的读性能:

# gluster volume top read-perf [bs count ] [brick ] [list-cnt ]

其中,read-perf可以替换为write-perf等。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐