搭建 GlusterFS 服务器

GlusterFS 是开源的分布式文件系统,您能使用 GlusterFS 将 glusterfs 存储卷挂载到 Pod。如果 glusterfs 存储卷中预先填充了数据,则可以在 Kubernetes 集群中的 Pod 之间共享这些数据。

本教程演示了如何在三台服务器机器上配置 GlusterFS 以及如何安装 Heketi 来管理 GlusterFS 集群。

GlusterFS 和 Heketi 搭建好之后,就可以在客户端机器上安装 GlusterFS,并使用 KubeKey 创建一个存储类型为 GlusterFS 的 KubeSphere 集群。

准备 GlusterFS 节点

本示例中包含三台 Ubuntu 16.04 服务器机器,每台服务器都有一个附带的磁盘。

主机名IP 地址操作系统设备
server1192.168.0.2Ubuntu 16.04,4 核,4 GB 内存/dev/vdd 300 GB
server2192.168.0.3Ubuntu 16.04,4 核,4 GB 内存/dev/vdd 300 GB
server3192.168.0.4Ubuntu 16.04,4 核,4 GB 内存/dev/vdd 300 GB

备注

  • Heketi 将安装在 server1 上,该服务器提供 RESTful 管理接口来管理 GlusterFS 存储卷的生命周期。您也可以将 Heketi 安装在不同的服务器机器上。

  • 若需要更多存储空间,请在服务器上加装存储磁盘。

  • 数据将保存到 /dev/vdd(块设备),必须是没有经过分区或格式化的原始块设备。

设置无密码 SSH 登录

配置 root 登录

  1. 登录 server1 并切换到 root 用户。

    1. sudo -i
  2. 更改 root 用户密码:

    1. passwd

    备注

    请确保在文件 /etc/ssh/sshd_config 中启用了密码认证(PasswordAuthentication 的值应该为 yes)。

  3. server2server3 的 root 用户密码也需要进行更改。

添加 hosts 文件条目

  1. 在所有服务器机器上配置 DNS 或编辑 /etc/hosts 文件,添加相应的主机名和 IP 地址:

    1. vi /etc/hosts
    1. # hostname loopback address
    2. 192.168.0.2 server1
    3. 192.168.0.3 server2
    4. 192.168.0.4 server3
  2. 请确保将以上条目添加到所有服务器机器的 hosts 文件中。

配置无密码 SSH 登录

  1. 通过运行以下命令在 server1 上创建密钥。直接按回车键跳过所有提示。

    1. ssh-keygen
  2. 将密钥复制到所有 GlusterFS 节点。

    1. ssh-copy-id [email protected]
    1. ssh-copy-id [email protected]
    1. ssh-copy-id [email protected]
  3. 请验证您可以从 server1 通过无密码登录访问所有服务器机器。

    1. ssh [email protected]
    1. ssh [email protected]
    1. ssh [email protected]

在所有服务器机器上安装 GlusterFS

  1. 运行以下命令在 server1 上安装 software-properties-common

    1. apt-get install software-properties-common
  2. 添加社区 GlusterFS PPA。

    1. add-apt-repository ppa:gluster/glusterfs-7
  3. 请确保使用的是最新安装包。

    1. apt-get update
  4. 安装 GlusterFS 服务器。

    1. apt-get install glusterfs-server -y
  5. 请确保也在 server2server3 上运行上述命令,并在所有机器上验证安装包版本。

    1. glusterfs -V

备注

如果您是在 Ubuntu 之外的其他系统上安装 GlusterFS,那么上述命令可能会略有不同。有关更多信息,请参见 Gluster 文档

加载内核模块

  1. 运行以下命令在 server1 上加载三个必要的内核模块。

    1. echo dm_thin_pool | sudo tee -a /etc/modules
    1. echo dm_snapshot | sudo tee -a /etc/modules
    1. echo dm_mirror | sudo tee -a /etc/modules
  2. 安装 thin-provisioning-tools

    1. apt-get -y install thin-provisioning-tools
  3. 请确保您也在 server2server3 上运行以上命令。

创建 GlusterFS 集群

  1. server1 上运行以下命令添加其他节点并创建集群。

    1. gluster peer probe server2
    1. gluster peer probe server3
  2. 请验证集群中的所有节点均已成功连接。

    1. gluster peer status
  3. 预计输出如下:

    1. Number of Peers: 2
    2. Hostname: server2
    3. Uuid: e1192d6a-b65e-4ce8-804c-72d9425211a6
    4. State: Peer in Cluster (Connected)
    5. Hostname: server3
    6. Uuid: 9bd733e4-96d4-49d5-8958-6c947a2b4fa6
    7. State: Peer in Cluster (Connected)

安装 Heketi

由于 GlusterFS 本身不提供 API 调用的方法,因此您可以安装 Heketi,通过用于 Kubernetes 调用的 RESTful API 来管理 GlusterFS 存储卷的生命周期。这样,您的 Kubernetes 集群就可以动态地配置 GlusterFS 存储卷。在此示例中将会安装 Heketi v7.0.0。有关 Heketi 可用版本的更多信息,请参见其发布页面

  1. server1 上下载 Heketi。

    1. wget https://github.com/heketi/heketi/releases/download/v7.0.0/heketi-v7.0.0.linux.amd64.tar.gz

    备注

    您也可以在单独的机器上安装 Heketi。

  2. 将文件解压缩。

    1. tar -xf heketi-v7.0.0.linux.amd64.tar.gz
    1. cd heketi
    1. cp heketi /usr/bin
    1. cp heketi-cli /usr/bin
  3. 创建 Heketi 服务文件。

    1. vi /lib/systemd/system/heketi.service
    1. [Unit]
    2. Description=Heketi Server
    3. [Service]
    4. Type=simple
    5. WorkingDirectory=/var/lib/heketi
    6. ExecStart=/usr/bin/heketi --config=/etc/heketi/heketi.json
    7. Restart=on-failure
    8. StandardOutput=syslog
    9. StandardError=syslog
    10. [Install]
    11. WantedBy=multi-user.target
  4. 创建 Heketi 文件夹。

    1. mkdir -p /var/lib/heketi
    1. mkdir -p /etc/heketi
  5. 创建 JSON 文件以配置 Heketi。

    1. vi /etc/heketi/heketi.json

    示例文件:

    ``` { “_port_comment”: “Heketi Server Port Number”, “port”: “8080”,

    “_use_auth”: “Enable JWT authorization. Please enable for deployment”, “use_auth”: false,

    “_jwt”: “Private keys for access”, “jwt”: {

    1. "_admin": "Admin has access to all APIs",
    2. "admin": {
    3. "key": "123456"
    4. },
    5. "_user": "User only has access to /volumes endpoint",
    6. "user": {
    7. "key": "123456"
    8. }

    },

    “_glusterfs_comment”: “GlusterFS Configuration”, “glusterfs”: {

    1. "_executor_comment": [
    2. "Execute plugin. Possible choices: mock, ssh",
    3. "mock: This setting is used for testing and development.",
    4. " It will not send commands to any node.",
    5. "ssh: This setting will notify Heketi to ssh to the nodes.",
    6. " It will need the values in sshexec to be configured.",
    7. "kubernetes: Communicate with GlusterFS containers over",
    8. " Kubernetes exec api."
    9. ],
    10. "executor": "ssh",
    11. "_sshexec_comment": "SSH username and private key file information",
    12. "sshexec": {
    13. "keyfile": "/root/.ssh/id_rsa",
    14. "user": "root"
    15. },
    16. "_kubeexec_comment": "Kubernetes configuration",
    17. "kubeexec": {
    18. "host" :"https://kubernetes.host:8443",
    19. "cert" : "/path/to/crt.file",
    20. "insecure": false,
    21. "user": "kubernetes username",
    22. "password": "password for kubernetes user",
    23. "namespace": "Kubernetes namespace",
    24. "fstab": "Optional: Specify fstab file on node. Default is /etc/fstab"
    25. },
    26. "_db_comment": "Database file name",
    27. "db": "/var/lib/heketi/heketi.db",
    28. "brick_max_size_gb" : 1024,

    “brick_min_size_gb” : 1, “max_bricks_per_volume” : 33,

  1. "_loglevel_comment": [
  2. "Set log level. Choices are:",
  3. " none, critical, error, warning, info, debug",
  4. "Default is warning"
  5. ],
  6. "loglevel" : "debug"
  7. }
  8. }
  9. ```
  10. 备注
  11. 在安装 GlusterFS 作为 KubeSphere 集群的存储类型时,必须提供帐户 `admin` 及其 `Secret` 值。
  1. 启动 Heketi。

    1. systemctl start heketi
  2. 检查 Heketi 的状态。

    1. systemctl status heketi

    如果出现了 active (running),则意味着安装成功。预计输出:

    1. heketi.service - Heketi Server
    2. Loaded: loaded (/lib/systemd/system/heketi.service; disabled; vendor preset: enabled)
    3. Active: active (running) since Tue 2021-03-09 13:04:30 CST; 4s ago
    4. Main PID: 9282 (heketi)
    5. Tasks: 8
    6. Memory: 6.5M
    7. CPU: 62ms
    8. CGroup: /system.slice/heketi.service
    9. └─9282 /usr/bin/heketi --config=/etc/heketi/heketi.json
    10. Mar 09 13:04:30 server1 systemd[1]: Started Heketi Server.
    11. Mar 09 13:04:30 server1 heketi[9282]: Heketi v7.0.0
    12. Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Loaded ssh executor
    13. Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Adv: Max bricks per volume set to 33
    14. Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Adv: Max brick size 1024 GB
    15. Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Adv: Min brick size 1 GB
    16. Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 GlusterFS Application Loaded
    17. Mar 09 13:04:30 server1 heketi[9282]: [heketi] INFO 2021/03/09 13:04:30 Started Node Health Cache Monitor
    18. Mar 09 13:04:30 server1 heketi[9282]: Listening on port 8080
  3. 启用 Heketi。

    1. systemctl enable heketi

    预计输出:

    1. Created symlink from /etc/systemd/system/multi-user.target.wants/heketi.service to /lib/systemd/system/heketi.service.
  4. 为 Heketi 创建拓扑配置文件,该文件包含添加到 Heketi 的集群、节点和磁盘的信息。

    1. vi /etc/heketi/topology.json

    示例文件:

    1. {
    2. "clusters": [
    3. {
    4. "nodes": [
    5. {
    6. "node": {
    7. "hostnames": {
    8. "manage": [
    9. "192.168.0.2"
    10. ],
    11. "storage": [
    12. "192.168.0.2"
    13. ]
    14. },
    15. "zone": 1
    16. },
    17. "devices": [
    18. "/dev/vdd"
    19. ]
    20. },
    21. {
    22. "node": {
    23. "hostnames": {
    24. "manage": [
    25. "192.168.0.3"
    26. ],
    27. "storage": [
    28. "192.168.0.3"
    29. ]
    30. },
    31. "zone": 1
    32. },
    33. "devices": [
    34. "/dev/vdd"
    35. ]
    36. },
    37. {
    38. "node": {
    39. "hostnames": {
    40. "manage": [
    41. "192.168.0.4"
    42. ],
    43. "storage": [
    44. "192.168.0.4"
    45. ]
    46. },
    47. "zone": 1
    48. },
    49. "devices": [
    50. "/dev/vdd"
    51. ]
    52. }
    53. ]
    54. }
    55. ]
    56. }

    备注

    • 请使用您自己的 IP 替换上述 IP 地址。
    • 请在 devices 一栏添加您自己的磁盘名称。
  5. 加载 Heketi JSON 文件。

    1. export HEKETI_CLI_SERVER=http://localhost:8080
    1. heketi-cli topology load --json=/etc/heketi/topology.json

    预计输出:

    1. Creating cluster ... ID: 2d9e11adede04fe6d07cb81c5a1a7ea4
    2. Allowing file volumes on cluster.
    3. Allowing block volumes on cluster.
    4. Creating node 192.168.0.2 ... ID: 0a9f240ab6fd96ea014948c5605be675
    5. Adding device /dev/vdd ... OK
    6. Creating node 192.168.0.3 ... ID: 2468086cadfee8ef9f48bc15db81c88a
    7. Adding device /dev/vdd ... OK
    8. Creating node 192.168.0.4 ... ID: 4c21b33d5c32029f5b7dc6406977ec34
    9. Adding device /dev/vdd ... OK
  6. 以上输出同时显示了集群 ID 和节点 ID。运行以下命令查看集群信息。

    1. heketi-cli cluster info 2d9e11adede04fe6d07cb81c5a1a7ea4 # Use your own cluster ID.

    预计输出:

    1. Cluster id: 2d9e11adede04fe6d07cb81c5a1a7ea4
    2. Nodes:
    3. 0a9f240ab6fd96ea014948c5605be675
    4. 2468086cadfee8ef9f48bc15db81c88a
    5. 4c21b33d5c32029f5b7dc6406977ec34
    6. Volumes:
    7. Block: true
    8. File: true