我们将重点讨论如何使用 GlusterFS 搭建一个可靠的存储解决方案,以供 Kubernetes 集群使用。

1.服务器列表:

172.18.1.52172.18.1.53172.18.1.54

2.安装yum源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-9.repo

3.安装glusterfs服务端

在三个节点分别执行

yum -y install centos-release-gluster5.noarchyum -y install glusterfs-server

设置开机启动,并启动

在三个节点分别执行

systemctl start glusterd systemctl status glusterd systemctl enable glusterd

关闭节点防火墙

在三个节点分别执行

systemctl stop firewalld

组建集群

在172.18.1.52服务器上执行以下命令:

#IP地址为其他集群节点的IP,多个ip执行多次gluster peer probe  172.18.1.53  gluster peer probe  172.18.1.54

查看集群状态

gluster peer status

4.heketi安装

Heketi 是一个用于管理和配置 GlusterFS 分布式文件系统的开源项目,Heketi的主要目标是简化 GlusterFS 的管理和配置。它提供了一个 RESTful API,使用户能够轻松地创建、调整和删除 GlusterFS 卷

设置免密登录glusterfs node节点

ssh-keygen -t rsassh-copy-id -p 22 [email protected]ssh-copy-id -p 22 [email protected]ssh-copy-id -p 22 [email protected]

安装heketi

在172.18.1.52执行

yum install  -y heketi heketi-client

修改heketi 配置文件

访问/etc/heketi/heketi.json,并修改

修改启动文件/usr/lib/systemd/system/heketi.service,否则启动报错

执行以下命令

systemctl daemon-reload systemctl enable heketi systemctl start heketi

验证是否启动成功

返回Hello from Heketi则成功

curl -s 127.0.0.1:8080/hello | awk '{print $0}'

使用heketi创建glusterfs集群

执行fdisk -l查看可挂载磁盘,可以看到/dev/vdb为未挂载

创建/etc/heketi/heketi-topology.json,配置内容如下:

# 通过topology.json文件定义组建GlusterFS集群;# topology指定了层级关系:clusters-->nodes-->node/devices-->hostnames/zone;# node/hostnames字段的manage填写主机ip,指管理通道,在heketi服务器不能通过hostname访问GlusterFS节点时不能填写hostname;# node/hostnames字段的storage填写主机ip,指存储数据通道,与manage可以不一样;# node/zone字段指定了node所处的故障域,heketi通过跨故障域创建副本,提高数据高可用性质,如可以通过rack的不同区分zone值,创建跨机架的故障域;# devices字段指定GlusterFS各节点的盘符(可以是多块盘),必须是未创建文件系统的裸设备{  "clusters": [    {      "nodes": [        {          "node": {            "hostnames": {              "manage": [                "172.18.1.52"              ],              "storage": [                "172.18.1.52"              ]            },            "zone": 1          },          "devices": [            "/dev/vdb"          ]        },        {          "node": {            "hostnames": {              "manage": [               "172.18.1.53"              ],              "storage": [                 "172.18.1.53"              ]            },            "zone": 2          },          "devices": [            "/dev/vdb"          ]        },        {          "node": {            "hostnames": {              "manage": [               "172.18.1.54"              ],              "storage": [                "172.18.1.54"              ]            },            "zone": 3          },          "devices": [            "/dev/vdb"          ]        }      ]    }  ]}

执行以下命令创建集群

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值

apiVersion: v1kind: Secretmetadata:  name: heketi-secret  namespace: defaultdata:  # base64 encoded password. E.g.: echo -n "mypassword" | base64  key: c2dqcHJvZDIwMjMxcWF6 type: kubernetes.io/glusterfs

创建gfs-StorageClass.yaml

创建gfs-StorageClass.yaml需要提前准备以下两个参数

resturl值为搭建好之后的heketi接口地址http://172.18.1.52:8080clusterid值,获取方式如下
heketi-cli --user=admin --secret=1212  --server http://127.0.0.1:8080 cluster list

最终我们的配置文件如下

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: gfs-storageprovisioner: kubernetes.io/glusterfsparameters:  # resturl 是第二步搭建好之后的heketi 接口地址  resturl: "http://172.18.1.52:8080"  # Clusterid 必填  clusterid: "caf83363937a99eccfd1e1c03112fd2d"  restuser: "admin"  secretNamespace: "default"  secretName: "heketi-secret"  gidMin: "40000"  gidMax: "50000"#  volumetype: "none"  volumenameprefix: "gfs"

执行以下命令部署到k8s集群

执行以下命令

kubectl apply -f gfs-secret.yamlkubectl apply -f gfs-StorageClass.yaml

查询创建结果

kubectl get secretkubectl get sc

以上结果表明,创建成功

6.测试

下面我们部署一个spring boot工程,并把日志文件挂载到gfs中

新建backend-log-pvc.yaml

kind: PersistentVolumeClaimapiVersion: v1metadata:  name: backend-log-pvcspec:  accessModes:    - ReadWriteMany  resources:    requests:      storage: 5Gi  storageClassName: gfs-storage

新建backend-dp.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  name:  backendspec:  selector:    matchLabels:      app:  backend  replicas: 1  template:    metadata:      labels:        app:  backend        version: latest    spec:      containers:        - name: backend          image: "dweizhao/backend:latest"          imagePullPolicy: Always          resources:            limits:              cpu: 1000m              memory: 1G            requests:              cpu: 1m              memory: 200M          volumeMounts:            - mountPath: /data/web_log/java/backend              name: web-log      volumes:        - name: web-log          persistentVolumeClaim:            claimName: backend-log-pvc

部署

kubectl apply -f backend-log-pvc.yamlkubectl 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/目录下,用于查询一些日志 脚本如下:

#/bin/shVolumeList=$(heketi-cli --user=admin --secret=1212 --server http://127.0.0.1:8080 volume list | awk -F ':' '{print $NF}')for Volume in ${VolumeList[@]}; do    MountDir=$(echo $Volume | awk -F '_' '{for(i=2;i<NF;i++) printf("%s_",$i);printf("\n") }' | sed 's/.$//g')    # 检查文件夹是否存在    if [ ! -d "/data/web_log/$MountDir" ]; then        mkdir -p "/data/web_log/$MountDir"        echo "create dir /data/web_log/$MountDir"        mount -t glusterfs "127.0.0.1:$Volume" "/data/web_log/$MountDir"    else     echo "Already dir /data/web_log/$MountDir"    fidone

初始化磁盘数据

pvremove /dev/vdb --force --force