搭建 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. server2 和 server3 的 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 root@server1
    1. ssh-copy-id root@server2
    1. ssh-copy-id root@server3
  3. 请验证您可以从 server1 通过无密码登录访问所有服务器机器。

    1. ssh root@server1
    1. ssh root@server2
    1. ssh root@server3

在所有服务器机器上安装 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. 请确保也在 server2 和 server3 上运行上述命令,并在所有机器上验证安装包版本。

    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. 请确保您也在 server2 和 server3 上运行以上命令。

创建 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