zoukankan      html  css  js  c++  java
  • Kubernetes存储——glusterfs(集群)

    一、搭建 glusterfs(集群)版本:gluster-9

    1.1 服务器规划

    master(k8s集群) node1(k8s集群) node2(k8s集群)
    192.168.99.201 192.168.99.202 192.168.99.203
    glusterfs 服务端 glusterfs 服务端 glusterfs 服务端 glusterfs 服务端
    192.168.99.204 192.168.99.205 192.168.99.206 192.168.99.207

    1.2 环境准备

    glusterfs 服务端 + 客户端配glusterfs官方yum源

    $ yum install centos-release-gluster -y
    

    glusterfs 服务端

    $ yum install glusterfs-server -y
    # 所有服务端节点安装glusterfs-server
    $ systemctl enable glusterd --now
    $ systemctl status glusterd
    
    # 4个storage服务器建立连接不用两两连接,只需要找其中1个,连接另外3个各一次就OK了
    
    # 这里在storage-01上操作
    [root@storage-01 ~]# gluster peer probe storage-02
    [root@storage-01 ~]# gluster peer probe storage-03
    [root@storage-01 ~]# gluster peer probe storage-04
    
    $ gluster peer status
    # 在所有服务端上都可以使用该命令来验证检查
    

    注意:

    • 如果这一步建立连接有问题(一般问题会出现在网络连接、防火墙、selinux、主机名绑定等)
    • 如果想重做这一步,可以使用gluster peer detach xxxxx [force] 来断开连接,重新做

    所有storage服务器准备存储目录(可以用单独的分区,也可以使用根分区)

    # 这里的storage服务器没有准备额外的硬盘,所以这里用根分区来做实验
    但生产环境肯定是不建议数据盘和系统盘在一起的
    
    $ mkdir -p /data/gv0
    

    1.3 gluster模式

    1.3.1 replica模式
    $ gluster volume create gv0 replica 4 storage-01:/data/gv0/ storage-02:/data/gv0/ storage-03:/data/gv0/ storage-04:/data/gv0/ force
    
    $ gluster volume info gv0
    $ gluster volume start gv0
    $ gluster volume info gv0
    

    glusterfs 客户端

    replica卷测试(读写测试)

    这里直接使用(k8s集群)node01 + node02 来测试

    $ yum install centos-release-gluster -y
    $ yum install glusterfs glusterfs-fuse -y
    
    [root@k8s-node01 ~]# mkdir /test1
    
    # 挂载前需要解析(配置/etc/hosts)
    [root@k8s-node01 ~]# mount -t glusterfs storage-01:/gv0 /test1
    [root@k8s-node01 ~]# df -h | tail -1
    

    客户端也需要在/etc/hosts文件里绑定存储节点的主机名,才可以挂载

    这里client是挂载storage-01,也可以挂载storage-02,storage-03任意一个。(也就是说这3个storage 既是老板,又是员工。这是glusterfs的一个特点,其它的分布式存储软件基本上都会有专门的管理server)

    在客户端使用dd命令往挂载目录里写文件,然后查看在storage服务器上的分布情况!

    $ dd if=/dev/zero of=/test1/file1 bs=1M count=100
    

    读写操作请都在客户端进行,不要在storage服务器上操作

    读写测试结果:结果类似raid1

    同读同写测试:两个(多个)客户端挂载后实现同读同写(文件存储类型的特点)!

    [root@k8s-node02 ~]# mkdir /test2
    
    # 挂载前需要解析(配置/etc/hosts)
    [root@k8s-node02 ~]# mount -t glusterfs storage-01:/gv0 /test2
    [root@k8s-node02 ~]# df -h | tail -1
    
    [root@k8s-node02 ~]# dd if=/dev/zero of=/test2/file1 bs=1M count=100
    
    [root@k8s-node01 ~]# rm /test1/* -rf
    [root@k8s-node01 ~]# umount /test1
    
    [root@k8s-node02 ~]# rm /test2/* -rf
    [root@k8s-node02 ~]# umount /test2
    

    在任意一个storage服务器上停止gv0并删除,这里是在storage-01上操作!

    [root@storage-01 ~]# gluster volume stop gv0
    [root@storage-01 ~]# gluster volume delete gv0
    [root@storage-01 ~]# gluster volume info
    
    1.3.2 stripe模式(新版本已废弃)

    做成 stripe模式的卷(重点是命令里的 stripe 4参数)

    $ gluster volume create gv0 stripe 4 storage-01:/data/gv0/ storage-02:/data/gv0/ storage-03:/data/gv0/ storage-04:/data/gv0/ force
    

    读写测试结果:文件过小,不会平均分配给存储节点。有一定大小的文件会平均分配。类似raid0。

    1.3.3 distributed 模式

    创建 distributed卷 gv1(不指定 replica 或 stripe 就默认是 distributed 的模式!

    $ mkdir -p /data/gv1
    $ gluster volume create gv1 storage-01:/data/gv1/ storage-02:/data/gv1/ storage-03:/data/gv1/ storage-04:/data/gv1/ force
    
    $ gluster volume start gv1
    $ gluster volume info gv1
    
    # 客户端挂载
    $ mkdir /test1
    $ mount -t glusterfs storage-01:/gv1 /test1
    

    读写测试结果: 写满第一个存储后,再写第二个存储(顺序是随机的)!

    1.3.4 distributed-replica 模式
    $ mkdir -p /data/gv2
    $ gluster volume create gv2 replica 2 storage-01:/data/gv2/ storage-02:/data/gv2/ storage-03:/data/gv2/ storage-04:/data/gv2/ force
    
    $ gluster volume start gv2
    $ gluster volume info gv2
    
    # 客户端挂载
    $ mkdir /test2
    $ mount -t glusterfs storage-01:/gv2 /test2
    

    读写测试结果:4个存储先写其中2个(并在这两个存储里镜像),写满这两个后, 再按相同方式写另2个存储。

    1.3.5 disperse 模式
    $ mkdir -p /data/gv3
    $ gluster volume create gv3 disperse 4 storage-01:/data/gv3/ storage-02:/data/gv3/ storage-03:/data/gv3/ storage-04:/data/gv3/ force
    # 注意:没有指定冗余值,默认为1,按y确认
    
    $ gluster volume start gv3
    $ gluster volume info gv3
    # Number of Bricks: 1 x (3 + 1) = 4 这里看到冗余数为1
    
    # 客户端挂载
    $ mkdir /test3
    $ mount -t glusterfs storage-01:/gv3 /test3
    

    读写测试结果: 写100M,每个存储服务器上占33M左右。因为4个存储1个为冗余(与raid5一样)

    1.3.6 在线裁减与在线扩容

    在线裁减要看是哪一种模式的卷,比如 stripe 模式就不允许在线裁减。下面以distributed卷来做裁减与扩容!

    在线裁减(注意要remove没有数据的brick)

    $ gluster volume remove-brick gv1 storage-04:/data/gv1 force
    

    在线扩容

    $ gluster volume add-brick gv1 storage-04:/data/gv1 force
    

    二、配置 k8s 使用 glusterfs 持久化存储

    2.1 直接使用glusterfs作为存储卷

    $ cat > glusterfs-cluster.yaml << EOF
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: glusterfs-cluster
      namespace: default
    subsets:
    - addresses:
      - ip: 192.168.99.204
      - ip: 192.168.99.205
      - ip: 192.168.99.206
      - ip: 192.168.99.207
      ports:
      - port: 49152
        protocol: TCP
    EOF
    
    $ cat > nginx_deployment_test.yaml << EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-test
    spec:
      replicas: 3
      selector:
        matchLabels:
          name: nginx
      template:
        metadata:
          labels:
            name: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - containerPort: 80
              volumeMounts:
                - name: storage001
                  mountPath: "/usr/share/nginx/html"
          volumes:
          - name: storage001
            glusterfs:
              endpoints: glusterfs-cluster
              path: gv0 # 修改
              readOnly: false
    EOF
    

    2.2 使用静态pv+pvc

    $ cat > glusterfs-pv.yaml << EOF
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: glusterfs-pv
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteMany
      glusterfs:
        endpoints: glusterfs-cluster
        path: gv1 # 修改
        readOnly: false
    EOF
    
    $ cat > glusterfs-pvc.yaml << EOF
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: glusterfs-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
    EOF
    
    $ cat > nginx_deployment.yaml << EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          name: nginx
      template:
        metadata:
          labels:
            name: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - containerPort: 80
              volumeMounts:
                - name: storage001
                  mountPath: "/usr/share/nginx/html"
          volumes:
          - name: storage001
            persistentVolumeClaim:
              claimName: glusterfs-pvc
    EOF
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    分区表的一些操作例子
    MySQL 主从复制
    使用pipeline的函数
    主键字段使用不同数据类型的简单比较
    Flashback Query笔记
    基于Liquibase的数据库持续集成
    MySQL安装
    格式化SYS_GUID()成为标准格式
    Silverlight Treeview 相关操作:加载,保存,索引节点,节点移动,模板节点
    Silverlight TreeView组件的研究[2]
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/15418478.html
Copyright © 2011-2022 走看看