注:使用源码安装的原因主要是使用yum安装glusterfs服务端时出现一些依赖库问题

  • 准备3台glusterfs服务器(官方也建议至少3台,防止发生脑裂),并在各个服务器的/etc/hosts下面添加如下内容(如使用DNS服务器,则在DNS中添加域名解析)
10.85.3.113 glusterfs-.example.com
10.85.3.114 glusterfs-.example.com
10.85.3.115 glusterfs-.example.com
# yum install autoconf automake bison cmockery2-devel dos2unix flex fuse-devel glib2-devel libacl-devel libaio-devel libattr-devel libcurl-devel libibverbs-devel librdmacm-devel libtirpc-devel libtool libxml2-devel lvm2-devel make openssl-devel pkgconfig pyliblzma python-devel python-eventlet python-netifaces python-paste-deploy python-simplejson python-sphinx python-webob pyxattr readline-devel rpm-build sqlite-devel systemtap-sdt-devel tar userspace-rcu-devel
# cd userspace-rcu-master
# ./bootstrap
# ./configure
# make && make install
# ldconfig
  • 下载glusterfs源码并解压到/home/glusterfs-5.7,本次版本为5.7
  • 将glusterfs的lib拷贝到系统目录(编译gluster的时候会用到)
# cd /home/glusterfs-5.7 
# cp -r libglusterfs/src /usr/local/include/glusterfs
  • 安装依赖库uuid,yum install -y libuuid-devel
  • 拷贝glupy(编译gluster的时候会用到)
# cp -r /home/glusterfs-xlators-master/xlators/features/glupy/ /home/glusterfs-5.7/xlators/features/
  • 按照官方文档编译安装glusterfs
# cd /home/glusterfs-5.7
# ./autogen.sh
# ./configure --without-libtirpc
# ./configure --enable-gnfs
# make
# make install

在make的时候可能会遇到如下错误

../../../../contrib/userspace-rcu/rculist-extra.h::: error: redefinition of 'cds_list_add_tail_rcu'
void cds_list_add_tail_rcu(struct cds_list_head *newp,
^
In file included from glusterd-rcu.h::,
from glusterd-sm.h:,
from glusterd.h:,
from glusterd.c::
/usr/local/include/urcu/rculist.h::: note: previous definition of 'cds_list_add_tail_rcu' was here
void cds_list_add_tail_rcu(struct cds_list_head *newp,

给下述文件的cds_list_add_tail_rcu函数加上条件编译即可

/usr/local/include/urcu/rculist.h
/home/glusterfs-5.7/contrib/userspace-rcu/rculist-extra.h
#ifndef CDS_LIST_ADD_TAIL_CRU
#define CDS_LIST_ADD_TAIL_CRU
static inline
void cds_list_add_tail_rcu(struct cds_list_head *newp,
struct cds_list_head *head)
{
newp->next = head;
newp->prev = head->prev;
rcu_assign_pointer(head->prev->next, newp);
head->prev = newp;
}
#endif
  • 在3台服务器执行如下命令,使用devicemapper
mkdir -p /data/brick
chown -R root: /data
chmod -R /data
vgcreate vgglusterfs /dev/vdb
lvcreate -L 499G -n glusterfs vgglusterfs
mkfs.xfs /dev/mapper/vgglusterfs-glusterfs
#/etc/fstab中添加:/dev/mapper/vgglusterfs-glusterfs /data/brick xfs defaults
mount -a
  • 在3台服务器执行如下命令,设置开机启动并启动glusterfs
systemctl enable glusterd.service

  使用如下命令查看生成的gluster.service的路径,本系统为:/usr/local/lib/systemd/system/glusterd.service

systemctl cat glusterd.service

/usr/local/lib/systemd/system/glusterd.service的内容如下

[Unit]
Description=GlusterFS, a clustered file-system server
Requires=rpcbind.service
After=network.target rpcbind.service
Before=network-online.target [Service]
Type=forking
PIDFile=/var/run/glusterd.pid
LimitNOFILE=
Environment="LOG_LEVEL=INFO"
ExecStart=/usr/local/sbin/glusterd -p /var/run/glusterd.pid --log-level $LOG_LEVEL $GLUSTERD_OPTIONS
KillMode=process
SuccessExitStatus= [Install]
WantedBy=multi-user.target

执行如下命令启动

systemctl daemon-reload
systemctl start glusterd.service

如果遇到“Failed to restart glusterd.service: Unit not found”错误,可能是rpcbind.service没有安装,执行yum install -y rpcbind安装即可

遇到“Failed to start GlusterFS, a clustered file-system server”错误,可以尝试如下方式:

  1. 可能本机已经启动glusterfs服务,找到进程,kill掉
  2. glusterd配置错误,找到glusterd.vol文件,并修改“working-directory” 为glusterd.vol所在的路径。如本机的glusterd.vol路径为/usr/local/etc/glusterfs/glusterd.vol,则glusterd.vol中的working-directory一行设置为“working-directory  /usr/local/etc/glusterfs"
  • 在master1上执行如下命令,添加对端
# gluster peer probe glusterfs-1.example.com
# gluster peer probe glusterfs-2.example.com
# gluster peer probe glusterfs-3.example.com
# gluster peer status
  • 在master1上创建并启动volume,大小为5G
gluster volume create volume-5G replica   glusterfs-.example.com:/data/brick/glusterfs1 glusterfs-.example.com:/data/brick/glusterfs2 glusterfs-.example.com:/data/brick/glusterfs3
gluster volume start volume-5G

使用如下命令查看volume

gluster volume status
gluster volume info

容器环境下推荐Replicated 模式,更多信息参见官方文档,注意部分模式已经废弃

  • 在客户端机器上安装glusterfs客户端
# yum install glusterfs-client -y
  • 在客户端挂载服务端volume,第一种方式为采用nfs挂载,第二种采用glusterfs命令行挂载,效果一样
mount -t glusterfs glusterfs-.example.com:/volume-5G /data/mounttest/
glusterfs --volfile-id=volume-5G --volfile-server=glusterfs-.example.com /data/glusterfsclient
  • 需要注意的是存在多个glusterfs服务器时,client挂载glusterfs服务器的目录时并不需要对其进行负载均衡,只要挂载其中一台glusterfs的服务器的目录即可。本例中的client为:10.85.3.111,服务端为:10.85.3.113~10.85.3.115,client仅挂载了10.85.3.113的目录,但在client的tcp链接上可以看到如下链接状态(已删除无关信息),即client其实与3个服务端都建立了链接,即使一个服务器宕机或删除任何一个服务器的brick都不会影响其他两台服务器的数据存储。客户端挂载仅用于初始化拓扑。更多参见StackOverflow
# netstat  -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 10.85.3.111: 10.85.3.115: ESTABLISHED /glusterfs
tcp 10.85.3.111: 10.85.3.113: ESTABLISHED /glusterfs
tcp 10.85.3.111: 10.85.3.113: ESTABLISHED /glusterfs
tcp 10.85.3.111: 10.85.3.114: ESTABLISHED /glusterfs

TIPS:

  • 在执行”gluster delete volume $volume_name“命令后再添加时可能会出现如"Error: /data/brick/glusterfs1 is already part of a volume"的错误,使用如下方式清理环境即可
# rm -rf /data/brick/glusterfs1/*
# setfattr -x trusted.glusterfs.volume-id /data/brick/glusterfs1/
# 开启 指定 volume 的配额
$ gluster volume quota k8s-volume enable # 限制 指定 volume 的配额
$ gluster volume quota k8s-volume limit-usage / 1TB # 设置 cache 大小, 默认32MB
$ gluster volume set k8s-volume performance.cache-size 4GB # 设置 io 线程, 太大会导致进程崩溃
$ gluster volume set k8s-volume performance.io-thread-count # 设置 网络检测时间, 默认42s
$ gluster volume set k8s-volume network.ping-timeout # 设置 写缓冲区的大小, 默认1M
$ gluster volume set k8s-volume performance.write-behind-window-size 1024MB
  • gluster brick的删除和添加,使用remove-brick时需要指定副本数,remove-brick无法删除所有的副本。如需要可以使用gluster volume delete命令
volume remove-brick <VOLNAME> [replica <COUNT>] <BRICK> ... <start|stop|status|commit|force>
volume add-brick <VOLNAME> [<stripe|replica> <COUNT> [arbiter <COUNT>]] <NEW-BRICK> ... [force]
  • 磁盘测试

下载fio,解压后执行“make & make install”即可。可能需要执行"yum install libaio-devel"

  • glusterfs的监控

在一台服务器上下载并执行“make build”编译gluster_exporter,直接使用./gluster_exporter启动即可。(为保证node节点有效性,最好在每台服务器上安装node_exporter)。使用如下方式可以简单启动一个exporter,监听端口默认是9189

nohup gluster_exporter --web.telemetry-path="/usr/local/sbin/gluster" >&  &

在Prometheus中添加新job,即可使用Prometheus监控glusterfs

- job_name: glusterfs1
static_configs:
- targets: ['10.85.3.113:9189']
labels:
alias: glusterfs1
  • glusterfs默认日志路径为:/var/log/glusterfs/glusterfs.log
  • glusterfs client挂载磁盘时必须指定域名
  • client去挂载目录删除对应挂载的进程即可,使用ps -ef|grep glusterfs查看
  • 使用glusterfs时建议设置目录权组为65534,权限设置为775,并在挂载的进程上加上Supplement group为65534
  • 使用gluster volume status [all | <VOLNAME> [nfs|shd|<BRICK>|quotad|tierd]] [detail|clients|mem|inode|fd|callpool|tasks|client-list]可以查看相关的volume信息,如gluster volume status VOLNAME clients可以查看volume的client信息

目前kubernetes使用glusterfs storageclass时需要用到heketi,下面讲解heketi的部署

官网下载heketi压缩包heketi-vx.x.x.linux.amd64.tar.gz,可以按照官网文档进行安装部署,虚机部署方式如下:

  • 创建目录:
mkdir /etc/heketi/
mkdir /var/lib/heketi/
  • 将压缩包中的heketi.json拷贝到/etc/heketi/路径下,修改heketi.json文件,使用ssh作为与glusterfs通信方式,主要修改内容如下(如有需要,请修改port)
"executor": "ssh",

"_sshexec_comment": "SSH username and private key file information",
"sshexec": {
"keyfile": "/etc/heketi/heketi_key",
"user": "root",
"port": "22",
"fstab": "Optional: Specify fstab file on node. Default is /etc/fstab",
"pv_data_alignment": "Optional: Specify PV data alignment size. Default is 256K",
"vg_physicalextentsize": "Optional: Specify VG physical extent size. Default is 4MB",
"lv_chunksize": "Optional: Specify LV chunksize. Default is 256K",
"backup_lvm_metadata": false,
"_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",
"debug_umount_failures": true
},
  • 添加授权,使用如下方式生成密钥,
ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ''
chmod 775 /etc/heketi/heketi_key

在所有gluasterfs服务器上为heketi添加ssh互信

cat heketi_key.pub >> /root/.ssh/authorized_keys
  • 创建systemd启动文件:/usr/lib/systemd/system/heketi.service,内容如下
[Unit]
Description=Heketi Server [Service]
Type=simple
WorkingDirectory=/var/lib/heketi
EnvironmentFile=-/etc/heketi/heketi.json
User=heketi
ExecStart=/usr/bin/heketi --config=/etc/heketi/heketi.json
Restart=on-failure
StandardOutput=syslog
StandardError=syslog [Install]
WantedBy=multi-user.target

并在/etc/systemd/system/multi-user.target.wants中创建软连接

ln -s /usr/lib/systemd/system/heketi.service heketi.service

加载并启动heketi

systemctl daemon-reload
systemctl enable heketi
systemctl start heketi

如果启动时出现如下错误,可在/etc/heketi/heketi.json中删除对应的行即可,如出现如下错误,删除"xfs_sw"对应的行,使用默认值即可。(建议配置或删除所有“Optional”的行)

ERROR: Unable to parse configuration: json: cannot unmarshal string into Go struct field KubeConfig.xfs_sw of type int
  • 执行如下命令,加载拓扑文件
$ export HEKETI_CLI_SERVER=http://<heketi server and port>
$ heketi-cli topology load --json=<topology>

拓扑文件内容如下,需要注意的是,heketi只能使用裸磁盘,不能使用文件系统以及lvm

{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"10.85.3.113"
],
"storage": [
"10.85.3.113"
]
},
"zone":
},
"devices": [
{
"name": "/dev/vdb",
"destroydata": false
}
]
},
{
"node": {
"hostnames": {
"manage": [
"10.85.3.114"
],
"storage": [
"10.85.3.114"
]
},
"zone":
},
"devices": [
{
"name": "/dev/vdb",
"destroydata": false
}
]
},
{
"node": {
"hostnames": {
"manage": [
"10.85.3.115"
],
"storage": [
"10.85.3.115"
]
},
"zone":
},
"devices": [
{
"name": "/dev/vdb",
"destroydata": false
}
]
}
]
}
]
}
  • 使用如下命令创建一个10Gb的volume
heketi-cli volume create --size=10 --name="test"

可以看到新创建的volume

# heketi-cli volume list
Id:0a0e0fd1f81973044bb0365e44c08648 Cluster:b988c638edcef9b5b44e0e42ccef30b7 Name:tes

在glusterfs上查看可以看到heketi其实也是使用了devicemapper

# df -h
Filesystem Size Used Avail Use% Mounted on
...
/dev/mapper/vg_c17870f6f2870ff1c8001ad19b3b9d5b-brick_e3e02d5357b540ce340ec5328fe8b0ec 10G 33M 10G % /var/lib/heketi/mounts/vg_c17870f6f2870ff1c8001ad19b3b9d5b/brick_e3e02d5357b540ce340ec5328fe8b0ec

当然此时也可以使用gluster命令查看volume

# gluster volume list
test

heketi命令行一般如下

export HEKETI_CLI_SERVER=http://<heketi server and port>
heketi-cli cluster list
heketi-cli cluster info $ID
heketi-cli node list
heketi-cli node info $ID
heketi-cli topology info
heketi-cli volume create --size= //10G
heketi-cli volume delete $ID
heketi-cli device disable $ID
keheti-cli device remove $ID
heketi-cli device delete $ID

注意:使用heketi管理volume后,仅使用heketi,不能glusterfs和heketi混用

  • openshift使用heketi做动态pvc的方式如下

首先创建storageclass

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: glusterfs
namespace: demo
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://10.86.3.113:18080"
restuser: "root"
restauthenabled: "false"

然后创建pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: glusterfs-test
namespace: demo
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 30Gi
storageClassName: glusterfs

需要注意的是如果heketi topology文件中使用了域名,则该域名必须能够被kubernetes解析,否则会失败

TIPS:

  • heketi删除node之前需要移除该node的device和volume
  • openshift 3.6中在配置pvc的时候可能会出现如下问题,在出现错误时没有给出错误信息,内容为nil。该问题为3.6版本的bug,建议升级
Failed to provision volume with StorageClass "glusterfs": glusterfs: create volume err: failed to create endpoint/service <nil>
  • 如果删除heketi出现问题,可以手动清理环境,执行如下操作
systemctl stop heketi

//在所有glusterfs服务器上执行如下操作
umount /var/lib/heketi/mounts/vg_xxxxxxx/brick_xxxx
rm -rf /var/lib/heketi/*
删除heketi创建的lv和vg

参考:

https://www.cnblogs.com/jicki/p/5801712.html

https://www.ibm.com/developerworks/cn/opensource/os-cn-glusterfs-docker-volume/index.html

https://jimmysong.io/kubernetes-handbook/practice/using-glusterfs-for-persistent-storage.html

https://access.redhat.com/documentation/en-US/Red_Hat_Storage/2.0/html/Administration_Guide/sect-User_Guide-Monitor_Workload-Displaying_Volume_Status.html

https://pdf.us/2019/03/15/3020.html

https://github.com/psyhomb/heketi

https://github.com/heketi/heketi/blob/master/docs/admin/volume.md

源码编译安装使用glusterfs+heketi安装使用的更多相关文章

  1. SSH/SSL 源码编译安装简易操作说明

    环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...

  2. 源码编译安装 MySQL 5.5.x 实践

    1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...

  3. Linux 安装node.js ---- 源码编译的方式

    一 : 普通用户: 安装前准备环境: 1.检查Linux 版本 命令: cat /etc/redhat-release 2.检查 gcc.gcc-c++ 是否安装过 命令: rpm -q gcc rp ...

  4. 烂泥:mysql5.5数据库cmake源码编译安装

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前也写过一篇有关mysql5.0源码编译的文章,该文章为<烂泥:mysql5.0数据库源码编译安装>.但是MySQL自5.5版本以后,就开 ...

  5. Centos7.X 源码编译安装subversion svn1.8.x

    说明:SVN(subversion)的运行方式有两种:一种是基于Apache的http.https网页访问形式:还有一种是基于svnserve的独立服务器模式.SVN的数据存储方式也有两种:一种是在B ...

  6. centos6.5环境源码编译安装mysql5.6.34

    centos6.5环境源码编译安装mysql5.6.34 源码下载地址http://dev.mysql.com/downloads/mysql/5.6.html#downloads 选择Generic ...

  7. centos 6.5源码编译安装subversion 1.8.10

    一.简介 CentOS 6.5的yum源可以安装的SVN客户端版本太低了,1.6.11,所以需要升级到1.8.10,而官网有没有找到1.8.10的安装包,只能选择源码编译安装. 二.安装步骤 参考官网 ...

  8. Linux环境PostgreSQL源码编译安装

    Linux环境PostgreSQL源码编译安装 Linux版本: Red Hat 6.4 PostgreSQL版本: postgresql-9.3.2.tar.gz 数据存放目录: /var/post ...

  9. 源码编译安装LAMP环境及配置基于域名访问的多虚拟主机

    实验环境及软件版本: CentOS版本: 6.6(2.6.32.-504.el6.x86_64) apache版本: apache2.2.27 mysql版本:  Mysql-5.6.23 php版本 ...

随机推荐

  1. 在ASP.NET MVC中创建自定义模块

    创建模块 module是实现了System.Web.IHttpModule接口的类.该接口定义了两个方法: Init:当模块初始化时被调用,传入的参数为HttpApplication对象,用于注册请求 ...

  2. ASP.NET Core部署IIS问题总结

    部署准备工作 1.服务器开启添加IIS相关功能 1.1. 点击windows搜索到   “启用或关闭windows功能” 1.2 选择添加IIS的部分功能, 如下图所示 2.进入IIS,添加已经发布的 ...

  3. Postgresql中无则插入的使用方法INSERT INTO WHERE NOT EXISTS

    一.问题 Postgresql中无则插入的使用方法INSERT INTO WHERE NOT EXISTS,用法请参考样例. 二.解决方案 (1)PostgresSQL INSERT INTO tes ...

  4. 正则表达式,匹配非本站图片网址去掉img标签内容实例

    正则表达式,匹配非本站图片网址去掉img标签内容实例 在线正则表达式测试http://tool.oschina.net/regex/# 测试内容: <div><p>eee< ...

  5. vue-cli的安装及版本查看更新

    vue-cli安装 npm install vue-cli -g vue-cli的版本查看 vue -V vue-cli的3.0+以后使用的不是vue-cli了,如果用以上的安装命令安装的并不是最新版 ...

  6. Apache ActiveMQ 远程代码执行漏洞 (CVE-2016-3088) 复现

    漏洞复现 直接写 shell 写 shell 的话,需要写在 admin 或者 api 中,也就是需要登录,没有密码的话完成不了写 shell 操作. 该环境默认的口令为 admin/admin. 访 ...

  7. LDA-作为线性判别 降维 推导

    LDA 降维原理 前面对 LDA 作为作为分类器 有详细推导, 其核心就是 贝叶斯公式, 已知全概率, 求(条件概率)最大先验概率, 类似的问题. 而 LDA 如果作为 降维 的原理是: a. 将带上 ...

  8. Odoo search 搜索视图详解与搜索视图工作原理

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826430.html 搜索视图 搜索视图的search标签本身没什么属性可以使用,只要是<searc ...

  9. zabbix3.4配置第三方邮件报警

    废话不多说,直接进入主题. 1.安装mailx [root@localhost ~]#yum install malix -y                        #yum安装malix [ ...

  10. Nios II IDE代码优化,quartus ii 11.0版本IDE

    开发Altera Nios II软件可使用Nios II IDE或 Nios II Software BuildTools for Eclipse(即:Nios II SBT for Eclipse) ...