文章目录
- 1、二进制部署
- 1.1 安装yum源
- 1.2 准备服务器
- 1.3 添加本地解析
- 1.4关闭防火墙及selinux
- 1.5 加载内核模块
- 1.6 格式化分区和挂载brick
- 1.7 安装GlusterFS
- 1.8 iptables配置
- 1.9 配置可信任池
- 1.10 设置GlusterFS卷
- 1.11 测试volume卷
- 2、使用heketi将二进制GlusterFS集群作为k8s持久化存储
GlusterFS可支持多种部署方式,二进制部署,kubernetes部署,docker部署等等
1、二进制部署
GlusterFS二进制部署可支持Debian、Ubuntu、Redhat/Centos、Fedora、Arch Linux等多种Linux发行版,在此以国内使用最多的Centos发行版演示GlusterFS二进制部署流程
1.1 安装yum源
对于可公网访问环境,推荐使用yum安装方式,简单便捷,解决依赖;对于内网限制环境,可将RPM包提前下载准备好,进行自行安装。
以centos7为例:
yum install centos-release-gluster -y
1.2 准备服务器
- 准备至少两台centos7服务器,数量越多可实现的卷类型越丰富
- 主机之间网络互通
- 每台主机至少两块硬盘,一块用于操作系统安装,另一块用于Gluster数据存储(数据盘可挂载多个,提高性能),防止系统盘损坏数据丢失,也是避免系统盘和数据盘发生IO抢占。
注意:GlusterFS将其动态生成的配置文件存储在/var/lib/glusterd中,如果在任何时间点GlusterFS无法写入这些文件,它会导致您的GlusterFS系统出现问题,或者让系统脱机,建议为/var/lib/glusterd,/var/log等这些目录单独创建分区以防发生这种问题。
1.3 添加本地解析
添加服务器本地解析
192.168.1.x server1
192.168.1.x server2
192.168.1.x server3
1.4关闭防火墙及selinux
Cenos6: systemctl stop iptables ;chkconfig iptables offCentos7: systemctl stop firewalld;systemctl disable firewalld/etc/selinux/configSELINUX=disabled
1.5 加载内核模块
modprobe dm_snapshot
modprobe dm_mirror
modprobe dm_thin_pool
1.6 格式化分区和挂载brick
对于文件系统类型,推荐使用性能更好的xfs或者ext4
以下命令在每台节点上操作
fdisk /dev/sdb
mkfs.xfs -i size=512 /dev/sdb1
mkdir -p /bricks/brick1
echo -n /dev/sdb1 /bricks/brick1 xfs defaults 1 2 >> /etc/fstab
mount -a && mount
现在看到sdb1 挂载到/bricks/brick1
注意:在centos6上,需要安装xfsprogs包以支持格式化XFS文件系统
yum install xfsprogs
1.7 安装GlusterFS
在每台节点上安装
yum install GlusterFS-server -y
在centos8上安装时需要启动PowerTools源
dnf --enablerepo=powertools install GlusterFS-server
启动GlusterFS进程
systemctl start glusterd && systemctl enable glusterd
1.8 iptables配置
您可以使用iptables规则运行GlusterFS,但需要注意的是,默认情况下,glusterd将在tcp/24007上侦听,但在glusterd节点上打开该端口是不够的,每次添加brick时,它都会打开一个新端口(您可以通过“gluster volume status”查看)
根据您的设计,最好为 gluster/存储流量使用专用 NIC,因此通过您的 netfilter 解决方案“信任”nic/subnet/gluster 节点(CentOS 6 的 /etc/sysconfig/iptables 和 firewalld/firewall -cmd)
对于安全性要求不是非常高的使用场景,推荐关闭firewalld
1.9 配置可信任池
在任意一台机器执行以下命令:
gluster peer probe server2
gluster peer probe server3
在其中一台主机添加不在信任池中的其他主机
例如在server1上执行命令添加server2,server3主机
注意:一旦建立了信任池,只有受信任的成员可以将新服务器添加到池中,新服务器无法自行添加到信任池
1.10 设置GlusterFS卷
在server1和server2上执行以下命令
mkdir /bricks/brick1/gv0
在任意一台服务器执行:
gluster volume create gv0 replica 2 server1:/bricks/brick1/gv0 server2:/bricks/brick1/gv0
gluster volume start gv0
查看volume信息确保volume启动了
gluster volume info
注意:如果卷未启动,则有关出错的线索将在一台或两台服务器上/var/log/GlusterFS下的日志文件中 - 通常在etc-GlusterFS-glusterd.vol.log
1.11 测试volume卷
在任意一台主机挂载volume测试mount -t GlusterFS server1:/gv0 /mntfor i in `seq -w 1 100`; do cp -rp /var/log/messages /mnt/copy-test-$i; done首先检查挂载点ls -lA /mnt | wc -l
您应该看到返回了 100 个文件。接下来,检查每台服务器上的 GlusterFS 挂载点:ls -lA /bricks/brick1/gv0
2、使用heketi将二进制GlusterFS集群作为k8s持久化存储
在上一节安装完GlusterFS集群后,我们需要使用heketi将GlusterFS接入到k8s,作为后端持久化存储。heketi是一个GlusterFS管理软件,可以管理GlusterFS集群的卷创建、删除等操作
heketi管理GlusterFS集群需要注意:
- GlusterFS集群的各peer必须要有未安装文件系统的磁盘设备(磁盘设备未进行格式化)
- GlusterFS集群各peer的端口号不能太少,不然当peer上的brick将端口号用完后,会造成无法创建卷。
- GlusterFS的各peer不能组成集群,heketi可以自创建集群集合。
步骤:
- 准备磁盘
如果是使用的全部磁盘,则磁盘不需要分区,直接使用/dev/sdb
如果使用磁盘的部分空间,则需要对磁盘分区,使用/dev/sdb1
上一节我们使用/dev/sdb并进行了分区,因此我们需要将磁盘分区删除,并将磁盘数据清除,否则heketi将拒绝使用该磁盘
umount /bricks/brick1fdisk /dev/sdb d w #删除分区wipefs -a /dev/sdb #清除磁盘数据及信息
注意⚠️:如果您使用的是另一块未格式化的新磁盘,上面的三个命令无需执行
-
安装heketi(在集群中任选一个节点安装)
yum install heketi heketi-client -
生成密钥并配置免密
# ssh-keygen -t rsa -q -f /etc/heketi/private_key -N ""# ssh-copy-id -i /etc/heketi/private_key.pub GlusterFS-node01# ssh-copy-id -i /etc/heketi/private_key.pub GlusterFS-node02# ssh-copy-id -i /etc/heketi/private_key.pub GlusterFS-node03# chown heketi.heketi /etc/heketi/private_key
- 配置heketi
vi /etc/heketi/heketi.json{"_port_comment": "Heketi Server Port Number","port": “48080", #改为48080或其他端口"_use_auth": "Enable JWT authorization. Please enable for deployment","use_auth": true, #改为true"_jwt": "Private keys for access","jwt": {"_admin": "Admin has access to all APIs","admin": {"key": "admin@password" #用于heketi认证的admin用户及密码},"_user": "User only has access to /volumes endpoint","user": {"key": "user@password" #用于heketi认证的user用户及密码,可以不配置}},"_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",#改为ssh"_sshexec_comment": "SSH username and private key file information","sshexec": {"keyfile": "/etc/heketi/private_key","user": "root", #若这里使用root用户,则GlusterFS的机器之间不能禁用root"port": "22", "fstab": "/etc/fstab"},"_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": "OpenShift project or Kubernetes namespace","fstab": "Optional: Specify fstab file on node. Default is /etc/fstab"},"_db_comment": "Database file name","db": "/var/lib/heketi/heketi.db","_loglevel_comment": ["Set log level. Choices are:"," none, critical, error, warning, info, debug","Default is warning"],"loglevel" : "debug"}
}
将默认配置文件参考上述配置进行修改
- 启动并测试heketi
systemctl enable heketi.service && systemctl start heketi.service
测试连通性
curl http://GlusterFS-node01:48080/helloHello from Heketi #返回结果
- 配置topology
vi /etc/heketi/topology.json #配置三个节点的使用信息,这里/dev/sdb表示后端存储所要使用的数据盘
{"clusters": [{"nodes": [{"node": {"hostnames": {"manage": [“10.140.xx.xx”],"storage": ["10.140.xx.xx"]},"zone": 1},"devices": ["/dev/sdb"]},{"node": {"hostnames": {"manage": ["10.140.xx.xx"],"storage": ["10.140.xx.xx"]},"zone": 1},"devices": ["/dev/sdb"]},{"node": {"hostnames": {"manage": ["10.139.xx.xx"],"storage": ["10.139.xx.xx"]},"zone": 1},"devices": ["/dev/sdb"]}]}]
}
- 配置环境变量,方便操作
echo “export HEKETI_CLI_SERVER=http://10.140.xx.xx:48080” >> /etc/profile.d/heketi.sh #heketi地址
echo “alias heketi-cli=‘heketi-cli --server “$HEKETI_CLI_SERVER” --user admin --secret admin@password” >> ~/.bashrc #heketi用户密码
source /etc/profile.d/heketi.sh
source ~/.bashrc
- 创建集群
heketi-cli topology load --json=/etc/heketi/topology.json
- 查看集群信息
heketi-cli cluster list
heketi-cli cluster info xxxx #xxxx为上条命令返回的id
heketi-cli node list
创建volume测试
heketi-cli volume create --size=2 --replica=3
heketi-cli volume list
mount -t GlusterFS 10.140.xx.xx:vol_4f1a171ab06adf80460c84f2132e96e0 /mnt
heketi-cli volume delete 4f1a171ab06adf80460c84f2132e96e0
- k8s接入heketi
所有的k8s节点均安装GlusterFS-fuse,以保证正常使用
yum install GlusterFS-fuse -y
创建secret,heketi的认证密码,或者在kebesphere平台添加密钥
apiVersion: v1
kind: Secret
metadata:name: heketi-secretnamespace: kube-system
data:key: YWRtaW5AUEBzc1cwcmQ=
type: kubernetes.io/GlusterFSkey的值,使用base64转码生成echo -n "admin@password" | base64 这里的用户名密码为heketi配置文件中创建的用户密码创建storageclass(heketi-storageclass.yaml)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: GlusterFSnamespace: kube-system
parameters:resturl: “http://10.140.xx.xx:48080” #heketi的地址clusterid: "cca360f44db482f03297a151886eea19" #在heketi节点使用heketi-cli cluster list命令返回的idrestauthenabled: "true" restuser: "admin" #heketi配置文件中创建的用户密secretName: "heketi-secret" # name/namespace与secret资源中定义一致secretNamespace: "kube-system"volumetype: "replicate:3"
provisioner: kubernetes.io/GlusterFS
reclaimPolicy: Delete创建pvc测试
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: heketi-pvcannotations:volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/GlusterFS
spec:storageClassName: "GlusterFS"accessModes:- ReadWriteOnceresources:requests:storage: 1Gi查看sc和pvc的信息
kubectl get sc
kubectl get pvc
创建Pod挂载pvc(heketi-pod.yaml)
kind: Pod
apiVersion: v1
metadata:name: heketi-pod
spec:containers:- name: heketi-containerimage: busyboxcommand:- sleep- "3600"volumeMounts:- name: heketi-volumemountPath: "/pv-data"readOnly: falsevolumes:- name: heketi-volumepersistentVolumeClaim:claimName: heketi-pvc进入容器测试
kubectl exec -it heketi-pod /bin/sh