在k8s中部署Gluster类型storageclass - 从入门到放弃篇
本文记录了作者学习K8s 知识时候 决定创建Glusterfs类型的storageclass,最终放弃的过程和其中的一些思考。
k8s的存储系统
历史和设计哲学
存储系统(持续和永久的存储空间,不随容器或者pod的生命周期而消亡)对于任何一个规模的容器编排系统,对任何一个又状态的所谓stateful application来说都是必不可少的。
对于k8s. 存储系统的管理也经历了从“in-tree”模式到解耦,只和第三方存储插件结合的CSI(容器存储接口)模式。
关于k8s用CSI CRI CNI等插件管理接口直接对接不同的海量的第三方插件和实现,这其中的原因和设计哲学就不用多讲了吧。
对于k8s, 每一次要弃用(deprecated)某个功能,总是先在某个版本开始deprecated,然后在其后的大约4次迭代后彻底removed。 对Glusterfs类型的volume,在1.22 deprecated,在1.26 removal的。
常见存储系统
常见的k8s下的存储可以有HostPath NFS Glusterfs 和 Cephfs等等。
对于在虚拟机上建集群玩k8s的人来说,通常可以用最简单的hostpath,也就是本地存储。
但如果你想稍微深入的学习和测试一点CSI,你可能需要在 NFS Glusterfs 和 Cephfs 等之间选一个。
对于我来说,Ceph太重了,对象存储 文件系统和裸盘设备的支持一个不拉。部署也需要很多的虚拟机,就先放弃了。
而NFS之前也多次部署过。这次想先试试Glusterfs。
Glusterfs
Glusterfs 是个开源的分布式的高可用的文件系统,支持水平扩展,支持大文件,用来做k8s的存储方案是比较合适的。
测试环境,我只选用了一台做非高可用的Glusterfs server,k8s的worker nodes 安装Glusterfs client,然后再mount Glusterfs 创建的volume。 特殊情况下,你也可以通过NFS的方式将Glusterfs下的volume发布出来,这样不需要安装Glusterfs client在各个worker nodes上,兼容性也会更好, 坏处是牺牲一定的性能。
以下是文件服务器安装Glusterfs server的步骤。
如果你也想测试下,请不要选择RHEL系的Linux,因为Redhat只支持自己的亲儿子Ceph,早就放弃了对Glusterfs的支持。请选择用Debian系。
最新的Debian12 Bookworm 自有apt source有Gluster 10.x版本,只比官方最新版低了一个版本号,所以最好直接apt install装以下。
Server端:
sudo apt install -y glusterfs-server # 安装glusterfs
sudo mkdir -p /data/glusterfs/brick1 # 创建目录
sudo gluster volume create myvolume 192.168.x.x:/data/glusterfs/brick1 force
#myvolume:卷的名称,你可以自定义。
#l192.168.x.x:/data/glusterfs/brick1:brick 的位置,localhost 表示本地服务器,/data/glusterfs/brick1 是之前创建的目录。
#对于创建的Glusterfs目录和/ 目录在一个磁盘分区partation的情况下,是非常不讲究的,要用force参数强迫Glusterfs接受 ^_.
sudo gluster volume start myvolume #开始启用volume
Client端:
apt install glusterfs-client
sudo mkdir -p /mnt/glusterfs
sudo mount -t glusterfs 192.168.80.223:/myvolume /mnt/glusterfs
至此Glusterfs的搭建完毕。
k8s是如何调用Glusterfs系统给pod用的 ?
k8s在通过daemonset或者deployment时候,通过PVC(Persistent Volume Claim)声明对PV的使用。理论上,每次通过PVC申请使用PV时,必须先手动的建好PV(大小和PVC声明的一致,其他参数也一样)。不然,PVC由于没有PV可用,整个container的创建就会卡住。
k8s通过Storage Class 这样一种资源来动态的根据PVC来自动生成相应的PV并binding到pod上。这样一来就需要有一个controller 或者叫provisioner 或者operator的东西来自动根据PVC来生成PV。
我懒得画图。说的有点乱了。
以用Glusterfs来做pod的永久存储系统,并且想让整个过程自动化,根据PVC自动生成相应的Glusterfs volume并绑定给pod或者container为例:
需要准备好的资源
- 一套测试可用的Glusterfs 文件系统,确保作为Glusterfs client的k8s worker nodes 可用访问(已完成)
- 定义Storage Class,类型为Glusterfs。
- 在创建deployment时,定义PVC,规定PVC调用Glusterfs的那个Storage Class来完成PV的创建和自动绑定。
其中最重要的显然是第二步,具体的第二部可用分解为以下步骤。
2.1 安装Heketi 作为自动和动态创建PV的positioner,并确保Heketi某个端口监听。
2.1.1 下载Heketi 相关的yaml文件,创建heketi服务
(建议不要使用Helm安装,Helm官方没有,其他第三方我也没找到相关的charts)
2.1.2 创建相关Storage Class。
以上为全部正文,我主要是给自己理清思路的, 对初学刚掌握概念的k8s运维来说,应该也是非常有用的。
下面我贴出大体的实现2.1.1 和2.1.2 的具体过程,我自己没有全部完成 放弃了,坑太对,我看了下Glusterfs官方的github repo,也有最长9年没更新了,社区活跃度可想而知。 所以遇到坑后就直接从入门到放弃了。(千万别学我)
Appendix:
安装Heketi
git clone https://github.com/heketi/heketi.git #先下载
cd heketi/extras/kubernetes #进入到和kubernets有关目录
kubectl apply -f secret-heketi.yaml #先创建相关的secret用于kubernets访问Heketi服务的凭证,user 和 key的 base64 值提前生成好。
apiVersion: v1
kind: Secret
metadata:
name: heketi-secret
namespace: default
type: Opaque
data:
user: YWRtaW4= # base64(admin)
key: aml1YnVnYW9zdW5p # base64(jiubugaosuni),重要或者生产里要用的不要随便贴出来哦
kubectl apply -f heketi-service-account.json #再创建运行相关的service account。
kubectl apply -f heketi-deployment.json
#生成相关deployment时候给了报错了一大堆, 放弃排错。
别忘了delete掉相关的已经生成的k8s资源, 以便保持k8s的干净!!!
更多推荐



所有评论(0)