使用Heketi管理GlusterFS集群

13 阅读8分钟

说明

本示例使用Heketi将GlusterFS集成到K8s中

Heketi介绍

  • Heketi(github.com/heketi/heke…),是一个基于RESTful API的GlusterFS卷管理框架。
  • Heketi可以方便地和云平台整合,提供RESTful API供Kubernetes调用,实现多GlusterFS集群的卷管理
  • Heketi还有保证bricks和它对应的副本均匀分布在集群中的不同可用区的优点。

GlusterFS集群安装

参考文章

下载Heketi

wget https://github.com/heketi/heketi/releases/download/v10.4.0/heketi-v10.4.0-release-10.linux.amd64.tar.gz

解压文件

root@node1:~# tar -xf heketi-v10.4.0-release-10.linux.amd64.tar.gz 
root@node1:~# cd heketi/
root@node1:~/heketi# ls
heketi  heketi-cli  heketi.json

将解压的可执行程序复制到指定的环境变量路径中

cp heketi/{heketi,heketi-cli} /usr/local/bin

配置Heketi Server

为 Heketi 创建配置和数据路径

sudo mkdir -p /var/lib/heketi /etc/heketi /var/log/heketi 
sudo cp heketi/heketi.json /etc/heketi

修改配置文件heketi.json

json不能有注释,创建配置文件时候需要将下面配置文件里面的中文去掉

{
  "_port_comment": "Heketi Server Port Number",
  "port": "18080", 修改为18080,防止与其它端口冲突

  "_use_auth": "Enable JWT authorization. Please enable for deployment",
  "use_auth": true, 开启用户认证

  "_jwt": "Private keys for access",
  "jwt": {
    "_admin": "Admin has access to all APIs",
    "admin": {
      "key": "adminkey" 用户认证的key
    },
    "_user": "User only has access to /volumes endpoint",
    "user": {
      "key": "My Secret"
    }
  },

  "_glusterfs_comment": "GlusterFS Configuration",
  "glusterfs": {
    "_executor_comment": [
      "Execute plugin. Possible choices: mock, ssh",
      "mock: This setting is used for testing and development.",
      "      It will not send commands to any node.",
      "ssh:  This setting will notify Heketi to ssh to the nodes.",
      "      It will need the values in sshexec to be configured.",
      "kubernetes: Communicate with GlusterFS containers over",
      "            Kubernetes exec api."
    ],
    "executor": "ssh", 访问glusterfs集群的方法

    "_sshexec_comment": "SSH username and private key file information",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key", 访问glusterfs集群使用的私钥,需要提前在k8s集群master节点生成并copy到glusterfs集群所有节点,需要从/root/.ssh/id_rsa复制到此处才可以使用。
      "user": "root", 认证使用的用户
      "port": "22", ssh连接使用的端口
      "fstab": "/etc/fstab" 挂载的文件系统
    },

    "_kubeexec_comment": "Kubernetes configuration",
    "kubeexec": {
      "host" :"https://kubernetes.host:8443",
      "cert" : "/path/to/crt.file",
      "insecure": false,
      "user": "kubernetes username",
      "password": "password for kubernetes user",
      "namespace": "OpenShift project or Kubernetes namespace",
      "fstab": "Optional: Specify fstab file on node.  Default is /etc/fstab"
    },

    "_db_comment": "Database file name",
    "db": "/var/lib/heketi/heketi.db", 数据库位置

    "_loglevel_comment": [
      "Set log level. Choices are:",
      "  none, critical, error, warning, info, debug",
      "Default is warning"
    ],
    "loglevel" : "warning" 修改日志级别
  }
}

说明: heketi有三种executor,分别为mock、ssh、kubernetes,建议在测试环境使用mock,生产环境使用ssh,当glusterfs以容器的方式部署在kubernetes上时,才使用kubernetes。我们这里将glusterfs和heketi独立部署,使用ssh的方式。

创建heketi用户

因为下面的Service服务文件是使用的heketi用户启动的Heketi服务

sudo groupadd --system heketi 
sudo useradd -s /sbin/nologin --system -g heketi heketi

使用ed25519加密方法生成ssh密钥对

因为rsa加密方法在最新版openssh被禁用了

root@node1:~# ssh-keygen -t ed25519

复制master节点的公钥到GlusterFS的各个服务器上

ssh-copy-id root@192.168.202.201
ssh-copy-id root@192.168.202.202
ssh-copy-id root@192.168.202.203

master节点上复制私钥到/etc/heketi目录

root@node1:~# cp .ssh/id_ed25519 /etc/heketi/heketi_key

为 Heketi 创建服务文件

tee  /etc/systemd/system/heketi.service <<EOF
[Unit]
Description=Heketi Server

[Service]
Type=simple
WorkingDirectory=/var/lib/heketi
EnvironmentFile=-/etc/heketi/heketi.env
User=heketi
ExecStart=/usr/local/bin/heketi --config=/etc/heketi/heketi.json
Restart=on-failure
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target
EOF

修改文件权限

/etc/heketi及/var/lib/heketi目录所有者是root, 但是安装提供的service文件的user又是heketi. 导致不修改权限就是启动不起来,因此需要修改权限再启动服务。

chown heketi:heketi /etc/heketi/ -R 
chown heketi:heketi /var/lib/heketi -R

创建数据库文件

root@node1:~# touch /var/lib/heketi/heketi.db

启动Heketi Server

root@node1:~# systemctl daemon-reload
root@node1:~# systemctl start heketi
root@node1:~# systemctl enable heketi

查看Heketi服务启动情况

root@node1:~# systemctl status heketi
● heketi.service - Heketi Server
     Loaded: loaded (/etc/systemd/system/heketi.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-11-26 10:41:42 CST; 1s ago
   Main PID: 60574 (heketi)
      Tasks: 8 (limit: 4516)
     Memory: 6.0M
        CPU: 20ms
     CGroup: /system.slice/heketi.service
             └─60574 /usr/local/bin/heketi --config=/etc/heketi/heketi.json

Nov 26 10:41:42 node1 systemd[1]: Started Heketi Server.
Nov 26 10:41:42 node1 heketi[60574]: Heketi v10.4.0-release-10 (using go: go1.15.14)
Nov 26 10:41:42 node1 heketi[60574]: 2023/11/26 10:41:42 no SSH_KNOWN_HOSTS specified, skipping ssh host verification
Nov 26 10:41:42 node1 heketi[60574]: Listening on port 18080

Heketi使用验证

验证是否可以创建集群

 heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 --json cluster create
{"id":"0268aaa43dd0bd4051bcae3b93e7962c","nodes":[],"volumes":[],"block":true,"file":true,"blockvolumes":[]}

参数说明
--json表示输出时候以json字符串格式输出

删除已创建的集群

root@node1:~# heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 --json cluster delete 747ec7ce501970bafd1e594bf86989f7
Cluster 747ec7ce501970bafd1e594bf86989f7 deleted

添加gluster节点

heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 --json  node add --cluster "0268aaa43dd0bd4051bcae3b93e7962c" --management-host-name 192.168.202.202  --storage-host-name 192.168.202.202  --zone 1

 heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 --json  node add --cluster "0268aaa43dd0bd4051bcae3b93e7962c" --management-host-name 192.168.202.202  --storage-host-name 192.168.202.202  --zone 1
 
 heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 --json  node add --cluster "0268aaa43dd0bd4051bcae3b93e7962c" --management-host-name 192.168.202.203  --storage-host-name 192.168.202.203  --zone 1

查看集群中node列表

root@node1:~# heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080   node list
Id:68488df5848b6bfbe212dde1d9e1073c     Cluster:0268aaa43dd0bd4051bcae3b93e7962c
Id:8759be7fdd397707d860ec9f718056e1     Cluster:0268aaa43dd0bd4051bcae3b93e7962c
Id:f1d9d8bc34de87f1351d2efaa3196a36     Cluster:0268aaa43dd0bd4051bcae3b93e7962c

添加设备

添加GlusterFS集群节点中的设备到Heketi集群

heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080   device add --name "/dev/nvme0n3" --node 8759be7fdd397707d860ec9f718056e1
Device added successfully

heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080   device add --name "/dev/nvme0n3" --node 68488df5848b6bfbe212dde1d9e1073c
Device added successfully

heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080   device add --name "/dev/nvme0n3" --node f1d9d8bc34de87f1351d2efaa3196a36
Device added successfully

验证磁盘添加情况

root@node1:~# heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080  topology info

Cluster Id: 0268aaa43dd0bd4051bcae3b93e7962c

    File:  true
    Block: true

    Volumes:


    Nodes:

        Node Id: 68488df5848b6bfbe212dde1d9e1073c
        State: online
        Cluster Id: 0268aaa43dd0bd4051bcae3b93e7962c
        Zone: 1
        Management Hostnames: 192.168.202.202
        Storage Hostnames: 192.168.202.202
        Devices:
                Id:c96a2115ec2fe84184cd3da7b586f88c   State:online    Size (GiB):19      Used (GiB):0       Free (GiB):19      
                        Known Paths: /dev/disk/by-id/nvme-eui.5d61a68862036f32000c29619df89930 /dev/disk/by-diskseq/3 /dev/disk/by-path/pci-0000:0b:00.0-nvme-3 /dev/disk/by-id/nvme-VMware_Virtual_NVMe_Disk_VMware_NVME_0000 /dev/nvme0n3

                        Bricks:

        Node Id: 8759be7fdd397707d860ec9f718056e1
        State: online
        Cluster Id: 0268aaa43dd0bd4051bcae3b93e7962c
        Zone: 1
        Management Hostnames: 192.168.202.201
        Storage Hostnames: 192.168.202.201
        Devices:
                Id:ba1b06d03d16c07c21b817eb55e93ea8   State:online    Size (GiB):19      Used (GiB):0       Free (GiB):19      
                        Known Paths: /dev/disk/by-path/pci-0000:0b:00.0-nvme-3 /dev/disk/by-id/nvme-eui.8b9abff5ba7db3e7000c2965767ca009 /dev/disk/by-id/nvme-VMware_Virtual_NVMe_Disk_VMware_NVME_0000 /dev/disk/by-diskseq/3 /dev/nvme0n3

                        Bricks:

        Node Id: f1d9d8bc34de87f1351d2efaa3196a36
        State: online
        Cluster Id: 0268aaa43dd0bd4051bcae3b93e7962c
        Zone: 1
        Management Hostnames: 192.168.202.203
        Storage Hostnames: 192.168.202.203
        Devices:
                Id:e639ba3204d6ad137920e8eaf20c6536   State:online    Size (GiB):19      Used (GiB):0       Free (GiB):19      
                        Known Paths: /dev/disk/by-id/nvme-eui.304e0491fdf8142a000c29658e2f2350 /dev/disk/by-id/nvme-VMware_Virtual_NVMe_Disk_VMware_NVME_0000 /dev/disk/by-diskseq/3 /dev/disk/by-path/pci-0000:0b:00.0-nvme-3 /dev/nvme0n3

                        Bricks:

测试通过Heketi在GlusterFS集群中添加volume

创建一个复制卷,卷的大小为5G

root@node1:~# heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 volume create --size=5 --replica=2
Name: vol_96caf17e6de1fdfc094083d0fe4dc0fb
Size: 5
Volume Id: 96caf17e6de1fdfc094083d0fe4dc0fb
Cluster Id: 0268aaa43dd0bd4051bcae3b93e7962c
Mount: 192.168.202.202:vol_96caf17e6de1fdfc094083d0fe4dc0fb
Mount Options: backup-volfile-servers=192.168.202.201,192.168.202.203
Block: false
Free Size: 0
Reserved Size: 0
Block Hosting Restriction: (none)
Block Volumes: []
Durability Type: replicate
Distribute Count: 1
Replica Count: 2

验证卷是否创建

root@node1:~# heketi-cli --user admin --secret adminkey --server http://192.168.202.151:18080 volume list
Id:96caf17e6de1fdfc094083d0fe4dc0fb    Cluster:0268aaa43dd0bd4051bcae3b93e7962c    Name:vol_96caf17e6de1fdfc094083d0fe4dc0fb

在GlusterFS集群中查看创建的卷

gluster volume list
vol_96caf17e6de1fdfc094083d0fe4dc0fb

参考文章