这篇文章上次修改于 696 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

前言

前面我们提到过采用Ceph作为持久化存储实现,本篇将讲述Ceph的部署和Ceph-CSI在Kubernetes集群以DaemonSet形式的部署太长了留到下一篇再讲。
本篇中提到的任何IP均可在前述的部署环境机器表中找到对应机器。

实操

噩耗

如果您跟笔者一样不幸地选择了Ubuntu 22.04作为承载业务的发行版,那么您可能无法通过同在Ubuntu 20.04上相似的手段对Ceph进行部署。
10020-tio89o45hx.png
由于社区已经停止维护ceph-deploy,我们已经没有办法通过正常手段在ubuntu 22.04上安装ceph-deploy了,即使用pip强行安装也会因为软件源问题无法继续。

使用ceph-deploy初始化Ceph

[tip type="yellow"]社区已经停止维护ceph-deploy,笔者不建议您继续使用ceph-deploy部署Ceph。[/tip]
如果您使用ubuntu 20.04及更早的版本,您仍可以按照我之前写过的《用 Ceph 实现 K8s 集群数据持久化 #2》对Ceph集群进行初始化,本篇不再赘述重复内容。
安装完之后,您可以直接跳到使用ceph-deploy设置CephFS,无需查看cephadm的相关内容。

使用cephadm初始化Ceph

旧事物终究是要被新事物所取代的,所以我们还是得站起来向前看才是。

初始化软件环境

相较于ceph-deploy,cephadm采用了容器的形式部署Ceph,所以我们需要先初始化一下软件环境:

# 安装基础软件
sudo apt update
sudo apt install docker.io cephadm ceph-common ntp -y
# 同步时间
sudo systemctl start ntp
sudo hwclock --systohc

部署单点Ceph服务

抽一个看着顺眼的节点先一步安装Ceph,笔者此处选择ap-zj-storage-1。关于本篇实践涉及的节点组,本篇开头有说明,此处不再赘述。
找个地方放Ceph的文件:

sudo mkdir -p /etc/ceph
sudo cd /etc/ceph

由于Ceph具有可拓展性,所以此处我们可以先在一个节点上进行安装,然后拓展到其它节点。
我们先初始化一个节点上的monitor和manager组件:

# 192.168.100.11 <=> ap-zj-storage-1
sudo cephadm bootstrap --mon-ip 192.168.100.11

等待片刻,cephadm会拉取Ceph的Docker镜像并完成相关部署。
之后,cephadm会生成全局唯一的集群Ceph SSH Key以便管理,如未通过参数指定,公钥默认位于:

/etc/ceph/ceph.pub

将ceph.pub同步到其他节点的authorized_keys,必须保证cephadm能通过ssh控制另一台机器

将单点集群拓展至多点

此时单点服务已经安装完成,应尽快拓展集群至其他节点,同步完SSH Key之后您可以直接使用ceph-common拓展集群节点:

sudo ceph orch host add ap-zj-storage-0

然后对monitor组件进行扩容:

# 确认monitor的数量为节点数量,本篇部署的Ceph集群共有两个节点,所以monitor数量定为2
sudo ceph orch apply mon 2
# 解除系统对monitor的自动平衡
sudo ceph orch apply mon --unmanaged
# 手动确认monitor部署在Ceph中的具体节点
sudo ceph orch apply mon "ap-zj-storage-1,ap-zj-storage-0"

然后就等吧,cephadm会逐步向各个节点分派组件,这可能需要5-10分钟。
完成之后,集群已经正确运行了Monitor和Manager组件,但是OSD组件仍然需要我们手动初始化。

确认组件的运行状态

在开始之前,您需要检查Ceph集群的健康状态:

sudo ceph -s

如果您和笔者一样遇到了下列错误:

clock skew detected on mon.xxx

您需要检查ntp服务是否正常运行,以及再次同步系统时钟。
一般来说,此时集群应该仍处于 HEALTH_WARN 状态,这个状态应该是由于OSD数量不达标造成的,我们接下来就会部署OSD组件。

部署OSD组件

首先查看一下可以作为OSD的组件:

sudo ceph orch device ls

笔者执行此命令的输出是:

ceph orch device ls
HOST             PATH      TYPE  DEVICE ID                   SIZE  AVAILABLE  REFRESHED  REJECT REASONS  
ap-zj-storage-0  /dev/sdb  ssd   QEMU_HARDDISK_drive-scsi2  1099G  Yes        2m ago                     
ap-zj-storage-0  /dev/sdc  ssd   QEMU_HARDDISK_drive-scsi1  1099G  Yes        2m ago                     
ap-zj-storage-1  /dev/sdb  ssd   QEMU_HARDDISK_drive-scsi2  1099G  Yes        2m ago                     
ap-zj-storage-1  /dev/sdc  ssd   QEMU_HARDDISK_drive-scsi1  1099G  Yes        2m ago

着重确认AVAILABLE这栏的数据为 Yes,如果可用性不对劲,需要关注REASONS一栏查找原因。
确认设备无误后,如果你想将所有磁盘都设为OSD,其实你可以当个懒人,让Ceph帮你操心这些事情:

sudo ceph orch apply osd --all-available-devices

这样Ceph就会将所有AVAILABLE=Yes的磁盘都设为OSD了,这同样需要等待5-10分钟,让系统自动操作。
当然,也有人想手动指定设备为OSD。如果你前面让Ceph帮你干了,那这边可不要再执行了:

sudo wipefs -af <DEVICE>
sudo ceph orch device zap <NODE> <DEVICE> --force
sudo ceph orch device ls
# 记得确认可用性
sudo ceph orch daemon add osd <NODE>:<DEVICE>

确认OSD正常运行

运行下列命令确认OSD正常运行:

sudo ceph osd tree

笔者的输出是:

ID  CLASS  WEIGHT   TYPE NAME                 STATUS  REWEIGHT  PRI-AFF
-1         4.00000  root default                                       
-3         2.00000      host ap-zj-storage-0                           
 0    ssd  1.00000          osd.0                 up   1.00000  1.00000
 2    ssd  1.00000          osd.2                 up   1.00000  1.00000
-5         2.00000      host ap-zj-storage-1                           
 1    ssd  1.00000          osd.1                 up   1.00000  1.00000
 3    ssd  1.00000          osd.3                 up   1.00000  1.00000

至此,Ceph的初始化就完成了。

用cephadm设置CephFS

创建CephFS对象

先初始化一下FS对象:

sudo ceph fs volume create zj_k8s_cephfs

此处没有指定OSD Pool对象,一般Ceph会自动创建,无需过多干预(干预了也会被自动balance掉...就没必要了吧)。
然后需要给FS对象创建MDS。

创建元数据服务器(MDS)

元数据服务器,即英文文献里的MetaData Server,简称MDS。由于CephFS是POSIX兼容的文件系统,在跨设备的集群化数据存储中,需要一个存储文件信息和提供指引的“向导”,这个“向导”就是MDS。MDS的性能将一定程度上决定CephFS系统整体的IO性能。
此处为了后续启动CephFS,我们需要先行创建MDS:

# 设置副本数量,部署服务
sudo ceph orch apply mds zj_k8s_cephfs --placement="2 ap-zj-storage-0 ap-zj-storage-1"

大多数情况下,设置该项后系统都会自动部署,需要等待一会。
如果等待后运行ceph orch ls后还是没看到MDS服务,则需要手动部署:

sudo ceph orch daemon add mds <FS Name> <MDS Node>

至此,Ceph集群内关于CephFS的部署基本告一段落,下面是ceph-deploy的部署方式,用cephadm部署的话可以不看。

用ceph-deploy设置CephFS

[tip type="yellow"]社区已经停止维护ceph-deploy,笔者此处不建议您继续使用ceph-deploy部署Ceph。[/tip]

创建MDS

sudo ceph-deploy mds create <Node0> <Node1> <Node2>

创建OSD Pool

# 创建CephFS存储数据的OSD Pool
sudo ceph osd pool create <FS Data OSD Pool> 32
# 创建CephMDS存储元数据的OSD Pool
sudo ceph osd pool create <MetaData OSD Pool> 32

创建FS对象

ceph fs new <FS Name> <MetaData OSD Pool> <FS Data OSD Pool>

至此,Ceph集群内关于CephFS的部署基本告一段落。