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

    作者:匿名更新于: 2023-12-11 14:36:02

      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

      来源: 今日头条

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

云计算 更多推荐

课课家教育

未登录