美文网首页docker与k8s
kubernetes下使用glusterfs

kubernetes下使用glusterfs

作者: oldthief | 来源:发表于2018-01-02 15:02 被阅读0次
    1. Glusterfs简介

    GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或InfiniBandRDMA网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。

    1. Glusterfs特点

    2.1 扩展性和高性能

    GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(ElasticHash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。

    2.2 高可用性

    GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。

    2.3全局统一命名空间

    全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。

    2.4 弹性哈希算法

    GlusterFS采用弹性哈希算法在存储池中定位数据,而不是采用集中式或分布式元数据服务器索引。在其他的Scale-Out存储系统中,元数据服务器通常会导致I/O性能瓶颈和单点故障问题。GlusterFS中,所有在Scale-Out存储配置中的存储系统都可以智能地定位任意数据分片,不需要查看索引或者向其他服务器查询。这种设计机制完全并行化了数据访问,实现了真正的线性性能扩展。

    2.5 弹性卷管理

    数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。

    2.6基于标准协议

    Gluster存储服务支持NFS,CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。

    kubernetes提供动态存储,结合glusterfs自动实现存储的分配管理:自动方式需要先部署Heketi软件,Heketi用来管理GlusterFS,并提供RESTful API接口供Kubernetes调用。Heketi需要使用裸磁盘,这里假设GlusterFS总共为三个节点,并且每个节点上都挂了一块裸磁盘 /dev/sdb,接下来让我们开始部署。

    • 安装glusterfs的yum源,这里选择3.12版本
      #yum install -y centos-release-gluster312
      #yum install -y glusterfs-server.x86_64
      #systemctl enable glusterd.service glusterfsd.service && systemctl start glusterd.service glusterfsd.service && systemctl status glusterd.service glusterfsd.service
    image.png
    • 安装heketi软件
      #yum install -y heketi heketi-client
      ----修改heketi配置文件,仅列出需要修改的部分
      #cat /etc/heketi/heketi.json
     "_port_comment": "Heketi Server Port Number",
      "port": "8081",
    ................................
     "_glusterfs_comment": "GlusterFS Configuration",
      "glusterfs": {
        "_executor_comment": [
          "Execute plugin. Possible choices: mock, ssh",
          "mock: This setting is used for testing and development.",
          "      It will not send commands to any node.",
          "ssh:  This setting will notify Heketi to ssh to the nodes.",
          "      It will need the values in sshexec to be configured.",
          "kubernetes: Communicate with GlusterFS containers over",
          "            Kubernetes exec api."
        ],
        "executor": "ssh",
    
        "_sshexec_comment": "SSH username and private key file information",
        "sshexec": {
          "keyfile": "/root/.ssh/id_rsa",
          "user": "root",
          "port": "22",
          "fstab": "/etc/fstab"
        } ```
    ---- 设置ssh免密码登陆,上面keyfile位置填写的就是ssh私钥
    #ssh-keygen -t rsa
    #ssh-copy-id -i root@192.168.x.x
    
    ---- 修改heketi启动文件,主要是user,默认以heketi用户启动,修改为ssh的私钥用户,否则无法读取私钥
    #vim /usr/lib/systemd/system/heketi.service
    ![image.png](https://img.haomeiwen.com/i6161009/1b21fc50c1c6da36.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    ---- 启动heketi
    #systemctl start heketi && systemctl enable heketi
    
    - 配置heketi与kubernetes结合
    ---- 设置heketi的server信息,然后创建topology
    #export HEKETI_CLI_SERVER=http://192.168.x.x:8081 
    # cat topology.json 
    {
      "clusters": [
        {
          "nodes": [
            {
              "node": {
                "hostnames": {
                  "manage": [
                    "192.168.128.21"
                  ],
                  "storage": [
                    "192.168.128.21"
                  ]
                },
                "zone": 1
              },
              "devices": [
                "/dev/sdb"
              ]
            },
            {
              "node": {
                "hostnames": {
                  "manage": [
                    "192.168.128.22"
                  ],
                  "storage": [
                    "192.168.128.22"
                  ]
                },
                "zone": 1
              },
              "devices": [
                "/dev/sdb"
              ]
            },
            {
              "node": {
                "hostnames": {
                  "manage": [
                    "192.168.128.23"
                  ],
                  "storage": [
                    "192.168.128.23"
                  ]
                },
                "zone": 1
              },
              "devices": [
                "/dev/sdb"
              ]
            }
          ]
        }
      ]
    }
    #heketi-cli topology load --json=topology.json
    #heketi-cli topology info
    ---- 创建storageclass文件
    # cat glusterfs-storageclass.yaml 
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: slow
    provisioner: kubernetes.io/glusterfs
    parameters:
      gidMax: "50000"
      gidMin: "40000"
      resturl: http://192.168.128.21:8081
      volumetype: replicate:3
      restauthenabled: "false"
    #  restuser: "admin"
    #  restuserkey: "123456"
    #  secretNamespace: "default"
    #  #  secretName: "heketi-secret"
    

    ---- 创建pvc文件

    cat pvc.yaml

    apiVersion: v1
    metadata:
      name: test
      annotations:
        volume.beta.kubernetes.io/storage-class: "slow"
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
    
    
    #kubectl create -f glusterfs-storageclass.yaml
    #kubectl create -f pvc.yaml
    至此,二进制方式使用方法部署完毕,后续补上容器方式。
    
    ---- 更改 PersistentVolume 的回收策略
    
    PersistentVolumes 可以有多种回收策略,包括 “Retain”、”Recycle” 和 “Delete”。对于动态配置的 PersistentVolumes 来说,默认回收策略为 “Delete”。这表示当用户删除对应的 PersistentVolumeClaim 时,动态配置的 volume 将被自动删除。如果 volume 包含重要数据时,这种自动行为可能是不合适的。那种情况下,更适合使用 “Retain” 策略。使用 “Retain” 时,如果用户删除 PersistentVolumeClaim,对应的 PersistentVolume 不会被删除。相反,它将变为 Released 状态,表示所有的数据可以被手动恢复。
    列出你集群中的 PersistentVolumes
    #kubectl get pv
    ![image.png](https://img.haomeiwen.com/i6161009/83161f784fc33ea1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    
    这个列表同样包含了绑定到每个 volume 的 claims 名称,以便更容易的识别动态配置的 volumes。
    
    选择 PersistentVolumes 中的一个并更改它的回收策略:
    
    #kubectl patch pv <your-pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
    这里的 <your-pv-name> 是选择的 PersistentVolume 的名字。
    

    相关文章

      网友评论

        本文标题:kubernetes下使用glusterfs

        本文链接:https://www.haomeiwen.com/subject/cyyfnxtx.html