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" }] }