GlusterFS 是一个开源的分布式文件系统,本指南将介绍如何在 Ubuntu 系统部署一个节点数为 2 的 GlusterFS (v3.12.12) 存储服务端集群和 Heketi,Heketi 用来管理 GlusterFS,并提供 RESTful API 接口供 Kubernetes 调用。本指南仅供测试 KubeSphere 存储服务端的搭建,正式环境搭建 GlusterFS 集群请参考 GlusterFS 官方网站,搭建 Heketi 请参考 官方文档

准备节点

主机规格

Hostname IP OS CPU RAM Device
glusterfs-server1 172.20.1.5 Ubuntu 16.04.4 4 Core 4 GB /dev/vda 100GiB, /dev/vdc 300GiB
glusterfs-server2 172.20.1.6 Ubuntu 16.04.4 4 Core 4 GB /dev/vda 100GiB, /dev/vdc 300GiB

注:

  • glusterfs-server1 作为集群的管理主机,用来执行安装任务。
  • 如需创建更大容量 GlusterFS 存储服务端,可挂载更大容量块存储磁盘至主机。
  • 两个节点的 Hostname 需要与主机规格的列表中一致,因为后续步骤的命令行中有匹配到 Hostname,若与以上列表不一致请注意在后续的命令中对应修改成实际的 Hostname。
  • GlusterFS 服务端将数据存储至 /dev/vdc 块设备中,/dev/vdc 必须是未经分区格式化的原始块设备。

集群架构

  1. +-----------------------+ +-----------------------+
  2. | | | |
  3. | glusterfs-server1 |_______________| glusterfs-server2 |
  4. | heketi | | |
  5. | | | |
  6. +-----------------------+ +-----------------------+

预备工作

配置 root 登录

1、参考如下步骤分别为 glusterfs-server1 和 glusterfs-server2 配置 root 用户登录:

  • 1.1. ubuntu 用户登录主机后切换 root 用户:
  1. ubuntu@glusterfs-server1:~$ sudo -i
  2. [sudo] password for ubuntu:
  3. root@glusterfs-server1:~#
  • 1.2. 设置 root 用户登录密钥:
  1. root@glusterfs-server1:~# passwd
  2. Enter new UNIX password:
  3. Retype new UNIX password:
  4. passwd: password updated successfully
  • 同上,在 glusterfs-server2 修改 root 密码。

修改 hosts 文件

2、参考如下步骤修改 glusterfs-server1 和 glusterfs-server2 的 hosts 文件:

  1. root@glusterfs-server1:~# vi /etc/hosts
  2. ...
  3. # hostname loopback address
  4. 172.20.1.5 glusterfs-server1
  5. 172.20.1.6 glusterfs-server2
  • 同上,在 glusterfs-server2 执行以上命令并修改 hosts。

配置 SSH 免密登录

3、以下为 glusterfs-server1 的 root 用户配置无密码登录至 glusterfs-server1 与 glusterfs-server2。

  • 3.1. 创建密钥,提示 “Enter passphrase” 时,直接回车键,口令即为空:
  1. root@glusterfs-server1:~# ssh-keygen
  2. ...
  • 3.2. 拷贝密钥到各个 GlusterFS 节点,按照提示输入密钥:
  1. root@glusterfs-server1:~# ssh-copy-id root@glusterfs-server1
  2. ...
  3. root@glusterfs-server1:~# ssh-copy-id root@glusterfs-server2
  4. ...
  • 3.3. 验证免密登录,即 glusterfs-server1 无需输入密码可以登录 glusterfs-server1 和 glusterfs-server2:
  1. root@glusterfs-server1:~# ssh root@glusterfs-server1
  2. root@glusterfs-server1:~# ssh root@glusterfs-server2

开始安装

安装 Glusterfs

4、以下用 apt-get 软件包管理工具在 glusterfs-server1 安装 GlusterFS:

  1. root@glusterfs-server1:~# apt-get install software-properties-common
  2. root@glusterfs-server1:~# add-apt-repository ppa:gluster/glusterfs-3.12
  3. root@glusterfs-server1:~# apt-get update
  4. root@glusterfs-server1:~# apt-get install glusterfs-server -y
  • 同上,在 glusterfs-server2 执行以上命令安装 GlusterFS。待安装完成后分别在两个节点检查安装的 GlusterFS 版本:
  1. $ glusterfs -V
  2. glusterfs 3.12.12
  3. ...

加载内核模块

5、执行以下命令为 glusterfs-server1 加载必需的三个内核模块:

  1. root@glusterfs-server1:~# echo dm_thin_pool | sudo tee -a /etc/modules
  2. dm_thin_pool
  3. root@glusterfs-server1:~# echo dm_snapshot | sudo tee -a /etc/modules
  4. dm_snapshot
  5. root@glusterfs-server1:~# echo dm_mirror | sudo tee -a /etc/modules
  6. dm_mirror
  1. root@glusterfs-server1:~# apt-get -y install thin-provisioning-tools
  • 同上,在 glusterfs-server2 执行以上命令。

创建 Glusterfs 集群

6、参考如下步骤创建 GlusterFS 集群:

  1. root@glusterfs-server1:~# gluster peer probe glusterfs-server2
  2. peer probe: success.
  1. root@glusterfs-server2:~# gluster peer probe glusterfs-server1
  2. peer probe: success. Host glusterfs-server1 port 24007 already in peer list

验证安装结果

  • 分别在 glusterfs-server1 和 glusterfs-server2 检查 GlusterFS 集群节点间的连接状态,若 State 显示 Peer in Cluster (Connected) 则说明 GlusterFS 集群已成功搭建:
  1. $ gluster peer status

安装 Hekeit

7、Heketi 是用来管理 GlusterFS 卷的生命周期的,并提供了一个 RESTful API 接口供 Kubernetes 调用,因为 GlusterFS 没有提供 API 调用的方式,所以我们借助 heketi,通过 Heketi,Kubernetes 可以动态配置 GlusterFS 卷。以下将介绍如何在 glusterfs-server1 安装 Heketi(v7.0.0)。

  • 7.1. 下载 Hekeit Installer:
  1. root@glusterfs-server1:~# wget https://github.com/heketi/heketi/releases/download/v7.0.0/heketi-v7.0.0.linux.amd64.tar.gz
  • 7.2. 解压并安装 Heketi:
  1. root@glusterfs-server1:~# tar -xf heketi-v7.0.0.linux.amd64.tar.gz
  2. root@glusterfs-server1:~# cd heketi/
  3. root@glusterfs-server1:~/heketi# cp heketi /usr/bin/
  4. root@glusterfs-server1:~/heketi# cp heketi-cli /usr/bin

配置 Heketi

8、参考如下步骤配置 Heketi:

  • 8.1. 将 Heketi 纳入 systemd 管理:
  1. root@glusterfs-server1:~# vi /lib/systemd/system/heketi.service
  2. [Unit]
  3. Description=Heketi Server
  4. [Service]
  5. Type=simple
  6. WorkingDirectory=/var/lib/heketi
  7. ExecStart=/usr/bin/heketi --config=/etc/heketi/heketi.json
  8. Restart=on-failure
  9. StandardOutput=syslog
  10. StandardError=syslog
  11. [Install]
  12. WantedBy=multi-user.target
  • 8.2. 创建文件夹:
  1. root@glusterfs-server1:~# mkdir -p /var/lib/heketi
  2. root@glusterfs-server1:~# mkdir -p /etc/heketi
  • 8.3. 创建 Heketi 配置文件:
  1. root@glusterfs-server1:~# vim /etc/heketi/heketi.json
  2. {
  3. "_port_comment": "Heketi Server Port Number",
  4. "port": "8080",
  5. "_use_auth": "Enable JWT authorization. Please enable for deployment",
  6. "use_auth": false,
  7. "_jwt": "Private keys for access",
  8. "jwt": {
  9. "_admin": "Admin has access to all APIs",
  10. "admin": {
  11. "key": "123456"
  12. },
  13. "_user": "User only has access to /volumes endpoint",
  14. "user": {
  15. "key": "123456"
  16. }
  17. },
  18. "_glusterfs_comment": "GlusterFS Configuration",
  19. "glusterfs": {
  20. "_executor_comment": [
  21. "Execute plugin. Possible choices: mock, ssh",
  22. "mock: This setting is used for testing and development.",
  23. " It will not send commands to any node.",
  24. "ssh: This setting will notify Heketi to ssh to the nodes.",
  25. " It will need the values in sshexec to be configured.",
  26. "kubernetes: Communicate with GlusterFS containers over",
  27. " Kubernetes exec api."
  28. ],
  29. "executor": "ssh",
  30. "_sshexec_comment": "SSH username and private key file information",
  31. "sshexec": {
  32. "keyfile": "/root/.ssh/id_rsa",
  33. "user": "root"
  34. },
  35. "_kubeexec_comment": "Kubernetes configuration",
  36. "kubeexec": {
  37. "host" :"https://kubernetes.host:8443",
  38. "cert" : "/path/to/crt.file",
  39. "insecure": false,
  40. "user": "kubernetes username",
  41. "password": "password for kubernetes user",
  42. "namespace": "OpenShift project or Kubernetes namespace",
  43. "fstab": "Optional: Specify fstab file on node. Default is /etc/fstab"
  44. },
  45. "_db_comment": "Database file name",
  46. "db": "/var/lib/heketi/heketi.db",
  47. "brick_max_size_gb" : 1024,
  48. "brick_min_size_gb" : 1,
  49. "max_bricks_per_volume" : 33,
  50. "_loglevel_comment": [
  51. "Set log level. Choices are:",
  52. " none, critical, error, warning, info, debug",
  53. "Default is warning"
  54. ],
  55. "loglevel" : "debug"
  56. }
  57. }

启动Heketi

9、在 glusterfs-server1 安装 Heketi 后,需要启动 Heketi,Heketi 的状态 “Active” 显示 active (running) ... 则说明成功启动:

  1. root@glusterfs-server1:~# systemctl start heketi
  2. root@glusterfs-server1:~# systemctl status heketi
  3. heketi.service - Heketi Server
  4. Loaded: loaded (/lib/systemd/system/heketi.service; disabled; vendor preset: enabled)
  5. Active: active (running) since Tue 2018-08-14 13:50:18 CST; 9ms ago
  6. Main PID: 6854 (heketi)
  7. Tasks: 4
  8. Memory: 1.3M
  9. CPU: 3ms
  10. CGroup: /system.slice/heketi.service
  11. └─6854 /usr/bin/heketi --config=/etc/heketi/heketi.json
  12. Aug 14 13:50:18 glusterfs-server1 systemd[1]: Started Heketi Server.
  1. root@glusterfs-server1:~# systemctl enable heketi
  2. Created symlink from /etc/systemd/system/multi-user.target.wants/heketi.service to /lib/systemd/system/heketi.service.

编辑拓扑文件

10、参考如下步骤编辑 Heketi 的拓扑文件,以下所有 IP 地址应替换为您安装环境的实际主机 IP 地址。GlusterFS 服务端将数据存储至 /dev/vdc 块设备中,以下 "/dev/vdc" 可按实际情况修改:

  1. root@glusterfs-server1:~# vim /etc/heketi/topology.json
  2. {
  3. "clusters": [
  4. {
  5. "nodes": [
  6. {
  7. "node": {
  8. "hostnames": {
  9. "manage": [
  10. "172.20.1.5"
  11. ],
  12. "storage": [
  13. "172.20.1.5"
  14. ]
  15. },
  16. "zone": 1
  17. },
  18. "devices": [
  19. "/dev/vdc"
  20. ]
  21. },
  22. {
  23. "node": {
  24. "hostnames": {
  25. "manage": [
  26. "172.20.1.6"
  27. ],
  28. "storage": [
  29. "172.20.1.6"
  30. ]
  31. },
  32. "zone": 1
  33. },
  34. "devices": [
  35. "/dev/vdc"
  36. ]
  37. }
  38. ]
  39. }
  40. ]
  41. }

载入拓扑文件

11、执行以下命令为 Heketi 载入拓扑文件:

  1. root@glusterfs-server1:~# export HEKETI_CLI_SERVER=http://localhost:8080
  2. root@glusterfs-server1:~# heketi-cli topology load --json=/etc/heketi/topology.json

验证 Heketi 安装

12、执行以下命令查看 Heketi 的安装信息:

  1. heketi-cli volume list --secret 123456 --user admin