kubernetes下使用glusterfs

  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
kubernetes下使用glusterfs_第1张图片
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 [email protected]

---- 修改heketi启动文件,主要是user,默认以heketi用户启动,修改为ssh的私钥用户,否则无法读取私钥
#vim /usr/lib/systemd/system/heketi.service
![image.png](http://upload-images.jianshu.io/upload_images/6161009-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](http://upload-images.jianshu.io/upload_images/6161009-83161f784fc33ea1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

这个列表同样包含了绑定到每个 volume 的 claims 名称,以便更容易的识别动态配置的 volumes。

选择 PersistentVolumes 中的一个并更改它的回收策略:

#kubectl patch pv  -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
这里的  是选择的 PersistentVolume 的名字。

你可能感兴趣的:(kubernetes下使用glusterfs)