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

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享

在上一篇文章中,我们已经介绍了如何进行基于k8s做私有化部署。现在,我们将重点讨论如何使用 GlusterFS 搭建一个可靠的存储解决方案,以供 Kubernetes 集群使用。

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

设置开机启动,并启动

在三个节点分别执行

 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 rsa
ssh-copy-id -p 22 root@172.18.1.52
ssh-copy-id -p 22 root@172.18.1.53
ssh-copy-id -p 22 root@172.18.1.54

安装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: 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需要提前准备以下两个参数

  • resturl值为搭建好之后的heketi接口地址http://172.18.1.52:8080

  • clusterid值,获取方式如下

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

最终我们的配置文件如下

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


以上结果表明,创建成功

6.测试

下面我们部署一个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


部署完成以后,查看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/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 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产环境搭建Kubernetes可以分为以下几个步骤: 1. 确保安装了必要的软件和工具:在搭建Kubernetes之前,确保已经安装了Docker、Conntrack、Socat和GlusterFS客户端等必要的软件和工具。可以通过命令安装这些软件,例如:`yum install docker conntrack socat glusterfs-client`。 2. 准备配置文件:根据实际情况,编辑或生成一个配置文件(例如config-sample.yaml),其中包含主机的相关信息,如主机名、IP地址、用户名和密码等。可以使用命令`./kk create config --from-cluster`生成一个示例配置文件,并根据需要进行修改。 3. 验证集群状态:使用`kubectl get node`命令验证集群中各个节点的状态,确保集群正常运行。 4. 添加新节点:如果需要添加新的节点到集群中,可以在配置文件中添加新节点的信息,包括主机名、IP地址、用户名和密码等。示例配置文件中的`hosts`和`roleGroups`字段可以用来添加新节点的信息。然后使用命令`./kk add nodes -f config-sample.yaml`将新节点添加到集群中。 5. 删除节点:如果需要删除节点,可以使用命令`kubectl cordon nodename`将要删除的节点设置为不可调度状态。然后使用命令`./kk delete node <nodeName> -f config-sample.yaml`删除节点。 6. 下载镜像和二进制文件:如果在没有网络的机器上进行搭建,可以从能够访问互联网的机器上下载镜像和二进制文件。使用命令`curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/images-list.txt`下载镜像清单文件。使用命令`curl -L -O https://github.com/kubesphere/ks-installer/releases/download/v3.2.1/offline-installation-tool.sh`下载离线安装工具脚本。然后使用命令`chmod +x offline-installation-tool.sh`使脚本文件可执行。最后使用命令`./offline-installation-tool.sh -b -v v1.21.5`下载Kubernetes二进制文件。 请注意,以上步骤仅为示例,实际搭建过程可能会因环境和需求的不同而有所差异。在进行生产环境搭建时,请确保根据具体情况进行相应的配置和操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [kubesphere+kubernetes搭建生产环境高可用集群(三-2)](https://blog.csdn.net/weixin_45692576/article/details/125533589)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值