搭建Ceph集群
搭建Ceph集群
部署前准备
机器清单
host | ip地址 | 描述 |
---|---|---|
centos8 | 192.168.1.30(外网)/10.10.1.10(内网) | 为其他机器运行Ansible脚本(部署)、Ceph客户端 |
vm1 | 192.168.1.31/10.10.1.11 | Ceph OSD节点 |
vm2 | 192.168.1.32/10.10.1.12 | Ceph OSD节点 |
vm3 | 192.168.1.33/10.10.1.13 | Ceph OSD节点 |
hosts文件
把机器清单编写为hosts文件。
vim /etc/hosts
1 | 192.168.1.30 centos8 |
防火墙放行
服务名 | 端口号 | 描述 |
---|---|---|
Monitor监视器 | 6789/tcp | 与Ceph集群通信 |
Manager | 7000/tcp | Ceph管理面板 |
8003/tcp | Ceph Restful API管理 with HTTPS | |
9283/tcp | Prometheus插件通信接口 | |
OSD | 6800-7300/tcp | 每个OSD在这个范围内使用3个端口,一个用来与客户端和监视器进行通信,一个用来与集群中其他的OSD进行通信 |
RADOS 网关 | 7480/tcp | 默认RADOS网管端口为7480,你可以修改为80/443(如果使用TLS) |
如果你使用firewalld来管理你的防火墙,可以执行下面的命令放行端口:
firewall-cmd --add-service=ceph --add-service=ceph-mon --permanent && firewall-cmd --reload
创建部署Ceph的用户
ceph-deploy
工具必须以普通用户登录,且此用户拥有无密码使用 sudo 的权限,因为它需要安装软件及配置文件,中途不能输入密码。
较新版的 ceph-deploy
支持用 --username
选项提供可无密码使用 sudo 的用户名(包括 root ,虽然不建议这样做)。要用 ceph-deploy --username {username}
命令,指定的用户必须能够通过无密码 SSH 连接到 Ceph 节点,因为 ceph-deploy 不支持中途输入密码。
从 Infernalis 版起,用户名 “ceph” 保留给了 Ceph 守护进程。如果 Ceph 节点上已经有了 “ceph” 用户,升级前必须先删掉这个用户。
在各个Ceph节点创建新用户
1 | ssh username@ceph-server |
配置sudo权限
1 | echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username} |
配置ssh-key免密登录
在centos8机器中创建密钥对,但是不要用sudo或root用户。口令为空。
ssh-keygen
全部默认配置,直接回车生成key。
现在将centos8机器的ssh公钥发送到vm[1:3]的机器上。
把公钥拷贝到各 Ceph 节点,把下列命令中的 {username}
替换成前面创建部署 Ceph 的用户里的用户名。
1 | for i in 1 2 3 |
如果使用ceph-deploy
工具部署集群推荐使用以下方式配置免密登录
修改 ceph-deploy
管理节点上的 ~/.ssh/config
文件,这样 ceph-deploy
就能用你所建的用户名登录 Ceph 节点了,无需每次执行 ceph-deploy
都指定 --username {username}
。这样做同时也简化了 ssh 和 scp 的用法。把 {username}
替换成你创建的用户名。注意要将~/.ssh/config
文件权限修改为0600。
1 | Host node1 |
配置NTP
集群之间机器的时间应该保持同步,需要使用NTP服务同步时间。
如果不了解NTP服务及搭建,请参考搭建NTP服务和配置客户端
配置SELinux
在 CentOS 和 RHEL 上, SELinux 默认开启为 Enforcing
。为简化安装,我们建议把 SELinux 设置为 Permissive
或者完全禁用,也就是在加固系统配置前先确保集群的安装、配置没问题。用下列命令把 SELinux 设置为 Permissive
:
sudo setenforce 0
要使 SELinux 配置永久生效,需修改其配置文件/etc/selinux/config
。
使用Ansible部署Ceph集群
使用centos8作为Ansible部署节点,为其他机器安装服务。
使用ceph-ansible来部署集群
在centos8机器上执行 yum install ceph-ansible -y
复制ceph-ansible目录到家目录下 cp -r /usr/share/ceph-ansible /home/student/ && cd /home/student/ceph-ansible
配置ansible.cfg vim ansible.cfg
1 | [defaults] |
配置inventory vim inventory
1 | [mons] |
测试一下连通性 ansible all -m ping
,返回结果如下:
1 | vm3 | SUCCESS => { |
配置group_vars变量:
配置 all.yml group_vars变量:
拷贝all.yml变量 cp group_vars/all.yml.sample group_vars/all.yml
编辑变量文件 vim group_vars/all.yml
1 | fetch_directory: ~/ceph-ansible-keys |
配置 osds.yml group_vars变量:
在这里配置OSD存储相关设置
cp group_vars/osds.yml.sample group_vars/osds.yml
先来查看server[c:e]中空闲磁盘的名称,发现在这三台机器中都有/dev/vd[b:d]三块21.5G空闲磁盘未被使用。所以在配置OSD时使用这三台机器的/dev/vd[b:d]空闲磁盘作为OSD存储空间。
ssh ceph@vm1
sudo fdisk -l
1 | Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors |
vim group_vars/osds.yml
1 | copy_admin_key: true |
配置site.yml Playbook
cp site.yml.sample site.yml
运行Playbook开始部署
请确保当前目录在ceph-ansible
目录下。
执行 ansible-playbook site.yml
开始部署Ceph基础集群。
等待一段时间后Ansible返回执行结束结果,没有机器存在failed则表明配置成功。
1 | PLAY RECAP ****************************** |
之后可以验证部署结果
部署Ceph客户端
如果要控制Ceph集群,现在只能通过在部署了Ceph集群节点上区管理集群。注意,我们最开始是从centos8上搭建的,那么现在也想要在centos8上部署Ceph客户端以此能够在centos8上就可以控制整个Ceph集群。
复制group_vars变量 cp group_vars/clients.yml.sample group_vars/clients.yml
编辑复制好的clients.yml变量,开启copy_admin_key
即可:
1 |
|
编辑inventory主机清单文件,在其中加入clients项。
vim inventory
1 | server[c:e] |
运行Playbook:
ansible-playbook site.yml --limit=clients
仅限制运行主机清单中clients组即可!节省时间。
如果一切部署顺利,Playbook执行结束后会在结果处返回failed=0。
现在切换到centos8上的ceph用户,尝试执行ceph -s
命令,没有异常的情况下可以正常读取到Ceph集群的信息了。我们没有在centos8上配置OSD或者MON,仅仅是把它作为控制Ceph的客户端,目前centos8具有admin的权限。
验证部署结果
现在ssh登陆vm1这台机器上,接下来执行ceph的相关命令来检测刚刚的配置详情。
ssh ceph@vm1
ceph -s
查看集群概况及状态
1 | [ceph@vm1 ~]$ ceph -s |
如果配置成功,此时执行 ceph -s
命令后。可以看到health: HEALTH_OK
字样,这表明集群现在是健康的状态。
输出结果的services
中可以看到osd: 9 osds: 9 up, 9 in
,表明这三台机器一共9个OSD都在正常的运行着。
输出结果data
中包含usage: 966 MB used, 169 GB / 170 GB avail
,可以看得到我们一共有170G的存储空间,目前剩余169GB空间可用,已经使用966MB空间。
如果此时停止vm1这台机器上的ceph-mon.target服务,会发现集群状态变成了HEALTH_WARN状态。重启ceph-mon.target服务后不久集群状态又会恢复。
刚刚搭建好了Ceph OSD集群,如果停止掉一个OSD进程看看有什么效果?
在vm1上使用ceph osd tree
查看vm1上osd信息
发现在vm1上运行3个osd进程,分别是osd.0,osd.3,osd.8 。现在我们人为干预宕掉vm1上的osd.3之后看看集群有什么反应。
sudo systemctl stop ceph-osd@8.service
恢复osd.8运行 sudo systemctl start ceph-osd@8.service
使用ceph-deploy
搭建集群
使用ceph-deploy
搭建集群前,请确保已经完成准备工作,并且创建了一个Ceph集群用户
安装ceph-deploy
注意:如果是在Centos8上,要开启epel源。这里是用阿里的镜像源加速。
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install ceph-deploy
配置Ceph国内源
vim /etc/yum.repos.d/ceph.repo
1 | [ceph] |
注意:当使用
ceph-deploy install
的时候,务必这样用:ceph-deploy install –repo-url http://mirrors.aliyun.com/ceph/rpm-octopus/el8/
ceph-deploy install centos8 vm1 vm2 vm3
(官方的方法是:ceph-deploy install admin-node node1 node2 node3
)因为这个ceph-deploy在安装过程中会自动帮你修改repo,所以需要用–repo-url来拒绝这个改动,我安装的是jewel发行版,可根据实际需要修改为最新的
查看安装的Ceph版本
ceph -v
1 | [ceph@vm1 ~]$ ceph -v |
使用Cephadm
部署集群
Cephadm通过在单个主机上的引导,再拓展其他的主机加入集群,部署所欲要的服务来达到创建一个新的Ceph集群。
cephadm使用容器的方式部署Ceph集群,所以需要额外准备以下要求与环境:
- systemd
- Podman或Docker容器支持
- 时间同步(NTP)
- 用于供应存储设备的LVM2
安装Cephadm
cephadm可以引导一个全新的集群,控制容器化下的Ceph集群,以及调试Ceph守护程序。
如果是RHEL系系统使用yum或dnf即可安装cephadm:
dnf install -y cephadm
引导部署一个全新的集群
此时,需要知道Ceph集群中提供第一个监视器mon的服务器IP地址。通常来说这是第一台的主机IP,如果有多个网络和接口,应该选择一个确保能连接到所有集群内主机的一个网络接口。
引导集群
mkdir -p /etc/ceph
cephadm bootstrap --mon-ip *<mon-ip>*
执行这条命令后会执行如下操作:
- 为本地集群创建监视器和管理器的守护进程
- 为集群生成一个新的SSH Key文件并且在
/root/.ssh/authorized_keys
文件中添加一个root认证用户 - 生成一个与新集群通信的最小化配置文件
/etc/ceph/ceph.conf
- 写入Ceph用户认证用户
client.admin
的密钥环到/etc/ceph/ceph.client.admin.keyring
- 将公钥副本写入
/etc/ceph/ceph.pub
如上,执行引导命令:
cephadm bootstrap --mon-ip 192.168.1.30
完成部署Ceph容器后,会生成如下信息。其中包括了Dashboard的登录地址以及随机生成的用户信息
1 | INFO:cephadm:Ceph Dashboard is now available at: |
现在一个简单的基础Ceph集群建立完成,接下来会添加其他机器节点并分别部署Ceph任务 。
使用 Ceph 命令行
Cephadm并不会在主机上安装任何Ceph软件包,因为它会使用容器管理工具创建容器,将Ceph部署在容器中。那么如果在机器上想要访问Ceph容器并执行Ceph命令的话有如下几种方式可以实现:
cephadm shell
命令可以在安装了Ceph的容器中启动一个shell。默认情况下,如果在/etc/ceph
目录下找到配置文件和密钥环文件,他们就会被传入到Ceph容器环境中,这样可以使用Ceph shell的功能。注意:如果在cephadm shell
在部署了MON节点的机器上安装,那么它会使用Ceph MON容器内的配置文件来代替默认默认配置文件。cephadm shell
创建alias别名:
alias ceph='cephadm shell -- ceph'
echo "alias ceph='cephadm shell -- ceph'" >> /etc/profile.d/colorls.sh
source /etc/profile.d/colorls.sh
现在可以直接使用ceph
命令进行操作:
ceph -v
1 | INFO:cephadm:Inferring fsid c50990c4-d1b9-11ea-9884-000c29c91658 |
确认ceph命令可以连接到集群并且可以查看他们的状态:
ceph status
将主机添加到集群
添加主机到集群中需要两步:
在新主机的root用户的
authorized_keys
文件中添加添加SSH公钥。ssh-copy-id -f -i /etc/ceph/ceph.pub root@vm1
ssh-copy-id -f -i /etc/ceph/ceph.pub root@vm2
ssh-copy-id -f -i /etc/ceph/ceph.pub root@vm3
告知Ceph集群添加新节点主机:
ceph orch host add vm1
ceph orch host add vm2
ceph orch host add vm3
1 | [root@centos8 ~]# ceph orch host add vm3 |
添加MON监控节点
一个Ceph集群应该有1、3、5奇数个MON监控节点(投票选举)分布在不同的主机上。如果集群中有5个或以上的主机节点,推荐部署5个MON监控节点。
当指定给Ceph告知MON监视器使用哪个IP子网时,那么在添加新的集群MON节点时会自动使用该子网自动部署。在默认情况下,Ceph假定其他监视器的子网与集群内第一台监视器MON节点的IP在同一个子网下。
如果Ceph的mon监视器在单个子网中,cephadm会在添加节点时默认自动的在集群中最多部署5个MON节点,不需要人工干预。
如果你指定MON监视器使用的子网,那么可以执行下面的命令配置:
ceph config set mon public_network 192.168.1.0/24
之后添加的MON节点会自动的在该子网内工作。
调整默认的MON监视器数量(默认为5个):
ceph orch apply mon 3
指定在一组主机桑拿部署Ceph的mon监视器:
ceph orch apply mon *<host1,host2,host3,...>*
ceph orch apply mon vm1,vm2,vm3
确保此处mon部署节点中包括了引导节点(本机节点)
罗列当前集群内的全部主机
ceph orch host ls
1
2
3
4HOST ADDR LABELS STATUS
vm1 vm1
vm2 vm2
vm3 vm3你可以为某个主机这只标签进行标记,比如在此处就可以编辑合适的标签给刚刚添加的那三台主机。
1
2orch host label add <hostname> <label>
orch host label rm <hostname> <label>ceph orch host label add vm1 mon
ceph orch host label add vm1 cephadm
添加标签后再重新罗列集群内主机节点:
ceph orch host ls
1
2
3
4HOST ADDR LABELS STATUS
vm1 vm1 mon cephadm
vm2 vm2 mon
vm3 vm3 mon
添加OSD节点
显示当前主机集群内主机可用的存储设备列表,添加主机到节点中请参考将主机添加到集群:
ceph orch device ls
在我当亲添加的三台主机中,存储设备列表如下,其中包含了可以用作OSD部署的设备以及他们的容量等基本信息:
1 | HOST PATH TYPE SIZE DEVICE AVAIL REJECT REASONS |
如果满足以下所有条件,则认为存储设备可以部署OSD:
- 设备必须没有分区。
- 设备不得具有任何LVM状态。
- 不得安装设备。
- 该设备不得包含文件系统。
- 该设备不得包含Ceph BlueStore OSD。
- 设备必须大于5GB
部署OSD节点:
自动发现可用的存储设备:
ceph orch apply osd --all-available-devices
不过我自己在使用上面这个命令时并没有得到任何输出…
在特定主机上创建OSD:
ceph orch daemon add osd *<host>*:*<device-path>*
ceph orch daemon add osd vm2:/dev/nvme0n2,/dev/nvme0n2
或者写一个脚本批量添加某一节点上的OSD节点:
1
2
3
4for i in 2 3 4
> do
> ceph orch daemon add osd vm3:/dev/nvme0n$i
> done
查看已添加的Ceph的OSD节点:
ceph osd tree
删除OSD节点
ceph orch osd rm <svc_id>... [--replace] [--force]
如果要删除1234这四个OSD节点则执行下面的命令:
ceph orch osd rm 1 2 3 4
之后可以执行ceph orch osd rm status
查询删除状态。当被移除的OSD中没有PG时,则会将它正式的下架。