使用 Heketi 在 Ubuntu 22.04 上配置 GlusterFS |
GlusterFS 是一款由 Gluster Inc 开发、目前由 Redhat 维护的开源软件。它用于提供对象、块和文件存储接口。它为非结构化数据提供经济实惠且灵活的存储,通常用于高数据密集型工作负载,包括云存储媒体流和 CDN。它可以部署在本地或云端,并支持无数协议,包括 NFS、SMB、CIFS、HTTP 和 FTP
Heketi 可用于通过提供 RESTful 管理界面来管理 Gluster 存储卷的生命周期。这使得 GlusterFS 可以轻松地与 Kubernetes、OpenStack Manila 和 OpenShift 等云服务集成,以实现卷的动态配置。 Heketi 自动确定集群中砖块的位置,将它们及其副本放置在不同的故障域中。它还支持无数的GlusterFS集群,从而可以提供不受单个GlusterFS集群限制的网络文件存储。一般来说,Heketi 使系统管理员可以更轻松地管理或配置块、磁盘或可信存储池。该服务为管理员管理所有硬件,从而实现按需存储的位置。
今天,我们将学习如何使用 Heketi 在 Ubuntu 22.04 上配置 GlusterFS
入门
对于本指南,我们将配置如下所示的环境:
- 3 个用于 GlusterFS 的 Ubuntu 22.04 服务器
- 每台服务器附有3个10GB的辅助磁盘
- 须藤访问
- Heketi 将设置在其中一台服务器上
对于没有 DNS 服务器的用户,可以在每台服务器上的 /etc/hosts 处配置 DNS 解析
$ sudo vim /etc/hosts
192.168.200.90 gluster01.computingforgeeks.com gluster01
192.168.200.91 gluster02.computingforgeeks.com gluster02
192.168.200.92 gluster03.computingforgeeks.com gluster03
1.配置NTP时间同步
在开始之前,所有 3 个服务器上的时间同步非常重要。这可以使用网络时间协议 (NTP) 或 Chrony 守护程序来完成。
为此,请确保已安装 Chrony:
sudo apt -y install chrony
启动并启用服务:
sudo systemctl enable --now chronyd
在所有 3 台服务器上设置时区:
sudo timedatectl set-timezone Africa/Nairobi --adjust-system-clock
sudo timedatectl set-ntp yes
验证更改:
$ timedatectl
Local time: J5 2023-06-14 14:44:50 EAT
Universal time: J5 2023-06-14 11:44:50 UTC
RTC time: J5 2023-06-14 11:44:50
Time zone: Africa/Nairobi (EAT, +0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
2.在Ubuntu 22.04上安装GlusterFS
GlusterFS 存在于默认的 Ubuntu 22.04 存储库中。这使得安装变得如此简单。要在 Ubuntu 22.04 上安装 GlusterFS,请执行以下命令:
sudo apt install glusterfs-server
安装后,确保该服务已启动并启用:
sudo systemctl enable --now glusterd
查看服务的状态:
$ systemctl status glusterd
● glusterd.service - GlusterFS, a clustered file-system server
Loaded: loaded (/lib/systemd/system/glusterd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-06-14 14:46:22 EAT; 4s ago
Docs: man:glusterd(8)
Process: 14472 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid --log-level $LOG_LEV>
Main PID: 14473 (glusterd)
Tasks: 9 (limit: 4617)
Memory: 11.0M
CPU: 1.481s
CGroup: /system.slice/glusterd.service
└─14473 /usr/sbin/glusterd -p /var/run/glusterd.pid --log-level INFO
Jun 14 14:46:21 gluster01.computingforgeeks.com systemd[1]: Starting GlusterFS,
如果您启用了防火墙,请允许该服务通过:
sudo ufw allow 24007/tcp
一旦在所有 3 个节点上完成安装,我们将探测集群中的其他节点。从一个节点 gluster01 来说,执行以下命令:
# Perform on Node 01
sudo gluster peer probe gluster02
sudo gluster peer probe gluster03
查看状态:
sudo gluster peer status
示例输出:
3.在Ubuntu 22.04上安装Heketi
如前所述,Heketi 将仅安装在集群中的一个节点上。对于本指南,我们将其安装在 gluster01 上。从 GitHub 版本页面下载最新版本的 Heketi。
您还可以使用以下命令提取二进制文件:
wget https://github.com/heketi/heketi/releases/download/v10.4.0/heketi-v10.4.0-release-10.linux.amd64.tar.gz
提取存档:
for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done
将提取的二进制文件复制到您的路径:
sudo cp heketi/{heketi,heketi-cli} /usr/local/bin
现在验证安装:
$ heketi --version
Heketi v10.4.0-release-10 (using go: go1.15.14)
$ heketi-cli --version
heketi-cli v10.4.0-release-10
4.在Ubuntu 22.04上配置Heketi
在使用 Heketi 之前,我们需要进行一些配置。首先,为Heketi创建一个专用用户:
sudo groupadd --system heketi
sudo useradd -s /sbin/nologin --system -g heketi heketi
然后继续为 Heketi 创建配置和数据路径:
sudo mkdir -p /var/lib/heketi /etc/heketi /var/log/heketi
sudo cp heketi/heketi.json /etc/heketi
现在我们可以根据需要修改创建的配置文件:
sudo vim /etc/heketi/heketi.json
在该文件中,有几个可以修改的变量,其中包括:
##Set service port##
"port": "8080"
##Set admin and use secrets##
"_jwt": "Private keys for access",
"jwt": {
"_admin": "Admin has access to all APIs",
"admin": {
"key": "jvd7df8RN7QNeKV1"
},
"_user": "User only has access to /volumes endpoint",
"user": {
"key": "lMPgdZ8NtFNj6jgk"
}
},
##Configure glusterfs executor##
_sshexec_comment": "SSH username and private key file information",
"sshexec": {
"keyfile": "/etc/heketi/heketi_key",
"user": "root",
"port": "22",
"fstab": "/etc/fstab",
......
},
##database path settings
"_db_comment": "Database file name",
"db": "/var/lib/heketi/heketi.db",
....
},
同样在文件中,通过添加 (_) 注释掉以下行,如下所示:
"_sshexec_comment": "SSH username and private key file information",
....
"_xfs_sw": "Optional: Specify number of data disks in the underlying RAID device",
"_xfs_su": "Optional: Specifies a stripe unit or RAID chunk size.",
"_gluster_cli_timeout": "Optional: Timeout, in seconds, passed to the gluster cli invocations",
"_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",
"_kubeexec_comment": "Kubernetes configuration",
"_xfs_sw": "Optional: Specify number of data disks in the underlying RAID device.",
"_xfs_su": "Optional: Specifies a stripe unit or RAID chunk size.",
"_gluster_cli_timeout": "Optional: Timeout, in seconds, passed to the gluster cli invocations",
"_debug_umount_failures": "Optional: boolean to capture more details in case brick unmounting fails",
.....
如果您使用 root 以外的 SSH 用户,请确保您已为 sudo 配置了无密码。完成所需的更改后,保存文件并为提供的用户生成 SSH 密钥,例如 root:
sudo -i
ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
chown heketi:heketi /etc/heketi/heketi_key*
首先,如果使用 root 作为用户,请确保所有 3 台服务器都允许 root 登录:
$ vim /etc/ssh/sshd_config
PermitRootLogin yes
重新启动服务:
sudo systemctl restart sshd
使用以下命令将创建的公钥复制到所有其他 GlusterFS 节点:
for i in gluster01 gluster02 gluster03; do
ssh-copy-id -i /etc/heketi/heketi_key.pub root@$i
done
使用私钥验证从 gluster01 对 GlusterFS 节点的访问:
root@gluster01:~# ssh -i /etc/heketi/heketi_key root@gluster02
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.19.0-41-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
460 updates can be applied immediately.
255 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable
Last login: Wed Jun 14 17:10:36 2023 from 192.168.200.90
root@gluster02:~# exit
这表明 SSH 密钥正在按预期工作。 退出会话并继续进行以下配置。
为 Heketi 创建服务文件:
sudo vim /etc/systemd/system/heketi.service
将这些行添加到文件中:
[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
保存文件并下载环境文件:
sudo wget -O /etc/heketi/heketi.env https://raw.githubusercontent.com/heketi/heketi/master/extras/systemd/heketi.env
为 Heketi 用户分配所有必需的权限:
sudo chown -R heketi:heketi /var/lib/heketi /var/log/heketi /etc/heketi
加载 Heketi 所需的所有内核模块:
for i in dm_snapshot dm_mirror dm_thin_pool; do
sudo modprobe $i
done
重新加载守护进程并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable --now heketi
验证服务是否启动:
$ systemctl status heketi
● heketi.service - Heketi Server
Loaded: loaded (/etc/systemd/system/heketi.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2023-06-14 17:48:36 EAT; 4s ago
Main PID: 4545 (heketi)
Tasks: 7 (limit: 4617)
Memory: 5.7M
CPU: 16ms
CGroup: /system.slice/heketi.service
└─4545 /usr/local/bin/heketi --config=/etc/heketi/heketi.json
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: Heketi v10.4.0-release-10 (using go: go1.15.14)
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: [heketi] INFO 2023/06/14 17:48:36 Loaded mock executor
....
Jun 14 17:48:36 gluster01.computingforgeeks.com heketi[4545]: Listening on port 8080
5. 创建Heketi拓扑文件
在本指南中,我们将使用 Ansible 脚本生成和维护 Heketi 拓扑文件,因为手动编辑 JSON 文件可能很累人。
为了更简单,请在您的系统上安装 Ansible:
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
接下来,创建一个项目文件夹:
mkdir -p ~/projects/ansible/roles/heketi/{tasks,templates,defaults}
现在创建拓扑文件模板:
$ vim ~/projects/ansible/roles/heketi/templates/topology.json.j2
{
"clusters": [
{
"nodes": [
{% if gluster_servers is defined and gluster_servers is iterable %}
{% for item in gluster_servers %}
{
"node": {
"hostnames": {
"manage": [
"{{ item.servername }}"
],
"storage": [
"{{ item.serverip }}"
]
},
"zone": {{ item.zone }}
},
"devices": [
"{{ item.disks | list | join ("\",\"") }}"
]
}{% if not loop.last %},{% endif %}
{% endfor %}
{% endif %}
]
}
]
}
保存此文件并创建一个与定义值匹配的变量文件:
vim ~/projects/ansible/roles/heketi/defaults/main.yml
添加以下行,并根据需要正确替换:
---
# GlusterFS nodes
gluster_servers:
- servername: gluster01
serverip: 192.168.200.90
zone: 1
disks:
- /dev/sdb
- /dev/sdc
- /dev/sdd
- servername: gluster02
serverip: 192.168.200.91
zone: 1
disks:
- /dev/sdb
- /dev/sdc
- /dev/sdd
- servername: gluster03
serverip: 192.168.200.92
zone: 1
disks:
- /dev/sdb
- /dev/sdc
- /dev/sdd
创建 Ansible 任务:
vim ~/projects/ansible/roles/heketi/tasks/main.yml
在文件中,提供以下内容:
---
- name: Copy heketi topology file
template:
src: topology.json.j2
dest: /etc/heketi/topology.json
- name: Set proper file ownership
file:
path: /etc/heketi/topology.json
owner: heketi
group: heketi
创建 Ansible 剧本文件:
vim ~/projects/ansible/heketi.yml
将这些行添加到文件中:
---
- name: Generate Heketi topology file and copy to Heketi Server
hosts: gluster01
become: yes
become_method: sudo
roles:
- heketi
创建主机文件:
$ vim ~/projects/ansible/hosts
gluster01
导航到目录:
cd ~/projects/ansible
查看创建的所有内容:
$ tree
.
├── heketi.yml
├── hosts
└── roles
└── heketi
├── defaults
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
└── topology.json.j2
5 directories, 5 files
现在使用以下命令运行 Ansible playbook:s
ansible-playbook -i hosts --user myuser --ask-pass --ask-become-pass heketi.yml
或者,您可以通过以下命令使用 root 用户或 sudo 无密码用户:
ansible-playbook -i hosts --user myuser heketi.yml
示例输出:
现在您将生成一个拓扑文件,如下所示:
$ cat /etc/heketi/topology.json
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"gluster01"
],
"storage": [
"192.168.200.90"
]
},
"zone": 1
},
"devices": [
"/dev/sdb","/dev/sdc","/dev/sdd"
]
}, {
"node": {
"hostnames": {
"manage": [
"gluster02"
],
"storage": [
"192.168.200.91"
]
},
"zone": 1
},
"devices": [
"/dev/sdb","/dev/sdc","/dev/sdd"
]
}, {
"node": {
"hostnames": {
"manage": [
"gluster03"
],
"storage": [
"192.168.200.92"
]
},
"zone": 1
},
"devices": [
"/dev/sdb","/dev/sdc","/dev/sdd"
]
} ]
}
]
}
6.加载Heketi拓扑文件
一旦通过上述步骤创建了拓扑文件,我们就可以在 Heketi 上加载并使用它。要使用 CI 加载它,请使用以下语法运行命令
heketi-cli topology load --user admin --secret <heketi_admin_secret> --json=/etc/heketi/topology.json
替换 heketi_admin_secret,例如:
heketi-cli topology load --user admin --secret jvd7df8RN7QNeKV1 --json=/etc/heketi/topology.json
示例输出:
现在导出变量:
$ vim ~/.bashrc
export HEKETI_CLI_SERVER=http://heketiserverip:8080
export HEKETI_CLI_USER=admin
export HEKETI_CLI_KEY="Adminsecret"
来源简介:
source ~/.bashrc
现在查看集群:
$ heketi-cli cluster list
Clusters:
Id:e36f3593c6abde17ff69665043765e17 [file][block]
显示可用节点:
$ heketi-cli node list
Id:111dcab88510035789f3551a359e27fe Cluster:e36f3593c6abde17ff69665043765e17
Id:3649b21cb354e55c3588868ddfa7ff92 Cluster:e36f3593c6abde17ff69665043765e17
Id:b9dbcd4773319d28e3f265d6ab6b52b6 Cluster:e36f3593c6abde17ff69665043765e17
您还可以使用以下命令查看节点:
$ sudo gluster pool list
UUID Hostname State
44c4384a-313b-4726-87c7-89622250ab83 gluster02 Connected
d1f8f291-f2cd-4a8b-8b26-91243d192ecf gluster03 Connected
d1f8f291-f2cd-4a8b-8b26-91243d192ece localhost Connected
查看集群的更多详细信息
heketi-cli node info <NODE_ID>
例如:
$ heketi-cli node info 111dcab88510035789f3551a359e27fe
Node Id: 111dcab88510035789f3551a359e27fe
State: online
Cluster Id: e36f3593c6abde17ff69665043765e17
Zone: 1
Management Hostname: gluster03
Storage Hostname: 192.168.200.92
Devices:
Id:1072f75242b8f7cd32d450344c2bf9b4 Name:/dev/sdd State:online Size (GiB):500 Used (GiB):0 Free (GiB):500 Bricks:0
Id:49e832b9834ec185b21960f411891292 Name:/dev/sdc State:online Size (GiB):500 Used (GiB):0 Free (GiB):500 Bricks:0
Id:a8aca352fb2d742e9bda4d04e48877a9 Name:/dev/sdb State:online Size (GiB):500 Used (GiB):0 Free (GiB):500 Bricks:0
为了验证 Gluster 卷是否按预期工作,我们将使用 Heketi 创建一个卷:
# heketi-cli volume create --size=1
Name: vol_e3791aa3f720f8e1e50c3d433326030f
Size: 1
Volume Id: e3791aa3f720f8e1e50c3d433326030f
Cluster Id: e36f3593c6abde17ff69665043765e17
Mount: 192.168.200.92:vol_e3791aa3f720f8e1e50c3d433326030f
Mount Options: backup-volfile-servers=192.168.200.91,192.168.200.90
Block: false
Free Size: 0
Reserved Size: 0
Block Hosting Restriction: (none)
Block Volumes: []
Durability Type: replicate
Distribute Count: 1
Replica Count: 3
查看创建的卷:
# heketi-cli volume list
Id:e3791aa3f720f8e1e50c3d433326030f Cluster:e36f3593c6abde17ff69665043765e17 Name:vol_e3791aa3f720f8e1e50c3d433326030f
要查看拓扑,请执行:
heketi-cli topology info
现在玩具可以继续并根据需要使用 GlusterFS。要将其与 Kubernetes 集成,请按照此处提供的帮助进行操作:
- 使用 Heketi 和 GlusterFS 配置 Kubernetes 动态卷配置
还有许多其他用例,请随意探索。我希望本指南对您很重要。
查看更多:
- 在 CentOS 上使用 Heketi 设置 GlusterFS 存储
- 使用 GlusterFS 和 Heketi 进行 Kubernetes 和 OpenShift 动态卷配置
- 如何创建和删除 GlusterFS 卷