下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:匿名     来源: 云计算点击数:318发布时间: 2023-12-11 14:36:02

标签: GlusterFSKubernetes存储卷

  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

  来源: 今日头条

    >>>>>>点击进入计算专题

赞(14)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程