k8s中的StorageClass用于定义和配置持久卷(Persistent Volume)的资源对象。StorageClass 提供了一种抽象层,使得管理员能够定义不同类型的存储和访问模式,并将其提供给应用程序开发人员使用。
我们将重点讨论如何使用 GlusterFS 搭建一个可靠的存储解决方案,以供 Kubernetes 集群使用。
1.服务器列表:
172.18.1.52
172.18.1.53
172.18.1.54
2.安装yum源
复制
1. wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-9.repo
3.安装glusterfs服务端
在三个节点分别执行
复制
1. yum -y install centos-release-gluster5.noarch
2. yum -y install glusterfs-server
设置开机启动,并启动
在三个节点分别执行
复制
1. systemctl start glusterd
2. systemctl status glusterd
3. systemctl enable glusterd
关闭节点防火墙
在三个节点分别执行
复制
1. systemctl stop firewalld
组建集群
在172.18.1.52服务器上执行以下命令:
复制
1. #IP地址为其他集群节点的IP,多个ip执行多次
2. gluster peer probe 172.18.1.53
3. gluster peer probe 172.18.1.54
查看集群状态
复制
1. gluster peer status
4.heketi安装
Heketi 是一个用于管理和配置 GlusterFS 分布式文件系统的开源项目,Heketi的主要目标是简化 GlusterFS 的管理和配置。它提供了一个 RESTful API,使用户能够轻松地创建、调整和删除 GlusterFS 卷
设置免密登录glusterfs node节点
复制
1. ssh-keygen -t rsa
2. ssh-copy-id -p 22 root@172.18.1.52
3. ssh-copy-id -p 22 root@172.18.1.53
4. ssh-copy-id -p 22 root@172.18.1.54
安装heketi
在172.18.1.52执行
复制
1. yum install -y heketi heketi-client
修改heketi 配置文件
访问/etc/heketi/heketi.json,并修改
修改启动文件/usr/lib/systemd/system/heketi.service,否则启动报错
执行以下命令
复制
1. systemctl daemon-reload
2. systemctl enable heketi
3. systemctl start heketi
验证是否启动成功
返回 Hello from Heketi 则成功
复制
1. curl -s 127.0.0.1:8080/hello | awk '{print $0}'
使用heketi创建glusterfs集群
执行fdisk -l查看可挂载磁盘,可以看到/dev/vdb为未挂载
创建 /etc/heketi/heketi-topology.json,配置内容如下:
复制
1. # 通过topology.json文件定义组建GlusterFS集群;
2. # topology指定了层级关系:clusters-->nodes-->node/devices-->hostnames/zone;
3. # node/hostnames字段的manage填写主机ip,指管理通道,在heketi服务器不能通过hostname访问GlusterFS节点时不能填写hostname;
4. # node/hostnames字段的storage填写主机ip,指存储数据通道,与manage可以不一样;
5. # node/zone字段指定了node所处的故障域,heketi通过跨故障域创建副本,提高数据高可用性质,如可以通过rack的不同区分zone值,创建跨机架的故障域;
6. # devices字段指定GlusterFS各节点的盘符(可以是多块盘),必须是未创建文件系统的裸设备
7.
8. {
9. "clusters": [
10. {
11. "nodes": [
12. {
13. "node": {
14. "hostnames": {
15. "manage": [
16. "172.18.1.52"
17. ],
18. "storage": [
19. "172.18.1.52"
20. ]
21. },
22. "zone": 1
23. },
24. "devices": [
25. "/dev/vdb"
26. ]
27. },
28. {
29. "node": {
30. "hostnames": {
31. "manage": [
32. "172.18.1.53"
33. ],
34. "storage": [
35. "172.18.1.53"
36. ]
37. },
38. "zone": 2
39. },
40. "devices": [
41. "/dev/vdb"
42. ]
43. },
44. {
45. "node": {
46. "hostnames": {
47. "manage": [
48. "172.18.1.54"
49. ],
50. "storage": [
51. "172.18.1.54"
52. ]
53. },
54. "zone": 3
55. },
56. "devices": [
57. "/dev/vdb"
58. ]
59. }
60. ]
61. }
62. ]
63. }
执行以下命令创建集群
复制
1. heketi-cli --user=admin --secret=12123 --server http://127.0.0.1:8080 topology load --json=/etc/heketi/heketi-topology.json
5.创建k8s StorageClass
k8s中的StorageClass用于定义和配置持久卷(Persistent Volume)的资源对象。StorageClass 提供了一种抽象层,使得管理员能够定义不同类型的存储和访问模式,并将其提供给应用程序开发人员使用。
创建gfs-secret.yaml
执行echo -n "mypassword" | base64,对上面配置的admin密码进行加密,并修改key值
复制
1. apiVersion: v1
2. kind: Secret
3. metadata:
4. name: heketi-secret
5. namespace: default
6. data:
7. # base64 encoded password. E.g.: echo -n "mypassword" | base64
8. key: c2dqcHJvZDIwMjMxcWF6
9. type: kubernetes.io/glusterfs
创建gfs-StorageClass.yaml
创建gfs-StorageClass.yaml需要提前准备以下两个参数
resturl值为搭建好之后的heketi接口地址http://172.18.1.52:8080
clusterid值,获取方式如下
复制
1. heketi-cli --user=admin --secret=1212 --server http://127.0.0.1:8080 cluster list
最终我们的配置文件如下
复制
1. apiVersion: storage.k8s.io/v1
2. kind: StorageClass
3. metadata:
4. name: gfs-storage
5. provisioner: kubernetes.io/glusterfs
6. parameters:
7. # resturl 是第二步搭建好之后的heketi 接口地址
8. resturl: "http://172.18.1.52:8080"
9. # Clusterid 必填
10. clusterid: "caf83363937a99eccfd1e1c03112fd2d"
11. restuser: "admin"
12. secretNamespace: "default"
13. secretName: "heketi-secret"
14. gidMin: "40000"
15. gidMax: "50000"
16. # volumetype: "none"
17. volumenameprefix: "gfs"
执行以下命令部署到k8s集群
执行以下命令
复制
1. kubectl apply -f gfs-secret.yaml
2. kubectl apply -f gfs-StorageClass.yaml
查询创建结果
复制
1. kubectl get secret
2. kubectl get sc
以上结果表明,创建成功
6.测试
下面我们部署一个spring boot工程,并把日志文件挂载到gfs中
新建backend-log-pvc.yaml
复制
1. kind: PersistentVolumeClaim
2. apiVersion: v1
3. metadata:
4. name: backend-log-pvc
5. spec:
6. accessModes:
7. - ReadWriteMany
8. resources:
9. requests:
10. storage: 5Gi
11. storageClassName: gfs-storage
新建backend-dp.yaml
复制
1. apiVersion: apps/v1
2. kind: Deployment
3. metadata:
4. name: backend
5. spec:
6. selector:
7. matchLabels:
8. app: backend
9. replicas: 1
10. template:
11. metadata:
12. labels:
13. app: backend
14. version: latest
15. spec:
16. containers:
17. - name: backend
18. image: "dweizhao/backend:latest"
19. imagePullPolicy: Always
20. resources:
21. limits:
22. cpu: 1000m
23. memory: 1G
24. requests:
25. cpu: 1m
26. memory: 200M
27. volumeMounts:
28. - mountPath: /data/web_log/java/backend
29. name: web-log
30. volumes:
31. - name: web-log
32. persistentVolumeClaim:
33. claimName: backend-log-pvc
部署
复制
1. kubectl apply -f backend-log-pvc.yaml
2. kubectl apply -f backend-dp.yaml
部署完成以后,查看pv与系统日志看到挂载成功
验证挂载是否成功
登录文件服务器,执行df -h查看挂载日志文件,如下所图
由于挂载名称无法识别,导致无法定位目标文件,因此执行mount.sh(辅助命令章节)脚本,把fs卷挂载到/data/web_log/目录下并以namespace+pvcName命名,如下图执行完脚本,进入/data/web_log/default_backend-log-pvc目录,查看挂载日志
7.辅助命令
mount.sh
在heketi节点上执行以下命令,把fs卷挂载到/data/web_log/目录下,用于查询一些日志 脚本如下:
复制
1. #/bin/sh
2. VolumeList=$(heketi-cli --user=admin --secret=1212 --server http://127.0.0.1:8080 volume list | awk -F ':' '{print $NF}')
3. for Volume in ${VolumeList[@]}; do
4. MountDir=$(echo $Volume | awk -F '_' '{for(i=2;i
5.
6. # 检查文件夹是否存在
7. if [ ! -d "/data/web_log/$MountDir" ]; then
8. mkdir -p "/data/web_log/$MountDir"
9. echo "create dir /data/web_log/$MountDir"
10. mount -t glusterfs "127.0.0.1:$Volume" "/data/web_log/$MountDir"
11. else
12. echo "Already dir /data/web_log/$MountDir"
13. fi
14. done
初始化磁盘数据
复制
1. pvremove /dev/vdb --force --force
来源: 今日头条
>>>>>>点击进入云计算专题
¥99.00
¥10500.00
¥499.00
¥499.00