Kubernetes存储——glusterfs(集群)
一、搭建 glusterfs(集群)版本:gluster-9
1.1 服务器规划
master(k8s集群) | node1(k8s集群) | node2(k8s集群) |
---|---|---|
192.168.99.201 | 192.168.99.202 | 192.168.99.203 |
glusterfs 服务端 | glusterfs 服务端 | glusterfs 服务端 | glusterfs 服务端 |
---|---|---|---|
192.168.99.204 | 192.168.99.205 | 192.168.99.206 | 192.168.99.207 |
1.2 环境准备
glusterfs 服务端 + 客户端配glusterfs官方yum源
$ yum install centos-release-gluster -y
glusterfs 服务端
$ yum install glusterfs-server -y # 所有服务端节点安装glusterfs-server $ systemctl enable glusterd --now $ systemctl status glusterd
# 4个storage服务器建立连接不用两两连接,只需要找其中1个,连接另外3个各一次就OK了 # 这里在storage-01上操作 [root@storage-01 ~]# gluster peer probe storage-02 [root@storage-01 ~]# gluster peer probe storage-03 [root@storage-01 ~]# gluster peer probe storage-04 $ gluster peer status # 在所有服务端上都可以使用该命令来验证检查
注意:
- 如果这一步建立连接有问题(一般问题会出现在网络连接、防火墙、selinux、主机名绑定等)
- 如果想重做这一步,可以使用
gluster peer detach xxxxx [force]
来断开连接,重新做
所有storage服务器准备存储目录(可以用单独的分区,也可以使用根分区)
# 这里的storage服务器没有准备额外的硬盘,所以这里用根分区来做实验 但生产环境肯定是不建议数据盘和系统盘在一起的 $ mkdir -p /data/gv0
1.3 gluster模式
1.3.1 replica模式
$ gluster volume create gv0 replica 4 storage-01:/data/gv0/ storage-02:/data/gv0/ storage-03:/data/gv0/ storage-04:/data/gv0/ force $ gluster volume info gv0 $ gluster volume start gv0 $ gluster volume info gv0
glusterfs 客户端
replica卷测试(读写测试)
这里直接使用(k8s集群)node01 + node02 来测试
$ yum install centos-release-gluster -y $ yum install glusterfs glusterfs-fuse -y
[root@k8s-node01 ~]# mkdir /test1 # 挂载前需要解析(配置/etc/hosts) [root@k8s-node01 ~]# mount -t glusterfs storage-01:/gv0 /test1 [root@k8s-node01 ~]# df -h | tail -1
客户端也需要在/etc/hosts文件里绑定存储节点的主机名,才可以挂载
这里client是挂载storage-01,也可以挂载storage-02,storage-03任意一个。(也就是说这3个storage 既是老板,又是员工。这是glusterfs的一个特点,其它的分布式存储软件基本上都会有专门的管理server)
在客户端使用dd命令往挂载目录里写文件,然后查看在storage服务器上的分布情况!
$ dd if=/dev/zero of=/test1/file1 bs=1M count=100
读写操作请都在客户端进行,不要在storage服务器上操作
读写测试结果:结果类似raid1
同读同写测试:两个(多个)客户端挂载后实现同读同写(文件存储类型的特点)!
[root@k8s-node02 ~]# mkdir /test2 # 挂载前需要解析(配置/etc/hosts) [root@k8s-node02 ~]# mount -t glusterfs storage-01:/gv0 /test2 [root@k8s-node02 ~]# df -h | tail -1 [root@k8s-node02 ~]# dd if=/dev/zero of=/test2/file1 bs=1M count=100
[root@k8s-node01 ~]# rm /test1/* -rf [root@k8s-node01 ~]# umount /test1 [root@k8s-node02 ~]# rm /test2/* -rf [root@k8s-node02 ~]# umount /test2
在任意一个storage服务器上停止gv0并删除,这里是在storage-01上操作!
[root@storage-01 ~]# gluster volume stop gv0 [root@storage-01 ~]# gluster volume delete gv0 [root@storage-01 ~]# gluster volume info
1.3.2 stripe模式(新版本已废弃)
做成 stripe模式的卷(重点是命令里的 stripe 4参数)
$ gluster volume create gv0 stripe 4 storage-01:/data/gv0/ storage-02:/data/gv0/ storage-03:/data/gv0/ storage-04:/data/gv0/ force
读写测试结果:文件过小,不会平均分配给存储节点。有一定大小的文件会平均分配。类似raid0。
1.3.3 distributed 模式
创建 distributed卷 gv1(不指定 replica 或 stripe 就默认是 distributed 的模式!
$ mkdir -p /data/gv1 $ gluster volume create gv1 storage-01:/data/gv1/ storage-02:/data/gv1/ storage-03:/data/gv1/ storage-04:/data/gv1/ force $ gluster volume start gv1 $ gluster volume info gv1 # 客户端挂载 $ mkdir /test1 $ mount -t glusterfs storage-01:/gv1 /test1
读写测试结果: 写满第一个存储后,再写第二个存储(顺序是随机的)!
1.3.4 distributed-replica 模式
$ mkdir -p /data/gv2 $ gluster volume create gv2 replica 2 storage-01:/data/gv2/ storage-02:/data/gv2/ storage-03:/data/gv2/ storage-04:/data/gv2/ force $ gluster volume start gv2 $ gluster volume info gv2 # 客户端挂载 $ mkdir /test2 $ mount -t glusterfs storage-01:/gv2 /test2
读写测试结果:4个存储先写其中2个(并在这两个存储里镜像),写满这两个后, 再按相同方式写另2个存储。
1.3.5 disperse 模式
$ mkdir -p /data/gv3 $ gluster volume create gv3 disperse 4 storage-01:/data/gv3/ storage-02:/data/gv3/ storage-03:/data/gv3/ storage-04:/data/gv3/ force # 注意:没有指定冗余值,默认为1,按y确认 $ gluster volume start gv3 $ gluster volume info gv3 # Number of Bricks: 1 x (3 + 1) = 4 这里看到冗余数为1 # 客户端挂载 $ mkdir /test3 $ mount -t glusterfs storage-01:/gv3 /test3
读写测试结果: 写100M,每个存储服务器上占33M左右。因为4个存储1个为冗余(与raid5一样)
1.3.6 在线裁减与在线扩容
在线裁减要看是哪一种模式的卷,比如 stripe 模式就不允许在线裁减。下面以distributed卷来做裁减与扩容!
在线裁减(注意要remove没有数据的brick)
$ gluster volume remove-brick gv1 storage-04:/data/gv1 force
在线扩容
$ gluster volume add-brick gv1 storage-04:/data/gv1 force
二、配置 k8s 使用 glusterfs 持久化存储
2.1 直接使用glusterfs作为存储卷
$ cat > glusterfs-cluster.yaml << EOF apiVersion: v1 kind: Endpoints metadata: name: glusterfs-cluster namespace: default subsets: - addresses: - ip: 192.168.99.204 - ip: 192.168.99.205 - ip: 192.168.99.206 - ip: 192.168.99.207 ports: - port: 49152 protocol: TCP EOF $ cat > nginx_deployment_test.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-test spec: replicas: 3 selector: matchLabels: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: storage001 mountPath: "/usr/share/nginx/html" volumes: - name: storage001 glusterfs: endpoints: glusterfs-cluster path: gv0 # 修改 readOnly: false EOF
2.2 使用静态pv+pvc
$ cat > glusterfs-pv.yaml << EOF apiVersion: v1 kind: PersistentVolume metadata: name: glusterfs-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteMany glusterfs: endpoints: glusterfs-cluster path: gv1 # 修改 readOnly: false EOF $ cat > glusterfs-pvc.yaml << EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: glusterfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 2Gi EOF $ cat > nginx_deployment.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: name: nginx template: metadata: labels: name: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: storage001 mountPath: "/usr/share/nginx/html" volumes: - name: storage001 persistentVolumeClaim: claimName: glusterfs-pvc EOF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律