本文记录了作者学习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为例:
需要准备好的资源

  1. 一套测试可用的Glusterfs 文件系统,确保作为Glusterfs client的k8s worker nodes 可用访问(已完成)
  2. 定义Storage Class,类型为Glusterfs。
  3. 在创建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的干净!!!

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐