k8s中使用glusterfs
k8s中使用glusterfs
静态手动管理glusterfs
这种方式是手动管理volume。假设在k8s上部署一个使用gluster存储的应用,如果使用之前应用的volume,能看到其他应用的数据,多个应用之间的数据应该是隔离的,也就是权限问题,同时,大概率导致文件命名冲突问题。pv(c)中设置的容量capacity也无法控制。基本上处于不可用。
通过heketi来动态管理glusterfs
- heketi调度分配gluster的存储调度算法
- pv 回收策略
The deletion of the PV is done via the Kubernetes reclaim policy, which by default deletes the PV when the claim is no longer valid (thereby deleting the data, making it irrecoverable). This policy can be dealt with via the persistentVolumeReclaimPolicy field. The default value is nice because it results in Kubernetes garbage collecting our unused volumes, saving us from wasted space across the cluster.
通过heketi 提供的一些列REST API接口来动态管理gluster集群。
实现方式为:通过lvcreate命令创建一个逻辑卷(logical volume)lv1,mkfs.xfs格式化为xfs格式,然后挂载到路径/var/lib/heketi/mounts/卷组name/lv1并写入到/etc/fstab中,确保开机自动挂载。
这种方式的好处是1.实现了不同应用之间的数据的隔离性2.pvc中的capacity做到了限制。推荐使用。
QA
在使用heketi过程中遇到的一些问题记录一下:
-
mount: permission denied
a: docker启动的时候加上参数 --privileged=true,也可以在k8s 的yaml文件中配置该项
-
could not open the file /proc/sys/net/ipv4/ip_local_reserved_ports for getting reserved ports info [No such file or directory] Not able to get reserved ports, hence there is a possibility that glusterfs may consume reserved port
a: 这种错误是我在使用mock这种方式的时候出现的,通过heketi-cli 命令可以看到volume确实存在,可是在gluster 集群中却看不到,很坑,后来我采用了ssh这种方式
-
Unable to add device: Device /bricks/heketi001 not found (or ignored by filtering)
a: 首先确保device存在,然后在文件/etc/lvm/lvm.conf中将
filter = [ "a|.*/|" ]
取消掉注释,运行接受所有block,然后systemctl restart lvm2-lvmetad.service
重启lvm,使配置生效 -
Can't open /dev/sdb exclusively. Mounted filesystem?
a: heketi只管理没有文件系统的裸盘,如果你的机器上的磁盘的文件系统是xfs或者是ext4,可以执行
pvcreate --metadatasize=128M --dataalignment=256K /dev/sdb
将磁盘格式化成LVM2形式,那么就没问题了,这个问题困扰了我好久 -
heketi服务启动不了怎么办
a: 设置环境变量
HEKETI_IGNORE_STALE_OPERATIONS=true
,然后再启动
cmd
列一些过程中常用的一些命令
fdisk -l /dev/sdb
lsblk
lvdisplay
lvs
lvrecreate/lvremove
lvm
lvmconfig
vgs
lvs
参考资料
persistent-volumes-with-glusterfs
独立部署GlusterFS+Heketi实现Kubernetes共享存储
转载请标明出处