GlusterFS + Heketi 的安装和初始化

GlusterFS 是个开源的分布式文件系统,而 Heketi 在其上提供了 REST 形式的 API,二者协同为 Kubernetes 提供了存储卷的自动供给能力。

一般对这个系统的介绍,都是基于 Docker 的容器内完成的,个人爱好原因,还不太习惯把这个事情放到集群里面,所以介绍一下用 Yum 方式的安装过程。

我们使用三台服务器作为存储集群,操作系统为 CentOS 7。另外假设每台 Gluster FS 服务器挂在有名为 /dev/sdc 的裸设备,安装过程需要有互联网连接。

  • Heketi 服务器:10.211.55.31
  • Gluster 服务器:
    • 10.211.55.31
    • 10.211.55.32
    • 10.211.55.33

Heketi 的安装和初始设置

这个很简单,CentOS 的 EPEL Repository 中就提供了他的安装包。

yum install -y heketi heketi-client

安装之后,会生成 Heketi 的 Service,建立 /etc/heketi,并在其中生成一个叫 heketi.json 的配置文件。这里提供一个样本:

{
  "port": "7070",
  "use_auth": false,
  "jwt": {
    "admin": {
      "key": "My Secret"
    },
    "user": {
      "key": "My Secret"
    }
  },
  "glusterfs": {
    "executor": "ssh",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key",
      "user": "root",
      "port": "22",
      "fstab": "/etc/fstab"
    },
    "executor": "ssh",    
    "db": "/var/lib/heketi/heketi.db",
    "loglevel": "debug"
  }
}

这个简单的配置文件说明:

  • 在 7070 提供服务。
  • 数据库保存在/var/lib/heketi/heketi.db
  • 关闭认证
  • 利用 ssh 和 GlusterFS 集群成员进行通信
  • ssh 证书保存在 /etc/heketi/heketi_key

既然提到证书,就用 ssh-keygen 来生成一套:

ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ''

后面将会使用这套证书来完成对 GlusterFS 的控制。

注意,这里要保证上面提到的数据库、配置以及证书文件,一定要确认 Heketi 用户有权进行访问。

GlusterFS 安装

  • 启用仓库:yum install -y centos-release-gluster
  • 安装软件:yum install -y glusterfs-server
  • 启用服务:systemctl enable glusterfs-server
  • 启动服务:systemctl start glusterfs-server

注意这里要把上个步骤生成的公钥(heketi_key.pub)加入到本机的信任列表中,例如

cat /tmp/heketi_key.pub >> /root/.ssh/authorized_key

集群初始化

Heketi 对存储的拓普结构是这样的:

  • Topology
    • Node a1
    • Node a2
    • Device a11
    • Device a12
    • Cluster a
    • Cluster b

所以初始化过程就按照从上到下的方式来进行:

建立集群

heketi-cli create cluster

创建成功后,会显示一个集群 ID。

加入 Node

heketi-cli node add --cluster=[clusterid] \
--management-host-name=[node-host] \
--storage-host-name=[node-host] \
--zone=1

运行成功会显示新加入的 Node 的 Node ID。

Add Node 过程失败可能需要查看一下防火墙

加入 Device

heketi device add \
--name=/dev/sdc
--host=[host-id]

自动一点

下面的脚本会把运行参数中指定的第一参数作为主机地址,第二参数作为设备名称加入第一个集群

#!/bin/shexport HEKETI_CLI_SERVER=http://127.0.0.1:7070CLUSTER_ID=`heketi-cli cluster list | tail -n 1 | xargs `
CLUSTER="--cluster=$CLUSTER_ID"HOST="--management-host-name=$1 --storage-host-name=$1"ZONE="--zone=1"NODE_ID=`heketi-cli node add $CLUSTER $HOST $ZONE | grep -v -i "Cluster" | grep -i "id" | cut -d : -f 2 | xargs`
heketi-cli device add --name=$2 --node=$NODE_ID

命令需要用 ‘-s’ 开关指定操作的 Heketi 服务地址。
可以用环境变量来简化一下: export HEKETI_CLI_SERVER=”http://127.0.0.1:7070"。

Topology

利用 heketi-cli topology info,会输出当前的集群结构。而且也可以用 JSON 格式导入和导出整个 Topology。下面的例子供参考:

{

    "volumes": [],
    "nodes": [{
      "zone": 1,
      "hostnames": {
        "manage": ["10.211.55.19"],
        "storage": ["10.211.55.19"]
      },
      "cluster": "f6e6de7dc99ca3ed627e2ab3ae68f9ac",
      "id": "95d3d4fec82be4d2a55ae0aa17344af5",
      "state": "online",
      "devices": [{
        "name": "/dev/sdc",
        "storage": {
          "total": 33419264,
          "free": 33419264,
          "used": 0
        },
        "id": "e4e1b97d38ed5ae70323458c1b8e57b5",
        "state": "online",
        "bricks": []
      }]
    }, {
      "zone": 1,
      "hostnames": {
        "manage": ["10.211.55.21"],
        "storage": ["10.211.55.21"]
      },
      "cluster": "f6e6de7dc99ca3ed627e2ab3ae68f9ac",
      "id": "ab36d04dbface40904a05c33f3fd9800",
      "state": "online",
      "devices": [{
        "name": "/dev/sdc",
        "storage": {
          "total": 33419264,
          "free": 33419264,
          "used": 0
        },
        "id": "a33dee6fd8355c6aa9ff5e2783ecef49",
        "state": "online",
        "bricks": []
      }]
    }, {
      "zone": 1,
      "hostnames": {
        "manage": ["10.211.55.20"],
        "storage": ["10.211.55.20"]
      },
      "cluster": "f6e6de7dc99ca3ed627e2ab3ae68f9ac",
      "id": "bfd478cb0a0a562386c06967fb2b31bc",
      "state": "online",
      "devices": [{
        "name": "/dev/sdc",
        "storage": {
          "total": 33419264,
          "free": 33419264,
          "used": 0
        },
        "id": "24c5a97ccad5b3fc35977bc7419c27ee",
        "state": "online",
        "bricks": []
      }]
    }],
    "id": "f6e6de7dc99ca3ed627e2ab3ae68f9ac"
  }]
}


上一篇:海量小文件的开源存储方案选型建议


下一篇:GFS 分布式文件系统