0%

Ceph块设备 对RBD块设备操作LVM创建PV时报错

当映射好了RBD映像中后,要在其上创建LVM逻辑卷,在执行pvcreate时出错。报错如下:

[root@ceph-master ceph]# pvcreate /dev/rbd0
/dev/sdd: open failed: No medium found
Device /dev/rbd0 excluded by a filter.

可以看到执行创建PV时被过滤器拦截掉了,这是因为默认情况下LVM不支持rbd设备类型,那么在LVM过滤器配置中手动添加RBD类型即可。

调试模式查看详细信息:

# pvcreate -vvvv /dev/rbd0 &> /tmp/out
# less /tmp/out
....
#filters/filter-type.c:27 /dev/rbd0: Skipping: Unrecognised LVM device type 252
....

查看设备类型ID

cat /proc/devices

可以找到rbd设备类型ID编号为252,记住它后接下来在LVM过滤器配置文件中添加它。

修改LVM过滤器配置文件

vim /etc/lvm/lvm.conf

找到types参数,将rbd和252修改为如下配置:

...
# Configuration section devices.
# How LVM uses block devices.
devices {
...
# Configuration option devices/types.
# List of additional acceptable block device types.
# These are of device type names from /proc/devices, followed by the
# maximum number of partitions.
#
# Example
types = [ "rbd", 252 ]
#
# This configuration option is advanced.
# This configuration option does not have a default value defined.
...

现在尝试重新添加rbd设备作为PV:

pvcreate /dev/rbd0

现在可以成功在RBD块设备上执行创建PV操作了。

Ceph 映射RBD块设备

前提准备

你需要有一个运行着的Ceph集群,并且已创建好了一个Pool池,以此来创建新的RBD映像。

Pool池名称:rbd

Namespace命名空间名称:42team

要创建的RBD镜像名:42team.dev.yeefire.com.100G.img

新建块设备

创建块设备首先要创建Pool池,关于Pool池的创建如果你还不知道的话可以先看看这篇文章:OSD与Pool池的常见操作及管理

创建Pool池:ceph osd pool create rbd 16 16

新创建的Pool池如果要用于RBD映像存储的话最好先对其初始化并对这个Pool池设置rbd应用:

  • 初始化Pool池用于RBD存储:rbd pool init rbd
  • 为rbd池设置app应用,并标记rbd应用:ceph osd pool application enable rbd rbd

创建命名空间(非必要操作)

命名空间的存在是方便对一个存储池Pool进行更细化的用户访问控制,这样可以少创建一些存储池,使用池中命名空间来对用户进行隔离。

如果你想了解如何使用cephx认证配合命名空间对用户限制访问池中资源,请阅读:Ceph用户管理

为rbd池创建名为42team的命名空间:namespace create -p rbd --namespace 42team

创建RBD映像

到这一步为止,你已经做了如下操作:

  • 有一个正常状态的Ceph存储集群
  • 创建了一个名为rbd的存储池
  • 将rbd存储池的application应用设置为rbd
  • 可选:(为rbd池创建名为42team的命名空间)
  • 可选:(创建一个cephx认证用户,并将这个用户的osd能力限制在rbd池中的42team命名空间内)

接下来开始创建一个RBD映像

rbd create -p rbd --namespace 42team --size 100G 42team.dev.yeefire.com.100G.img

查看创建的rbd映像

rbd ls -p rbd --namespace 42team

映射RBD映像到内核模块

用 rbd 把映像名映射为内核模块。必须指定映像名、存储池名、和用户名。若 RBD 内核模块尚未加载, rbd 命令会自动加载。

例如要将rbd池中42team命名空间的42team.dev.yeefire.com.100G.imgRBD映像映射到本机:

rbd device map -p rbd --namespace 42team --image 42team.dev.yeefire.com.100G.img

至此挂载RBD映像成功,如果要查看本机已挂载的RBD映像可以执行:

rbd device ls

Nginx反向代理下载传输超过1G大文件时断开问题

问题描述

42Team社团上线下载站,使用Nginx反向代理为用户提供服务。问题的现象是当用户下载文件超过1G大小时出现断开下载连接的情况导致下载失败。

问题分析

一开始以为是Flask的流传输出了问题,调试并跟踪代码后并没有发现问题,而且直接在本地代码调试下载大文件不会出现断开情况。那么开发环境与生产环境中只相差了中间有一层Nginx反向代理,那么初步问题定位到Nginx的反向代理配置上。

经过在网上进行搜索“反向代理下载大文件失败断开连接”等关键字后找到了一篇其他人写的博文,遇到过类似的问题。

发现可能是因为超时的原因导致,因为反向代理服务器和部署下载站服务的服务器之间的网络传输速度和磁盘性能非常好,所以他们之间传递1G以上的大文件仅仅有几秒的时间,而Nginx反向代理服务器将文件传输到用户端可能需要数分钟或数十分钟,由于这之间的时间差非常大,所以超过了Nginx的默认连接超时时间,导致此问题发生

问题解决

禁用缓存

禁用缓存,客户端的每次清求都转发到被代理服务器,做法是在代理服务器的Nginx配置里面添加:

proxy_pass http://172.17.8.88:5050/;
proxy_redirect default;
proxy_buffering off;

加大Nginx服务器与另一服务器之间的超时等待时间

keepalive_timeout 15;
send_timeout 3600;

Nginx反向代理导致大文件下载失败

Ceph块设备

块是一个字节序列(例如,一个512字节的一块数据),基于块的存储接口是最常见的存储数据方法,他们基于旋转媒体,类似于硬盘、CD、软盘、甚至传统的磁带。无处不在的块设备接口使得虚拟块设备成为与Ceph这样海量存储系统交互的理想之选。

Ceph块设备是瘦接口、大小可以调整且数据被条带化存储在Ceph集群内的多个OSD上。Ceph块设备均衡多个RADOS的能力,快照、复制和一致性,Ceph的RADOS块设备用内核模块或librbd库与各个OSD交互。

ceph-block-rados-2020-08-03

Ceph 块设备靠无限伸缩性提供了高性能,如向内核模块、或向 abbr:KVM (kernel virtual machines) (如 QEMU 、依赖 libvirt 和 QEMU 的 OpenStack 和 CloudStack 云计算系统都可与 Ceph 块设备集成)。可以用同一个集群同时运营 Ceph RADOS 网关、 CephFS 文件系统、和 Ceph 块设备。

块设备的基本操作

rbd命令可以用于创建、罗列、自检和删除块设备的映像。当然也可以对映像进行克隆、创建快照并支持回滚等。

创建一个块设备存储池

在管理节点上,用ceph命令创建一个Pool池。了解更多关于Pool池可以访问OSD与Pool池的常见操作及管理

ceph osd pool create rbd 64 64

成功创建一个Pool后使用rbd工具再对这个Pool池进行初始化用于RBD。

rbd pool init <pool-name>

此处将新创建的rbdPool池进行初始化

注意:在接下来使用rbd的命令时如果需要填写<pool-name>参数的地方为空没有填写,那么默认会查找Pool池名为rbd并使用它。

创建块设备用户(非必须)

如果不指定用户的话,使用rbd命令会默认使用admin管理员访问Ceph集群,admin的用户权限最大,不应该分配给其他机器。所以最好创建一个权限尽可能小的用户访问块设备池。

osd 'allow {access-spec} [{match-spec}] [network {network/prefix}]'

osd 'profile {name} [pool={pool-name} [namespace={namespace-name}]] [network {network/prefix}]'

如果要了解更多Ceph用户有关信息,可以访问阅读Ceph用户管理

创建块设备映像

如果想要将块设备添加到某一节点,你需要先在Pool中创建一个映像文件。

rbd create --size {megabytes} {pool-name}/{image-name}

例如,在rbd这个Pool池中创建一个名为42team-webnode.img,大小为20G的一个映像:

rbd create --size 20G --pool rbd --image 42team-webnode.img

罗列磁盘映像

要罗列rbdPool存储池中的全部映像,使用下面的命令:

rbd ls {poolname}

{poolname}如果不填写,则默认使用rbd存储池。

检索映像信息

使用下面的命令来检索某一个映像的信息:

rbd info {pool-name}/{image-name}

{poolname}如果不填写,则默认使用rbd存储池。

rbd info rbd/42team-webnode.img

返回结果:

[root@vm1 ~]# rbd info rbd/42team-webnode.img
rbd image '42team-webnode.img':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 17382bc345839
block_name_prefix: rbd_data.17382bc345839
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Aug 3 11:03:56 2020
access_timestamp: Mon Aug 3 11:03:56 2020
modify_timestamp: Mon Aug 3 11:03:56 2020

调整块设备映像大小

Ceph块设备是瘦接口设备,只有真正写入了数据后才开始占据物理空间,直到限制到它最大的存储大小,他们的最大存储容量就是设置的--size选项的值。如果需要增加或减少Ceph块设备的存储最大尺寸,使用下面的命令:

缩小映像最大尺寸

如果要缩小块设备的映像最大存储尺寸,需要添加--allow-shrink选项,才允许缩小映像尺寸。

rbd resize -p rbd --image 42team-webnode.img -s 5G --allow-shrink

如果已使用的存储尺寸大于要缩减之后的尺寸,强行缩减块设备映像尺寸会导致数据丢失!

扩大映像最大尺寸

rbd resize -p rbd --image 42team-webnode.img -s 25G

删除块设备映像

你可以直接将块设备中的映像删除,或者先将他们移动到垃圾桶中,等待一段时间删除或者手动进行清理。

直接删除块设备映像

rbd rm {pool-name}/{image-name}

rbd rm 42team-webnode.img

{poolname}如果不填写,则默认使用rbd存储池。

延期删除映像

延期删除可以现将要删除的映像存放到垃圾池中,即便他有快照或者正被克隆的镜像引用者也可以被放入到垃圾桶池中,但是不能将他们从垃圾池中删掉。

你可以用 –expires-at 设置延期时间(默认为 now ),并且,它的延期时间没到的话是不能删除的,除非你用 –force 选项。

rbd trash mv {pool-name}/{image-name}

rbd trash mv rbd/42team-webnode.img

rbd trash mv restore-42team-webnode.img --expires-at "20200805"

之后可以通过rbd trash ls --long查看放入到垃圾池的映像有哪些,如果设立日期保护的话还可以看到保护到期的时间。

还原块设备映像

当你突然醒悟不该放弃某个映像时,你当然可以从垃圾池中将映像还原!但是前提时你将它放入到了垃圾池而不是直接删除掉他们。

rbd trash restore {pool-name}/{image-id}

在还原映像时需要使用image-id进行还原。可以使用rbd trash ls查看image映像id。

[root@vm1 ~]# rbd trash ls
17382bc345839 42team-webnode.img
[root@vm1 ~]#

rbd trash restore 17382bc345839 --image restore-42team-webnode.img

在还原的同时,还可以指定--image选项对垃圾池内的映像重命名。

彻底删除在垃圾池中的映像

rbd trash rm {pool-name}/{image-id}

使用rbd trash rm命令可以将在垃圾池中的映像彻底删除,如果你设置了延期时间–expires-at ,那么没到延期时间内直接删除是不可以的,除非使用 –force 选项强制删除。

拍摄镜像快照

快照是某映像在一个特定时间点的一份只读副本。Ceph块设备的一个高级功能是可以为映像创建快照来保留历史。Ceph也支持分层快照,这样可以更快速的的克隆一个映像(如VM映像)。Ceph的快照功能还支持rbd命令和多种高级接口,包括 QEMU 、 libvirt 、 OpenStack 和 CloudStack

因为RBD不关心文件系统,如果没有与map挂载着的计算机协调的话,快照就是crash-consistent的。所以,在拍摄快照前应该将这个映像的I/O操作暂停,如果这个映像还包含文件系统,在拍摄这个包含文件系统的映像前系统还必须处于一致性状态,否则就要用fsck来修复它了…

可以使用fsfreeze命令冻结I/O。对于虚拟机来说,qemu-guest-agent 可在创建快照时自动冻结文件系统。

ceph-snap-ins-2020-08-06

快速操作快照

接下来的过程演示了如何用 rbd 命令创建、罗列、和删除快照。

创建快照

rbd snap create命令创建快照,需要声明存储池名和映像名。

rbd snap create {pool-name}/{image-name}@{snap-name}

如为rbd/5G.img拍摄快照:

rbd snap create 5G.img@2008050810

罗列快照

要列出某一个映像的快照,需要指定存储池名和映像名。

rbd snap ls {pool-name}/{image-name}

例如:

rbd snap ls 5G.img

[root@vm1 ~]# rbd snap ls 5G.img
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 2008050810 5 GiB Wed Aug 5 08:10:55 2020

回滚快照

要用rbd回滚到某一快照,使用rbd snap rollback命令。回滚快照时要求该映像不能处于map状态!不应该有任何资源占用这个映像。

rbd snap rollback {pool-name}/{image-name}@{snap-name}

例如:

rbd snap rollback 5G.img@2008050810

把映像回滚到一快照的意思是,用快照中的数据覆盖映像的当前版本,此过程花费的时间随映像尺寸增长。从快照克隆要快于回滚到某快照。这也是回到先前状态的首选方法。

删除快照

删除某映像的一个快照

使用rbd snap rm命令删除某一映像的快照:

rbd snap rm rbd/5G.img@2008050810

删除后可以再查看一下当前快照,检查是否成功删除:

rbd snap ls rbd/5G.img

删除某映像的全部快照

当你要删除一个映像的全部快照时,使用rbd snap purge命令:

rbd snap purge {pool-name}/{image-name}

rbd snap purge rbd/5G.img

克隆快照映像

可以克隆一个映像,在原有映像基础之上建立新的分支。不过需要了解分层的概念,想要克隆一个快照必须先创建快照,并且将其保护,之后才能克隆快照。

了解分层

ceph-clone-2020-08-06

Ceph 块设备的分层是个简单的过程。你必须有个映像、必须为它创建快照、必须保护快照,执行过这些步骤后,你才能克隆快照。

克隆出的映像包含到父快照的饮用、存储池ID、映像ID和快照ID。包含存储池ID意味着你可以把存储池内的快照克隆到别的存储池中。

分层可以应用于以下方面:

  • 映像模版:块设备分层的一个常见用法是创建一个主映像及其快照,并作为模版以供克隆。例如管理员会创建一个Linux发行版的映像,之后周期性的升级维护(比如执行了dnf update操作之后等)。等映像文件稳定可用后,用户可以克隆任意快照。
  • 拓展模板:更高级的用法包括拓展映像模板,让它包含比基础映像更多的信息。例如,首先可以克隆一个基础映像,然后再此基础之上安装新的软件包(如数据库、博客平台、内容管理系统等),之后在此拓展上再次创建快照,拍下的快照可以像基础映像一样更新。
  • 模版存储池:块设备分层的一种用法是创建一个存储池,其中包含作为模版的主映像和那些模版快照。然后把只读权限分给用户,这样他们就可以克隆快照了,而无需分配此存储池内的写和执行权限。
  • 映像迁移/恢复:块设备分层的一种用法是把以存储池内的数据迁移或恢复到另一个存储池。

保护快照

克隆的映像要访问父快照。如果那个用户不小心删除掉了父快照,那么所有依赖这个父快照的克隆映像都会损坏。为了防止数据丢失,必须先保护快照,然后再当作父快照进行克隆。

rbd snap protect {pool-name}/{image-name}@{snapshot-name}

如下:

rbd snap protect 5G.img@202008051308

之后查看该映像的所有快照:

rbd snap ls 5G.img

[root@vm1 ~]# rbd snap ls 5G.img
SNAPID NAME SIZE PROTECTED TIMESTAMP
10 202008051308 5 GiB yes Wed Aug 5 13:08:03 2020
11 202008051309 5 GiB Wed Aug 5 13:08:05 2020
12 2020080513010 5 GiB Wed Aug 5 13:08:10 2020

可以看到刚刚被保护的快照,在此处有了标记,接下来尝试能否删除这个快照:

rbd snap rm 5G.img@202008051308

ceph-snap-protect-rm-2020-08-06

结果显而易见,当快照被保护的情况下是不允许被删除的。这样我们就可以在这个快照的基础上进行克隆全新的映像!

克隆映像快照

要克隆快照,你得指定父存储池、映像、和快照,还有子存储池和映像名。克隆前必须先保护快照,否则不允许克隆。

rbd clone {pool-name}/{parent-image}@{snap-name} {pool-name}/{child-image-name}

例如克隆我们刚刚保护的那个快照,并且把克隆后的映像叫做5G_new.img:

rbd clone 5G.img@202008051308 rbd/5G_new.img

你可以把一存储池中的映像的快照克隆到另一个存储池。例如,你可以把一存储池中的只读映像及快照当作模版进行维护,之后(比如映像调试完毕后)可以将其克隆到另一个存储池中进行发布使用。

现在,可以查看以下刚刚克隆的新映像的信息:

rbd ls --long

rbd info 5G_new.img

ceph-clone-ls-2020-08-06
ceph-clone-rbd-info-2020-08-06

罗列快照的后代

rbd children {pool-name}/{image-name}[@{snapshot-name}]

例如:

rbd children rbd/5G.img

取消快照保护

删除快照前,必须先需要快照保护。另外如果有其他的子映像使用着这个快照,那么你不能删除这个快照。除非你将引用这个快照的子映像执行拍平的操作。

rbd snap unprotect {pool-name}/{image-name}@{snapshot-name}

无法取消保护一个被克隆的子映像使用的快照,除非你将克隆后的映像拍平。
ceph-snap-unprotect-1-2020-08-06

拍平克隆的映像

克隆的映像一直保留着对父快照的引用,所以你无法取消保护一个被引用的父快照。如果你要从子克隆删除到父快照的这些引用,你可以把引用的父快照信息完整的复制到子克隆中,也就是拍平它。拍平克隆品的时间因快照尺寸而不同,要删除快照或者取消保护快照,必须将子映像拍平。

rbd flatten {pool-name}/{image-name}

例如:

rbd flatten rbd/5G_new.img

拍平子映像后,就不会再引用父快照的信息了。此时,你可以将父快照解除保护并删除。

从集群中删除OSD节点

使用cephadm部署的Ceph集群,再尝试从集群中删除OSD节点的时候遇到了各种问题……

既然自动化工具目前不太完善(或者说在文档里目前还没看到使用cephadm删除OSD节点的方法),那么就手动删除吧!记录一次使用cephadm搭建的集群如何删除OSD节点。当然使用其他方式部署的OSD要删除的话也是大同小异的。

ceph版本:ceph version 15.2.4 (7447c15c6ff58d7fce91843b705a268a1917325c) octopus (stable)

查看集群OSD状态

先查看集群内OSD的状态,并找到要删除的OSD节点。现在准备删除osd.4osd.5这两个节点,他们都在vm2这台主机上。

ceph osd tree

ceph-rm-osd-tree-2020-07-31

ceph osd dump

ceph-rm-osd-dump-2020-07-31

可以留意一下ID,之后便于确认ID所对应的块设备名(如:/dev/sdx或/dev/nvmex)

删除OSD节点节点

使用cephadm删除OSD节点

目前使用cephadm删除OSD节点后也需要手动的释放磁盘占用

ceph orch osd rm <svc_id>... [--replace] [--force]

要删除osd.4osd.5节点则执行:ceph orch osd rm 4 5

删除的过程需要一段时间,会重新分配集群内的PG,删除CRUSH图节点信息,删除这两个OSD所对应的用户和密钥环。

查看自动删除状态进度ceph orch osd rm status,如果长时间无响应或者依旧没有删除,可以开始尝试手动删除OSD节点

手动删除OSD节点

移除daemon守护进程

接下来的操作请确保你对整个集群拥有admin权限并且对要删除OSD节点的主机有root权限。

登录到拥有Ceph集群admin权限的主机,执行如下命令:

ceph orch daemon rm osd.4 osd.5 --force

返回结果如下,已经移除他们容器的守护进程:

Removed osd.4 from host 'vm2'
Removed osd.5 from host 'vm2'

此时查看集群中这两个OSD的状态:

要删除osd.4osd.5这两个节点的状态变成了DOWN。接下来就可以从crush表中将他们移除。

ceph-rm-osd-tree-2-2020-07-31

如果还没有使用cephadm管理集群,此处你可以登录到vm2这台主机中手动的将他们的systemd守护进程disable

systemctl disable --now  ceph-osd@4
systemctl disable --now ceph-osd@5

删除CRUSH图中所对应的OSD节点

删除CRUSH图中的OSD节点信息

ceph osd crush remove osd.4

ceph osd crush remove osd.5

执行成功返回结果:

removed item id 4 name 'osd.4' from crush map
removed item id 5 name 'osd.5' from crush map

此时再次手动检查集群内的OSD节点中是否还包含osd.4osd.5

已经从CRUSH图标中删除,此处已经看不到这两个OSD节点。

ceph-rm-osd-tree-3-2020-07-31

删除osd节点

ceph osd rm osd.4 osd.5

返回执行成功结果:removed osd.4, osd.5

ceph-osd-rm-2020-07-31

删除osd用户

ceph auth ls | grep ^osd -A4

ceph-auth-ls-2020-07-31

发现Ceph的OSD用户未被删除,残留在此处(会影响下一次添加OSD时,导致密钥环不匹配的错误)。执行如下命令删除:

ceph auth rm osd.4

ceph auth rm osd.5

删除OSD配置(如果有的话)

如果额外对OSD进行了额外配置的话需要手动删除当时的配置信息。登录到这台被删除OSD节点的主机上,修改配置文件:vim /etc/ceph/ceph.conf,将对该OSD节点额外配置的信息删除。

之后把更新过的ceph.conf文件要拷贝到其他集群主机的/etc/ceph/目录下。

解除Ceph对磁盘的占用

之后的操作都需要在移除OSD节点的主机(vm2)上通过root用户特权执行操作。

当删除了OSD之后,由于先前的配置,Ceph仍然对磁盘进行占用。需要移除这块OSD磁盘的DM状态,并之后对其格式化,这样才完整的手动移除一个OSD节点(磁盘)。

查询磁盘DM状态并移除编码

dmsetup status

dmset-status-2020-07-31

注意在一开始要留意的哪个ID,在这里用来识别要删除哪个磁盘的DM标记。

dmsetup remove ceph--14c75e65--a33e--459a--8bc7--c95add15d8a3-osd--block--d2af5a38--54b9--4112--9bbf--8ea313c673f1

dmsetup remove ceph--6ceb7c60--8b90--44fc--b159--34bd3d8c8e0f-osd--block--5f1d52fa--e50c--4915--b059--f672684ce571

执行完上面的命令后,再检查一下DM状态,发现已经成功被删除DM标记:

dmset-status-2-2020-07-31

wipefs格式化文件系统

在使用wipefs工具清除文件系统前,要找到所对应的块设备名称。

执行lsblk -f命令:

下面的图片中可以看到,nvme0n2nvme0n3这两个块设备已经没有了像nvme0n4下方的ID标记,所以可以判定nvme0n2nvme0n3和两块磁盘是我们移除的OSD节点所使用的磁盘。

fdisk-f-2020-07-31

接下来对nvme0n2nvme0n3两个块设备格式他们的文件系统,执行命令:

wipefs -a /dev/nvme0n2 /dev/nvme0n3

wipefs-2020-07-31

到此,完成的将OSD节点从集群中移除。你可以使用lsblk工具或稍后一段时间后在拥有集群admin权限的主机上执行ceph orch device ls命令查看这两个OSD节点所使用的磁盘是否是可以用的状态了。现在你可以将这两个磁盘取出或者在这两块磁盘上重新部署OSD节点…

fdisk-f-clean-2020-07-31

ceph-orch-device-ls-2020-07-31

Centos8配置 chrony NTP服务端及客户端

现在有一台服务器想作为NTP服务器,3台客户端想作为NTP服务器的客户端,保证客户端机器上的时间与服务器端保持同步。清单如下:

类型 IP地址
server 192.168.1.30
client 192.168.1.[31:33]

部署服务端chrony

ssh登录到server机器后放行防火墙、安装chrony服务、配置chrony服务器端。

放行防火墙端口

Centos8使用firewalld服务对防火墙进行管理。放行ntp服务(123/udp)

firewall-cmd --add-service=ntp --permanent && firewall-cmd --reload

安装chrony服务

默认情况下Centos8中已经安装好chrony的软件包。如果发现没有安装,使用下面的命令安装即可:

sudo dnf install chrony -y

配置chrony服务端

sudo vim /etc/chrony.conf

不习惯vi/vim编辑器的小伙伴可以替换为自己喜爱的编辑器如nano

把原有自带的上游NTP服务器地址删除。之后手动配置国内阿里云的NTP服务器地址。

server time1.aliyun.com iburst     #添加上游NTP服务器
server time2.aliyun.com iburst
server time3.aliyun.com iburst

allow 192.168.1.0/24 #允许IP端内的客户端通过这台服务器获取时间

配置无误后,重启chrony服务,并配置开机自启动:

systemctl restart chronyd.service && systemctl enable chronyd.service --now

使用ss -tlunp | grep chrony命令检查,发现chrony服务已经在监听123/udp端口,服务端配置成功。

配置chrony客户端

配置chrony客户端需要将三台客户端都安装chrony并且配置好他们的配置文件。如果说客户端数量较少可以手动配置,当数量为成百上千台机器时使用Ansible自动化配置是一个不错的选择。所以在这里有两种配置方法供大家参考,一种是普通手动配置,一种是使用Ansible-Galaxy角色配置。

手动配置chrony客户端

配置客户端同样的需要放行防火墙、安装chrony软件包、配置chrony客户端。

安装chrony软件包

dnf install chrony -y

修改客户端chrony配置文件

sudo vim /etc/chrony.conf

不习惯vi/vim编辑器的小伙伴可以替换为自己喜爱的编辑器如nano

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
# pool 2.centos.pool.ntp.org iburst

# 把原有的NTP服务器地址注释掉或者直接删除。添加下面刚刚搭建好的NTP服务器地址。
server 192.168.1.30 iburst

注释默认的NTP服务器地址,之后添加上我们自己刚刚搭建好的NTP服务器地址即可完成chrony客户端的手动配置。

重启chrony客户端服务

重启chrony服务,并配置开机自启动:

systemctl restart chronyd.service && systemctl enable chronyd.service --now

查看同步状态

chronyc sources -v

[root@vm1 ~]# chronyc sources -v
210 Number of sources = 1

.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| Reachability register (octal) -. | xxxx = adjusted offset,
|| Log2(Polling interval) --. | | yyyy = measured offset,
|| \ | | zzzz = estimated error.
|| | | \
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.1.30 3 6 17 16 +3424ns[ +110us] +/- 31ms

可以看到,输出结果里已经有我们搭建好的NTP服务器了。并且在服务器地址前有^*标记,证明已经正确同步时间。

至此一台客户端的chrony已经搭建完毕。剩下的两台同理部署即可。

使用Ansible自动化配置chrony客户端

相关Ansible基础默认你已经了解,不再赘述。如果你不了解Ansible请从Ansible文档入门学习。

mkdir Chrony && cd Chrony

配置ansible.cfg

vim ansible.cfg

[defaults]
inventory = inventory
remote_user = root
roles_path=./roles:/usr/share/ansible/roles:/etc/ansible/roles

[privilege_escalation]
become=True
become_method=sudo
beome_user=root
become_ask_pass=False

配置主机清单

vim inventory

[client]
192.168.1.3[1:3]

配置ssh免密登陆客户端

配置SSH免密登录

下载chrony角色

ansible-galaxy install ericsysmin.chrony

编写Playbok

vim playbook.yml

---
- name: Config Chrony Client
hosts: client
roles:
- role: ericsysmin.chrony
chrony_config_server:
- 192.168.1.30
...

执行结果如下,全部OK即为成功:

PLAY RECAP **************************
192.168.1.31 : ok=7 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.1.32 : ok=7 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
192.168.1.33 : ok=7 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0

之后可以登录几台机器进行手动验证,查看是否已经以NTP服务器保持同步。

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

192.168.1.30    centos8
192.168.1.31 vm1
192.168.1.32 vm2
192.168.1.33 vm3

防火墙放行

服务名 端口号 描述
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节点创建新用户

ssh username@ceph-server
sudo useradd -d /home/{username} -m {username}
echo "password" | passwd {username} --stdin

配置sudo权限

echo "{username} ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
sudo chmod 0440 /etc/sudoers.d/{username}

配置ssh-key免密登录

在centos8机器中创建密钥对,但是不要用sudo或root用户。口令为空。

ssh-keygen

全部默认配置,直接回车生成key。

现在将centos8机器的ssh公钥发送到vm[1:3]的机器上。

把公钥拷贝到各 Ceph 节点,把下列命令中的 {username} 替换成前面创建部署 Ceph 的用户里的用户名。

for i in 1 2 3
do
ssh-copy-id {username}@vm$i
done

如果使用ceph-deploy工具部署集群推荐使用以下方式配置免密登录

修改 ceph-deploy 管理节点上的 ~/.ssh/config 文件,这样 ceph-deploy 就能用你所建的用户名登录 Ceph 节点了,无需每次执行 ceph-deploy 都指定 --username {username} 。这样做同时也简化了 ssh 和 scp 的用法。把 {username} 替换成你创建的用户名。注意要将~/.ssh/config 文件权限修改为0600。

Host node1
Hostname node1
User {username}
Host node2
Hostname node2
User {username}
Host node3
Hostname node3
User {username}

配置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

[defaults]
inventory = ./inventory
# 因为该Ansible脚本目前比较老,脚本中使用的语法在新版本的Ansible上运行会有警告提示,提示部分语法即将被弃用。但是目前还可以继续使用,暂时忽略警告即可
deprecation_warnings = false
ansible_managed = Please do not change this file directly since it is managed by Ansible and will be overwritten
action_plugins = plugins/actions
roles_path = ./roles
log_path = /tmp/ansible.log

# Disable them in the context of https://review.openstack.org/#/c/469644
retry_files_enabled = False

# This is the default SSH timeout to use on connection attempts
# CI slaves are slow so by setting a higher value we can avoid the following error:
# Timeout (12s) waiting for privilege escalation prompt:
timeout = 30

[ssh_connection]
# see: https://github.com/ansible/ansible/issues/11536
control_path = %(directory)s/%%h-%%r-%%p

配置inventory vim inventory

[mons]
server[c:e]

[mgrs]
server[c:e]

[osds]
server[c:e]

测试一下连通性 ansible all -m ping,返回结果如下:

vm3 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
vm2 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}
vm1 | SUCCESS => {
"changed": false,
"failed": false,
"ping": "pong"
}

配置group_vars变量:

配置 all.yml group_vars变量:

拷贝all.yml变量 cp group_vars/all.yml.sample group_vars/all.yml

编辑变量文件 vim group_vars/all.yml

fetch_directory: ~/ceph-ansible-keys

ntp_service_enabled: true
ceph_origin: repository

ceph_repository: rhcs

ceph_rhcs_version: "3"
ceph_repository_type: "cdn"

rbd_cache: "true"
rbd_cache_writethrough_until_flush: "false"

rbd_client_directories: false # this will create rbd_client_log_path and rbd_client_admin_socket_path directories with proper permissions

monitor_interface: eth0

journal_size: 1024 # OSD journal size in MB
public_network: 172.25.250.0/24
cluster_network: "{{ public_network }}"

ceph_conf_overrides:
global:
mon_osd_allow_primary_affinity: 1
mon_clock_drift_allowed: 0.5
osd_pool_default_size: 2
osd_pool_default_min_size: 1
mon_pg_warn_min_per_osd: 0
mon_pg_warn_max_per_osd: 0
mon_pg_warn_max_object_skew: 0
client:
rbd_default_features: 1
配置 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

Disk /dev/vdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/vdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/vdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

vim group_vars/osds.yml

copy_admin_key: true

devices:
- /dev/vdb
- /dev/vdc
- /dev/vdd

osd_scenario: "collocated"

配置site.yml Playbook

cp site.yml.sample site.yml

运行Playbook开始部署

请确保当前目录在ceph-ansible目录下。

执行 ansible-playbook site.yml 开始部署Ceph基础集群。

等待一段时间后Ansible返回执行结束结果,没有机器存在failed则表明配置成功。

PLAY RECAP ******************************
vm1 : ok=203 changed=32 unreachable=0 failed=0
vm2 : ok=185 changed=26 unreachable=0 failed=0
vm3 : ok=187 changed=27 unreachable=0 failed=0

之后可以验证部署结果

部署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即可:

---
copy_admin_key: true

编辑inventory主机清单文件,在其中加入clients项。

vim inventory

server[c:e]

[mgrs]
server[c:e]

[osds]
server[c:e]

[clients]
centos8

运行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查看集群概况及状态

[ceph@vm1 ~]$ ceph -s
cluster:
id: ca5c8e66-e427-4adb-86c1-83b0eb5983cb
health: HEALTH_OK

services:
mon: 3 daemons, quorum vm1,vm2,vm3
mgr: vm2(active), standbys: vm1, vm3
osd: 9 osds: 9 up, 9 in

data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 bytes
usage: 966 MB used, 169 GB / 170 GB avail
pgs:

如果配置成功,此时执行 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信息

ceph-osd-tree-1

发现在vm1上运行3个osd进程,分别是osd.0,osd.3,osd.8 。现在我们人为干预宕掉vm1上的osd.3之后看看集群有什么反应。

sudo systemctl stop ceph-osd@8.service

ceph-osd-tree-down-2020-07-26

ceph-s-osd-down-1-2020-07-26

恢复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

[ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-octopus/el8/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

注意:当使用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

[ceph@vm1 ~]$ ceph -v
ceph version 12.2.1-40.el7cp (c6d85fd953226c9e8168c9abe81f499d66cc2716) luminous (stable)

使用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>*

执行这条命令后会执行如下操作:

  1. 为本地集群创建监视器和管理器的守护进程
  2. 为集群生成一个新的SSH Key文件并且在/root/.ssh/authorized_keys文件中添加一个root认证用户
  3. 生成一个与新集群通信的最小化配置文件/etc/ceph/ceph.conf
  4. 写入Ceph用户认证用户client.admin的密钥环到/etc/ceph/ceph.client.admin.keyring
  5. 将公钥副本写入/etc/ceph/ceph.pub

如上,执行引导命令:

cephadm bootstrap --mon-ip 192.168.1.30

完成部署Ceph容器后,会生成如下信息。其中包括了Dashboard的登录地址以及随机生成的用户信息

INFO:cephadm:Ceph Dashboard is now available at:

URL: https://centos8:8443/
User: admin
Password: g1ohoef3t9

INFO:cephadm:You can access the Ceph CLI with:

sudo /usr/sbin/cephadm shell --fsid c50990c4-d1b9-11ea-9884-000c29c91658 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring

INFO:cephadm:Please consider enabling telemetry to help improve Ceph:

ceph telemetry on

For more information see:

https://docs.ceph.com/docs/master/mgr/telemetry/

INFO:cephadm:Bootstrap complete.

现在一个简单的基础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

INFO:cephadm:Inferring fsid c50990c4-d1b9-11ea-9884-000c29c91658
INFO:cephadm:Inferring config /var/lib/ceph/c50990c4-d1b9-11ea-9884-000c29c91658/mon.centos8/config
INFO:cephadm:Using recent ceph image docker.io/ceph/ceph:v15
ceph version 15.2.4 (7447c15c6ff58d7fce91843b705a268a1917325c) octopus (stable)

确认ceph命令可以连接到集群并且可以查看他们的状态:

ceph status

将主机添加到集群

添加主机到集群中需要两步:

  1. 在新主机的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

  2. 告知Ceph集群添加新节点主机:

    ceph orch host add vm1

    ceph orch host add vm2

    ceph orch host add vm3

[root@centos8 ~]# ceph orch host add vm3
INFO:cephadm:Inferring fsid c50990c4-d1b9-11ea-9884-000c29c91658
INFO:cephadm:Inferring config /var/lib/ceph/c50990c4-d1b9-11ea-9884-000c29c91658/mon.centos8/config
INFO:cephadm:Using recent ceph image docker.io/ceph/ceph:v15
Added host '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

    HOST  ADDR  LABELS  STATUS
    vm1 vm1
    vm2 vm2
    vm3 vm3
  • 你可以为某个主机这只标签进行标记,比如在此处就可以编辑合适的标签给刚刚添加的那三台主机。

    orch 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

    HOST  ADDR  LABELS       STATUS
    vm1 vm1 mon cephadm
    vm2 vm2 mon
    vm3 vm3 mon

添加OSD节点

显示当前主机集群内主机可用的存储设备列表,添加主机到节点中请参考将主机添加到集群

ceph orch device ls

在我当亲添加的三台主机中,存储设备列表如下,其中包含了可以用作OSD部署的设备以及他们的容量等基本信息:

HOST  PATH          TYPE   SIZE  DEVICE                                     AVAIL  REJECT REASONS
vm1 /dev/nvme0n2 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm1 /dev/nvme0n3 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm1 /dev/nvme0n4 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm1 /dev/nvme0n5 ssd 10.0G VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm1 /dev/nvme0n1 ssd 20.0G VMware Virtual NVMe Disk_VMWare NVME_0000 False LVM detected, Insufficient space (<5GB) on vgs, locked
vm2 /dev/nvme0n2 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm2 /dev/nvme0n3 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm2 /dev/nvme0n4 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm2 /dev/nvme0n1 ssd 20.0G VMware Virtual NVMe Disk_VMWare NVME_0000 False Insufficient space (<5GB) on vgs, locked, LVM detected
vm3 /dev/nvme0n2 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm3 /dev/nvme0n3 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm3 /dev/nvme0n4 ssd 5120M VMware Virtual NVMe Disk_VMWare NVME_0000 True
vm3 /dev/nvme0n1 ssd 20.0G VMware Virtual NVMe Disk_VMWare NVME_0000 False Insufficient space (<5GB) on vgs, locked, LVM detected

如果满足以下所有条件,则认为存储设备可以部署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节点:

for 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时,则会将它正式的下架。