7

生产实践:使用 GlusterFS 搭建 Kubernetes 存储卷集群

 9 months ago
source link: https://www.51cto.com/article/775924.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

生产实践:使用 GlusterFS 搭建 Kubernetes 存储卷集群

作者:架构成长指南 2023-12-08 07:59:04
k8s中的StorageClass用于定义和配置持久卷(Persistent Volume)的资源对象。StorageClass 提供了一种抽象层,使得管理员能够定义不同类型的存储和访问模式,并将其提供给应用程序开发人员使用。

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

f79879e35bce963ff9a564314d9ca6a281109d.jpg

1.服务器列表:

  • 172.18.1.52
  • 172.18.1.53
  • 172.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.noarch
yum -y install glusterfs-server
e3296608706b77bdce0550cf6dad64154447a0.png

设置开机启动,并启动

在三个节点分别执行

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
9648f6e57a316d90992050833c633e3f82230b.png

4.heketi安装

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

设置免密登录glusterfs node节点

ssh-keygen -t rsa
ssh-copy-id -p 22 [email protected]
ssh-copy-id -p 22 [email protected]
ssh-copy-id -p 22 [email protected]
1274f765040f55de2ec940091c11c3aafe92cc.png

安装heketi

在172.18.1.52执行

yum install  -y heketi heketi-client
34eacb0461040defd7f24674a71be3cfba88ce.png

修改heketi 配置文件

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

67d07af13e389778fb4029f8768fdcf4acc94c.png

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

f7c13ad755f7751467d0893c4abd43623d20e9.jpg

执行以下命令

systemctl daemon-reload
 systemctl enable heketi
 systemctl start heketi

验证是否启动成功

返回 Hello from Heketi 则成功

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

c3d353a034bcea871d665240276c28242fb621.png

使用heketi创建glusterfs集群

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

684798343dc3fd4243d55957c6c61969b10511.png

创建 /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: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: default
data:
  # base64 encoded password. E.g.: echo -n "mypassword" | base64
  key: c2dqcHJvZDIwMjMxcWF6 
type: kubernetes.io/glusterfs

创建gfs-StorageClass.yaml

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

heketi-cli --user=admin --secret=1212  --server http://127.0.0.1:8080 cluster list

a197d3e36f03900a2cb403e08ade5fb6d37e0c.png

最终我们的配置文件如下

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
  # 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.yaml
kubectl apply -f gfs-StorageClass.yaml

查询创建结果

kubectl get secret
kubectl get sc
93ccccb69ecc6482ef6262b4a12ec98587e6c2.png

以上结果表明,创建成功

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

新建backend-log-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: backend-log-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: gfs-storage

新建backend-dp.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  backend
spec:
  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.yaml
kubectl apply -f backend-dp.yaml
666b25589c493e9f995521796b16c057e8f7fc.png

部署完成以后,查看pv与系统日志看到挂载成功

0160ee07522ff25102913798d16fba50121b81.png
14c9dba5047211a446d019209d4a87575eba3a.png
a522b655801cbe178e3336072759bf61235c10.png

验证挂载是否成功

登录文件服务器,执行df -h查看挂载日志文件,如下所图

4552eca07bc27adf35795139cb6f4cbdd5bec0.png

由于挂载名称无法识别,导致无法定位目标文件,因此执行mount.sh(辅助命令章节)脚本,把fs卷挂载到/data/web_log/目录下并以namespace+pvcName命名,如下图执行完脚本,进入/data/web_log/default_backend-log-pvc目录,查看挂载日志

1328d4993b2df9810d8292ce00b7da727bea6f.png

7.辅助命令

mount.sh

在heketi节点上执行以下命令,把fs卷挂载到/data/web_log/目录下,用于查询一些日志 脚本如下:

#/bin/sh
VolumeList=$(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"
    fi
done

初始化磁盘数据

pvremove /dev/vdb --force --force
责任编辑:武晓燕 来源: 今日头条

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK