CentOS7安装并使用Ceph

时间:2022-09-09 12:34:58

1.准备工作

1.1 安装配置NTP

官方建议在所有 Ceph 节点上安装 NTP 服务(特别是 Ceph Monitor 节点),以免因时钟漂移导致故障。

ln -sf /usr/share/zoneinfo/posix/Asia/Shanghai /etc/localtime
yum -y install ntpd
systemctl enable ntpd
vim /etc/ntp.conf
server 0.cn.pool.ntp.org
systemctl stop ntpd
ntpdate 0.cn.pool.ntp.org
systemctl restart ntpd
hwclock --systohc

1.2 创建 Ceph 部署用户

ceph-deploy 工具必须以普通用户登录 Ceph 节点,且此用户拥有无密码使用 sudo 的权限,因为它需要在安装软件及配置文件的过程中,不必输入密码。官方建议所有 Ceph 节点上给 ceph-deploy 创建一个特定的用户,而且不要使用 ceph 这个名字。这里为了方便,我们使用 cephd 这个账户作为特定的用户,而且每个节点上(monitor、node)上都需要创建该账户,并且拥有 sudo 权限。在 Ceph 集群各节点进行如下操作

1.2.1 创建 ceph 特定用户

$ sudo useradd -d /home/cephd -m cephd
$ sudo passwd cephd

1.2.2 添加 sudo 权限

$ echo "cephd ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephd
$ sudo chmod 0440 /etc/sudoers.d/cephd

1.2.3 cephd用户互信

接下来在 ceph-deploy 节点上,切换到 cephd 用户,生成 SSH 密钥并把其公钥分发到各 Ceph 节点上,注意使用 cephd 账户生成,且提示输入密码时,直接回车。
1.生成 ssh 密钥

$ ssh-keygen

2.将公钥复制到 monitor和node节点

$ ssh-copy-id cephd@k8smaster02

1.3 其他网络配置

1.3.1 打开网络接口

官网文档中指定 Ceph 的各 OSD 进程通过网络互联并向 Monitors 上报自己的状态,所以要保证网络为开启状态,不过某些发行版(如 CentOS )默认关闭网络接口。所以我们需要保证集群各个节点系统网络接口是开启的。
在 Ceph 集群各节点进行如下操作

$ sudo cat /etc/sysconfig/network-scripts/ifcfg-enp0s3 
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp0s3"
UUID="3e68d5a3-f9a6-4c83-9969-706f7e3b0bc2"
DEVICE="enp0s3"
ONBOOT="yes" ----------这里要设置为 yes

注意:这里因为在我安装的虚拟机集群中网卡为 enp0s3,所以需要修改 /etc/sysconfig/network-scripts/ifcfg-enp0s3 文件,请根据自己系统网卡名去修改对应配置文件。

1.3.2 SELINUX 设置

在 CentOS 系统上, SELinux 默认为 Enforcing 开启状态,为了方便安装,建议把 SELinux 设置为 Permissive 或者 disabled。
在 Ceph 集群各节点进行如下操作

1.临时生效设置

$ sudo setenforce 0

2.永久生效设置

$ sudo cat /etc/selinux/config
SELINUX=disabled # 这里设置为 Permissive | disabled
SELINUXTYPE=targeted

1.3.3 开放所需端口设置

Ceph Monitors 之间默认使用 6789 端口通信, OSD 之间默认用 6800:7300 这个范围内的端口通信,所以我们需要调整防火墙设置,开放所需端口,允许相应的入站请求。
1.防火墙设置

$ sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent

2.当然我们也可以关闭防火墙

$ sudo systemctl stop firewalld.service  #停止 firewall
$ sudo systemctl disable firewalld.service #禁止 firewall 开机启动

2. Ceph存储集群搭建

集群结构为 k8smaster01 (ceph-deploy、monitor-1)、k8smaster02(monitor-2)、k8smaster03(monitor-3)、k8sslave01(osd-1)、k8sslave02(osd-2)、k8sslave03(osd-3)、k8sslave04(osd-4)。

首先要提一下的是,如果我们在安装过程中出现了问题,需要重新操作的时候,例如想清理我搭建的这个集群的话,可以使用以下命令。

ceph-deploy 上执行:
清理 Ceph 安装包:

ceph-deploy purge k8smaster01 k8smaster02 k8smaster03 k8sslave01 k8sslave02 k8sslave03 k8sslave04

清理配置:

ceph-deploy purgedata k8smaster01 k8smaster02 k8smaster03 k8sslave01 k8sslave02 k8sslave03 k8sslave04
ceph-deploy forgetkeys

2.1 deploy节点安装ceph-deploy

vim /etc/yum.repos.d/infernalis-ceph.repo

[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-{ceph-release}/{distro}/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

yum clean all && yum makecache && yum install ceph-deploy

2.2 创建执行目录

首先 Cephd 用户创建一个目录 ceph-cluster 并进入到该目录执行一系列操作。在 deploy 节点上执行如下命令:

$ mkdir ~/ceph-cluster && cd ~/ceph-cluster

2.3 创建集群

2.3.1 创建集群

$ ceph-deploy new k8smaster01 k8smaster02 k8smaster03
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/cephd/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.39): /usr/bin/ceph-deploy new monitor-1 monitor-2 monitor-3
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0xa06410>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0xa6add0>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['monitor-1', 'monitor-2', 'monitor-3']
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
...
[ceph_deploy.new][DEBUG ] Monitor initial members are ['monitor-1', 'monitor-2', 'monitor-3']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['10.142.21.21', '10.142.21.22', '10.142.21.23']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...

此时,我们会发现 ceph-deploy 会在 ceph-cluster 目录下生成3个文件,ceph.conf 为ceph配置文件,ceph-deploy-ceph.log为ceph-deploy日志文件,ceph.mon.keyring 为 ceph monitor 的密钥环:

$ ll ceph-cluster
总用量 16
-rw-rw-r--. 1 cephd cephd 247 131 14:32 ceph.conf
-rw-rw-r--. 1 cephd cephd 5540 131 14:32 ceph-deploy-ceph.log
-rw-------. 1 cephd cephd 73 131 14:32 ceph.mon.keyring

$ cat ceph.conf
[global]
fsid = b0b23151-c33a-4c8c-baf1-01159d09bc50
mon_initial_members = k8smaster01, k8smaster02, k8smaster03
mon_host = 10.142.21.21,10.142.21.22,10.142.21.23
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

2.3.2 修改 ceph.conf 配置文件

修改 ceph.conf 配置文件,增加副本数为 4,因为我们有4个 osd 节点:
vim ceph.conf

[global]
fsid = b0b23151-c33a-4c8c-baf1-01159d09bc50
mon_initial_members = k8smaster01, k8smaster02, k8smaster03
mon_host = 10.142.21.21,10.142.21.22,10.142.21.23
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd pool default size = 4 #增加默认副本数为4

2.3.3 Ceph软件包安装

通过 ceph-deploy 在各个节点安装 ceph:

ceph-deploy install k8smaster01 k8smaster02 k8smaster03 k8sslave01 k8sslave02 k8sslave03 k8sslave04

此过程需要等待一段时间,因为 ceph-deploy 会 SSH 登录到各 node 上去,依次执行安装 ceph 依赖的组件包。

2.3.4 初始化 monitor 节点

初始化 monitor 节点并收集所有密钥:

$ ceph-deploy mon create-initial

不过很遗憾,执行过程中报错了。查看原因应该是已经存在了 /etc/ceph/ceph.conf 配置文件了,解决方案就是加上 –overwrite-conf 参数,覆盖已存在的配置。

$ ceph-deploy --overwrite-conf mon create-initial

执行完毕后,会在当前目录下生成一系列的密钥环,应该是各组件之间访问所需要的认证信息吧。

 ll ~/ceph-cluster
-rw-------. 1 cephd cephd 113 127 15:13 ceph.bootstrap-mds.keyring
-rw-------. 1 cephd cephd 71 127 15:13 ceph.bootstrap-mgr.keyring
-rw-------. 1 cephd cephd 113 127 15:13 ceph.bootstrap-osd.keyring
-rw-------. 1 cephd cephd 113 127 15:13 ceph.bootstrap-rgw.keyring
-rw-------. 1 cephd cephd 129 127 15:13 ceph.client.admin.keyring
-rw-rw-r--. 1 cephd cephd 222 127 14:47 ceph.conf
-rw-rw-r--. 1 cephd cephd 120207 127 15:13 ceph-deploy-ceph.log
-rw-------. 1 cephd cephd 73 127 14:46 ceph.mon.keyring

到此,ceph monitor 已经成功启动了。

2.3.5 创建osd

接下来需要创建 OSD 了,OSD 是最终数据存储的地方,这里我们准备了4个 OSD 节点。

1. prepare OSD:
接下来,我们需要 ceph-deploy 节点执行 prepare OSD 操作,目的是分别在各个 OSD 节点上创建一些后边激活 OSD 需要的信息。

ceph-deploy --overwrite-conf osd prepare k8sslave01:sdd  k8sslave02:sdd k8sslave03:sdd k8sslave04:sdd

会在/dev/sdd这块裸盘上建两个分区:/dev/sdd1、/dev/sdd2;/dev/sdd1是osd盘,/dev/sdd2是journal盘
备注:
假如磁盘之前有分区信息会报错,可以:

  1. 先zap掉原有分区:
    ceph-deploy disk zap k8sslave01:sdd
  2. 假如之前ceph已经有mount了,再umount一下:
    umount /var/lib/ceph/osd/ceph-8
  3. 更新分区表
    partprobe /dev/sdd
  4. 还需要用ceph 相关命令清空ceph osd tree:
    https://www.cnblogs.com/boshen-hzb/p/6796604.html

2. 激活 activate OSD:

ceph-deploy osd activate k8sslave01:/dev/sdd1  k8sslave02:/dev/sdd1 k8sslave03:/dev/sdd1 k8sslave04:/dev/sdd1

看日志,激活也没有问题。

3. 同步秘钥
最后一步,通过 ceph-deploy admin 将配置文件和 admin 密钥同步到各个节点,以便在各个 Node 上使用 ceph 命令时,无需指定 monitor 地址和 ceph.client.admin.keyring 密钥。

ceph-deploy admin k8smaster01 k8smaster02 k8smaster03 k8sslave01 k8sslave02 k8sslave03 k8sslave04

同时为了确保对 ceph.client.admin.keyring 有正确的操作权限,所以还需要增加权限设置。

$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring

4. 查看集群状态
至此,Ceph 存储集群已经搭建完毕了,我们可以查看一下集群是否启动成功!
$ ceph -s
CentOS7安装并使用Ceph

或者查看集群健康状况
$ ceph health
HEALTH_OK

查看集群 OSD 信息
$ ceph osd tree
CentOS7安装并使用Ceph

3. Ceph使用

3.1 ceph块设备(rbd)

Ceph 块设备也可以简称为 RBD 或 RADOS 块设备,不过我们还是习惯叫 RBD,官网文档中指出不能在与 Ceph 存储集群(除非它们也用 VM )相同的物理节点上执行使用 RBD(why?)。

如果另起一个节点的话,那么就得安装 Ceph 到该节点上并配置。注意:以下操作是基于上一篇文章已搭建好的集群结构及目录的,使用 cephd 账号。

3.1.1配置一个新的client节点使用ceph(非之前的monitor或osd节点):

1、在管理节点(admin-node)上,通过 ceph-deply 将 Ceph 安装到该节点 node-client(假设将新节点 hostname 设置为 node-client)。

$ ceph-deploy install node-client

2、在管理节点(admin-node)上,通过 ceph-deploy admin 将 Ceph 配置文件和 ceph.client.admin.keyring 密钥同步到该节点 node-client。切换到 Ceph 配置文件和密钥所在目录,执行如下命令:

$ cd ~/ceph-cluster
$ ceph-deploy admin node-client

ceph-deploy 部署工具会将密钥信息复制到 node-client 的 /etc/ceph 目录,要确保该密钥环文件有读权限,若没有,到 node2 节点上执行 sudo chmod +r /etc/ceph/ceph.client.admin.keyring 命令。

本次演示,我们不增加新节点,直接在 admin-node 节点上操作,在集群搭建时已经完成上述操作,这里就不用再安装配置 Ceph 了。接下来需要配置 RBD。

3.2 ceph-rbd创建和使用

3.2.1创建基于ceph-rbd的盘

1、首先在 admin-node 节点上创建一个块设备镜像 image。

$ rbd create foo --size 1024 //创建一个大小为 1024M 的 ceph image

查看已创建的 rbd 列表**

$ rbd list
foo

2、创建成功后,在 admin-node 节点上,把 foo image 映射到内核,并格式化为块设备。

$ rbd map foo --name client.admin

CentOS7安装并使用Ceph
报错了,这个原因是没有权限执行,sudo 执行一下。
CentOS7安装并使用Ceph
又报错了,看日志 RBD image feature set mismatch,看样子是 feature 不匹配啊!ceph新版中在map image时,给image默认加上了许多feature,通过rbd info可以查看到 foo 都有哪些 feature:
CentOS7安装并使用Ceph
我们可以看到 rbd image foo 支持匹配的 feature 为:layering, exclusive-lock, object-map, fast-diff, deep-flatten。
rbd的feature表:
CentOS7安装并使用Ceph
–image-feature:

layering: 支持分层
striping: 支持条带化 v2
exclusive-lock: 支持独占锁
object-map: 支持对象映射(依赖 exclusive-lock )
fast-diff: 快速计算差异(依赖 object-map )
deep-flatten: 支持快照扁平化操作
journaling: 支持记录 IO 操作(依赖独占锁)

通过dmesg | tail可以看到:
CentOS7安装并使用Ceph
这个地方提示的很清楚了,不支持的属性0x38,0x38是16进制的数值,换算成10进制是3*16+8=56
56的意思是不支持:

32+16+8 = deep-flatten, fast-diff, object-map

也就是不支持这些属性,现在关闭这些feature,有两种方式可以修改:
方式一:通过 rbd feature disable {poolname}/{imagename} {feature}命令临时关闭不支持的 feature 类型:
CentOS7安装并使用Ceph
注意:这种方式设置是临时性,一旦 image 删除或者创建新的 image 时,还会恢复默认值。

方式二:通过设置 /etc/ceph/ceph.conf 配置文件,增加 rbd_default_features 配置可以永久的改变默认值:

vim /etc/ceph/ceph.conf
rbd_default_features
= 3

注意:这种方式设置是永久性的,要注意在集群各个 node 上都要修改。

配置完毕,再次执行 map 命令。
CentOS7安装并使用Ceph
map 成功。

3.2.2rbd的盘初始化和使用

1.创建文件系统
将 foo image 格式化为 ext4 格式的文件系统,就可以使用块设备了:

$ sudo mkfs.ext4 -m0 /dev/rbd/rbd/foo

注意这里上边 map 时返回的路径为 /dev/rbd0,这里格式化路径为 /dev/rbd/rbd/foo,其实是同一个地址:

$ ls -al /dev/rbd/rbd/foo 
lrwxrwxrwx 1 root root 10 12 7 18:10 /dev/rbd/rbd/foo -> ../../rbd0

稍等片刻之后,就格式化成功了。

2.在管理节点(admin-node)上挂载该块设备就可以测试使用了。

$ sudo mkdir /mnt/rbd
$ sudo mount /dev/rbd/rbd/foo /mnt/rbd

查看挂载情况:
CentOS7安装并使用Ceph

3.最后,我们测试一下生成一个 500M 大文件,看是否自动同步到 osd节点吧!

$ cd /mnt/rbd
$ sudo dd if=/dev/zero of=testrbd bs=500M count=1
记录了1+0 的读入
记录了1+0 的写出
524288000字节(524 MB)已复制,1.99325 秒,263 MB/秒

查看挂载磁盘信息:

$ df -h | grep sdd

可以看到其中两个osd节点的空间减少了500M。

4.移除rbd块设备过程:

  • 先umount掉
  • 再rbd unmap掉
  • 最后rbd remove

参考:

1.http://docs.ceph.com/docs/master/rados/deployment/ceph-deploy-osd/
2.https://www.cnblogs.com/boshen-hzb/p/6796604.html
3.http://blog.csdn.net/aixiaoyang168/article/details/78788703
4.http://www.zphj1987.com/2016/06/07/rbd%E6%97%A0%E6%B3%95map-rbd-feature-disable/