CentOS8使用cephadm部署和配置Ceph Octopus

  • 部署工具:cephadm
  • 操作系统:CentOS 8
  • Ceph版本:Octopus
  • 操作用户:root

部署前,请注意:根据目前(2020年8月)Ceph官方文档的介绍,cephadm的对各服务的支持情况如下:

  1. 完全支持:MON、MGR、OSD、CephFS、rbd-mirror
  2. 支持但文档不全:RGW、dmcrypt OSDs
  3. 开发中:NFS、iSCSI

准备

除非特别说明,本小节的操作在所有节点进行。

部署环境:

主机 IP 配置 磁盘(除系统盘) 服务
ceph-mon1(虚拟机) 192.168.7.11 4C/8G MON、prom+grafana
ceph-mon2(虚拟机) 192.168.7.12 4C/8G MON、MGR
ceph-mon3(虚拟机) 192.168.7.13 4C/8G MON、MGR
ceph-osd1(物理机) 192.168.7.14 40C/64G 1.6T SSD/4T SAS 4 OSD、MDS、NFS、RGW
ceph-osd2(物理机) 192.168.7.15 40C/64G 1.6T SSD/4T SAS 4 OSD、MDS、NFS、RGW

主机名

确定一下主机名是否正确,尤其是从虚拟机复制过来的节点:


  1. hostnamectl set-hostname ceph-mon1

安装容器运行时

cephadm的部署方式是基于容器进行管理的,可以安装dockerpodman


  1. dnf install -y podman

podman配置国内镜像源:


  1. mv /etc/containers/registries.conf /etc/containers/registries.conf.bak
  2. cat < /etc/containers/registries.conf
  3. unqualified-search-registries = ["docker.io"]
  4. [[registry]]
  5. prefix = "docker.io"
  6. location = "anwk44qv.mirror.aliyuncs.com"
  7. EOF

安装epel

并配置阿里云的源。


  1. yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
  2. sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
  3. sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

安装和配置chrony


  1. dnf install -y chrony
  2. mv /etc/chrony.conf /etc/chrony.conf.bak
  3. cat > /etc/chrony.conf <
  4. systemctl enable chronyd
  5. systemctl restart chronyd

主机名可访问

修改/etc/hosts文件,添加所有节点的IP(如果用DNS也可以)。


  1. 192.168.7.11 ceph-mon1
  2. 192.168.7.12 ceph-mon2
  3. 192.168.7.13 ceph-mon3
  4. 192.168.7.14 ceph-osd1
  5. 192.168.7.15 ceph-osd2

关闭SELINUX


  1. setenforce 0

要使 SELinux 配置永久生效(如果它的确是问题根源),需修改其配置文件/etc/selinux/config


  1. sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

安装python3

cephadm以及ceph命令基于python3运行。


  1. dnf install -y python3

安装cephadm

以下操作在ceph-mon1节点上进行。

使用curl下载最新的cephadm脚本:


  1. curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm
  2. chmod +x cephadm

其实这个脚本就可以用来部署了,如果要安装的话:


  1. ./cephadm add-repo --release octopus
  2. ./cephadm install

部署一个小集群

除非特别说明,本小节的操作在cephadm所在节点进行。

bootstrap

cephadm的部署策略是先在一个节点上部署一个Ceph cluster,然后把其他节点加进来,再部署各种所需的服务。

首先部署的这个节点是一个MON,需要提供IP地址。


  1. mkdir -p /etc/ceph
  2. cephadm bootstrap --mon-ip 192.168.7.11

这个命令会:

  • 创建一个有MON和MGR的新cluster。
  • 为Ceph cluster生成一个SSH key,并添加到/root/.ssh/authorized_keys
  • 生成一个最小化的/etc/ceph/ceph.conf配置文件。
  • 为用户client.admin生成/etc/ceph/ceph.client.admin.keyring
  • 生成公钥/etc/ceph/ceph.pub,这是cephadmceph orch命令)用来连接其他节点的公钥。

上面这几条是官方文档里介绍的,其实用podman ps查看一下,发现已经启动了几个容器:

  • mon(ceph/ceph:v15)
  • mgr(ceph/ceph:v15)
  • crash(ceph/ceph:v15),这是干嘛的?
  • prometheus和node-exporter,用于收集监控指标数据
  • alertmanager,以前没用过,应该是告警用的
  • grafana,可以利用prometheus收集到的数据进行监控的可视化

命令的输出如下:


  1. ...
  2. ...
  3. INFO:cephadm:Ceph Dashboard is now available at:
  4. URL: https://ceph-mon1:8443/
  5. User: admin
  6. Password: 91qoulprnv
  7. INFO:cephadm:You can access the Ceph CLI with:
  8. sudo /usr/sbin/cephadm shell --fsid 1be68a48-de06-11ea-ae5e-005056b10c97 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
  9. INFO:cephadm:Please consider enabling telemetry to help improve Ceph:
  10. ceph telemetry on
  11. For more information see:
  12. https://docs.ceph.com/docs/master/mgr/telemetry/
  13. INFO:cephadm:Bootstrap complete.

ceph cli

由于有了这些容器,其实就不需要本机安装任何Ceph的包了。

cephadm shell能够连接容器并利用其中已安装的ceph包和命令行工具。所以执行


  1. cephadm shell

就可以进入容器内部,然后执行cephrbdrados等命令了。也可以添加别名:


  1. alias ceph='cephadm shell -- ceph'
  2. # 或利用上面的输出中给出的完整的命令
  3. alias ceph='/usr/sbin/cephadm shell --fsid 1be68a48-de06-11ea-ae5e-005056b10c97 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring -- ceph'

ceph包

前面的./cephadm add-repo --release octopus命令创建了/etc/yum.repos.d/ceph.repo文件,处理一下使用阿里云的源:


  1. sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#' /etc/yum.repos.d/ceph.repo
  2. dnf makecache

然后就可以安装ceph命令行工具了:


  1. dnf install -y ceph-common
  2. ceph -v
  3. ceph -s

添加节点到集群

  1. 将cluster的SSD公钥配置到新节点的authorized_keys文件(即SSH免密):

    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon2
    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon3
    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd1
    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd2

  2. 添加节点到cluster:

    ceph orch host add ceph-mon2
    ceph orch host add ceph-mon3
    ceph orch host add ceph-osd1
    ceph orch host add ceph-osd2

添加MON节点

通常Ceph需要部署3或5个MON节点,如果后来添加的节点与bootstrap的节点是在一个子网里,那么Ceph会自动将添加的节点部署上MON服务,直至达到5个。如要调整:


  1. # ceph orch apply mon **
  2. ceph orch apply mon 3

(方法一)如果要指定MON部署到哪几个具体的节点:


  1. # ceph orch apply mon **
  2. ceph orch apply mon ceph-mon1,ceph-mon2,ceph-mon3

(方法二)此外,还可以用标签来进行指定:


  1. # ceph orch host label add ** mon
  2. ceph orch host label add ceph-mon1 mon
  3. ceph orch host label add ceph-mon2 mon
  4. ceph orch host label add ceph-mon3 mon
  5. # 然后指定
  6. ceph orch apply mon label:mon

可以查看一下标签情况:


  1. ❯ ceph orch host ls
  2. HOST ADDR LABELS STATUS
  3. ceph-mon1 ceph-mon1 mon
  4. ceph-mon2 ceph-mon2 mon
  5. ceph-mon3 ceph-mon3 mon
  6. ceph-osd1 ceph-osd1
  7. ceph-osd2 ceph-osd2

(方法三)还支持用YAML文件来指定:


  1. service_type: mon
  2. placement:
  3. hosts:
  4. - ceph-mon1
  5. - ceph-mon2
  6. - ceph-mon3

配置MGR

本小节及以后的操作可以在任何安装有ceph-common包并且能够连接Ceph集群(有/etc/ceph/ceph.conf和具有管理权限的key文件)的节点上运行。

添加节点后,Ceph会自动启动MGR节点:


  1. ❯ ceph orch ls --service_type mgr
  2. NAME RUNNING REFRESHED AGE PLACEMENT IMAGE NAME IMAGE ID
  3. mgr 2/2 10m ago 74m count:2 docker.io/ceph/ceph:v15 54fa7e66fb03

可以看到,它启动了两个,其中一个是bootstrap的时候指定的ceph-mon1节点。

使用ceph orch ps --daemon_type mgr可以看到,在那两台节点上运行有mgr的容器。

我这部署的时候占用了ceph-osd1节点,仿照MON的标签方式:


  1. ceph orch host label add ceph-mon2 mgr
  2. ceph orch host label add ceph-mon3 mgr
  3. ceph orch apply mgr label:mgr

在OSD节点安装smartmontools(7),默认安装的6版本无法满足需求,会在Dashboard报warning:

Smartctl has received an unknown argument (error code -22). You may be using an incompatible version of smartmontools. Version >= 7.0 of smartmontools is required to successfully retrieve data.


  1. # 在OSD节点上,先下载smartmontool的rpm
  2. wget http://fr2.rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/smartmontools-7.1-1.el8.x86_64.rpm
  3. # 然后复制到各个OSD容器中(先用podman ps查看一下容器名称或ID)
  4. podman cp smartmontools-7.1-1.el8.x86_64.rpm ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5:/tmp
  5. # 然后安装
  6. podman exec -it ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5 rpm -Uvh /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  7. podman exec -it ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5 rm -f /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  8. # 查看安装结果
  9. podman exec -it ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5 smartctl --version

当然,也可以批量操作:


  1. wget http://fr2.rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/smartmontools-7.1-1.el8.x86_64.rpm
  2. for pod in $(podman ps | grep osd. | awk '{print $1}'); do
  3. podman cp smartmontools-7.1-1.el8.x86_64.rpm $pod:/tmp
  4. podman exec -it $pod rpm -Uvh /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  5. podman exec -it $pod rm -f /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  6. podman exec -it $pod smartctl --version | head -n 1
  7. done

添加OSD设备

查看设备:


  1. ceph orch device ls

满足以下条件的设备时AVAIL=True的:

  • 没有分区
  • 没有LVM配置
  • 没有被挂载
  • 没有文件系统
  • 没有Ceph BlueStore OSD
  • 大于5GB

否则无法置备对应的设备。

两种添加办法:

  • 自动添加所有的可用设备

    ceph orch apply osd —all-available-devices

  • 手动添加设备(这里先只添加2个ssd和2个hdd)

    ceph orch daemon add osd :

    ceph orch daemon add osd ceph-osd1:/dev/nvme0n1
    ceph orch daemon add osd ceph-osd2:/dev/nvme0n1
    ceph orch daemon add osd ceph-osd1:/dev/sdb
    ceph orch daemon add osd ceph-osd2:/dev/sdb

此时,在ceph-osd1ceph-osd2两个节点可以看到为每一个OSD启动了一个容器。

虽然标签对OSD不起作用,不过还是打上,方便查看:


  1. ceph orch host label add ceph-osd1 osd
  2. ceph orch host label add ceph-osd2 osd

配置存储池

为了分别测试SSD和HDD的性能,配置两个存储池,存储池ssd落在两块SSD上,而存储池hdd落在HDD上。

通过CRUSH rule来实现这一点,执行ceph osd tree查看现有的osd:


  1. ❯ ceph osd tree
  2. ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
  3. -1 10.18738 root default
  4. -3 5.09369 host ceph-osd1
  5. 2 hdd 3.63820 osd.2 up 1.00000 1.00000
  6. 0 ssd 1.45549 osd.0 up 1.00000 1.00000
  7. -5 5.09369 host ceph-osd2
  8. 3 hdd 3.63820 osd.3 up 1.00000 1.00000
  9. 1 ssd 1.45549 osd.1 up 1.00000 1.00000

可以看到CLASS一列已经自动对添加的设备进行了ssdhdd的分类。

下面创建两个CRUSH rule,根据CLASS进行区分:


  1. # 先查看现有的rule
  2. ❯ ceph osd crush rule ls
  3. replicated_rule
  4. # 创建两个replicated rule
  5. # 格式:ceph osd crush rule create-replicated
  6. ❯ ceph osd crush rule create-replicated on-ssd default host ssd
  7. ❯ ceph osd crush rule create-replicated on-hdd default host hdd

故障域设置为host,由于我这只有两台host,所以replica_size只能为2


  1. ceph config set global osd_pool_default_size 2

创建两个存储池,并通过rule进行约束:


  1. ❯ ceph osd pool create bench.ssd 64 64 on-ssd
  2. pool 'bench.ssd' created
  3. ❯ ceph osd pool create bench.hdd 128 128 on-hdd
  4. pool 'bench.hdd' created
  5. ❯ ceph osd pool ls detail
  6. pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 ...
  7. pool 2 'bench.ssd' replicated size 2 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode on last_change 46 flags hashpspool stripe_width 0
  8. pool 3 'bench.hdd' replicated size 2 min_size 1 crush_rule 2 object_hash rjenkins pg_num 125 pgp_num 120 pg_num_target 32 pgp_num_target 32 pg_num_pending 124 autoscale_mode on last_change 67 lfor 0/67/67 flags hashpspool stripe_width 0

可以看到,新增加的两个pool都是size 2,不过bench.hdd的pg数量有些奇怪,ceph -s看一下:


  1. ❯ ceph -s
  2. cluster:
  3. id: 1be68a48-de06-11ea-ae5e-005056b10c97
  4. health: HEALTH_OK
  5. services:
  6. mon: 3 daemons, quorum ceph-mon2,ceph-mon3,ceph-mon1 (age 35m)
  7. mgr: ceph-mon2.puzrvy(active, since 2d), standbys: ceph-mon3.gvdtdw
  8. mds: 2 up:standby
  9. osd: 4 osds: 4 up (since 2d), 4 in (since 2d); 1 remapped pgs
  10. data:
  11. pools: 3 pools, 146 pgs
  12. objects: 4 objects, 0 B
  13. usage: 4.1 GiB used, 10 TiB / 10 TiB avail
  14. pgs: 0.685% pgs not active
  15. 145 active+clean
  16. 1 clean+premerge+peered
  17. progress:
  18. PG autoscaler decreasing pool 3 PGs from 128 to 32 (4m)
  19. [=============...............] (remaining: 4m)

发现健康状况是HEALTH_OK的,不过下方的progress确实正在进行PG数量的调整,原来在Ceph nautilus版本引入了PG的自动调整功能,难道不用指定具体的pg_numpgp_num了吗,试一下:


  1. ❯ ceph osd pool create testpg on-hdd
  2. pool 'testpg' created
  3. ❯ ceph osd pool ls detail
  4. ...
  5. pool 4 'testpg' replicated size 2 min_size 1 crush_rule 2 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 458 flags hashpspool stripe_width 0

不错,看来以后不用找公式算PG个数了。删除测试pool:


  1. ❯ ceph config set mon mon_allow_pool_delete true
  2. ❯ ceph osd pool rm testpg testpg --yes-i-really-really-mean-it
  3. pool 'testpg' removed

RGW

部署RGW daemon

首先,创建RGW的realmzonegroupzone


  1. # radosgw-admin realm create --rgw-realm= --default
  2. ❯ radosgw-admin realm create --rgw-realm=testenv --default
  3. # radosgw-admin zonegroup create --rgw-zonegroup= --master --default
  4. ❯ radosgw-admin zonegroup create --rgw-zonegroup=mr --master --default
  5. # radosgw-admin zone create --rgw-zonegroup= --rgw-zone= --master --default
  6. ❯ radosgw-admin zone create --rgw-zonegroup=mr --rgw-zone=room1 --master --default

部署RGW的命令如下(实例命令部署在了两个OSD的机器上):


  1. # ceph orch apply rgw ** ** --placement="** [** ...]"
  2. ❯ ceph orch apply rgw testenv mr-1 --placement="2 ceph-osd1 ceph-osd2"

配置dashboard

由于RGW拥有自己的一套账号体系,所以为了让Dashboard能够查看RGW相关信息,需要在RGW中创建一个dashboard用的账号,以便能够查询相关信息

首先,创建用户:


  1. ❯ radosgw-admin user create --uid=dashboard --display-name=dashboard --system
  2. ...
  3. "keys": [
  4. {
  5. "user": "dashboard",
  6. "access_key": "EC25NETO4CXIISOB32WY",
  7. "secret_key": "XrZQcFv7c56kidMtnwFGBSDApseQLwA1VPYolCZA"
  8. }
  9. ],
  10. ...

然后,将access_keysecret_key配置到dashboard:


  1. ❯ ceph dashboard set-rgw-api-access-key "EC25NETO4CXIISOB32WY"
  2. ❯ ceph dashboard set-rgw-api-secret-key "XrZQcFv7c56kidMtnwFGBSDApseQLwA1VPYolCZA"

修改相关存储池到SSD上

除了具体放对象数据的存储池(通常是以.data结尾的),将其他的存储池迁至SSD上,如:


  1. ceph osd pool set .rgw.root crush_rule on-ssd
  2. ...

块存储

首先,为bench.hdd两个存储池开启rbd的application。


  1. ❯ ceph osd pool application enable bench.hdd rbd
  2. enabled application 'rbd' on pool 'bench.hdd'

然后创建RBD镜像:


  1. ❯ rbd create bench.hdd/disk1 --size 102400

将RBD镜像映射到块设备:


  1. ❯ rbd map bench.hdd/disk1
  2. /dev/rbd0

然后用XFS格式化,并挂载:


  1. ❯ mkfs.xfs /dev/rbd0
  2. ❯ mount /dev/rbd0 /mnt/rbd

CephFS

配置MDS节点

同样用标签的方式:


  1. ceph orch host label add ceph-osd1 mds
  2. ceph orch host label add ceph-osd2 mds
  3. # ceph orch apply mds label:mds
  4. ceph orch apply mds cephfs label:mds

创建CephFS

有两种方式:

1.利用ceph的编排功能自动创建(名称为cephfs):


  1. ❯ ceph fs volume create cephfs

关于CephFS,可以从下图了解其基本原理:

CentOS8使用cephadm部署和配置Ceph Octopus_第1张图片

CephFS底层是基于RADOS的,具体来说是基于RADOS上的两个存储池,一个用来存储文件,一个用来存储文件的元数据。所以,诸如文件的目录结构等信息都是在元数据存储池里的,因此,如果有SSD,建议把元数据的存储池放在SSD上,一方面加速,另一方面,元数据的体积并不会特别大。而文件数据存储池应该放在HDD上。


  1. # 先查看一下两个存储池
  2. ❯ ceph osd pool ls detail
  3. ...
  4. pool 5 'cephfs.cephfs.meta' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 463 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
  5. pool 6 'cephfs.cephfs.data' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 464 flags hashpspool stripe_width 0 application cephfs
  6. # 通过修改CRUSH rule来将它们分别约束到SSD和HDD上
  7. ❯ ceph osd pool set cephfs.cephfs.meta crush_rule on-ssd
  8. set pool 5 crush_rule to on-ssd
  9. ❯ ceph osd pool set cephfs.cephfs.data crush_rule on-hdd
  10. set pool 6 crush_rule to on-hdd

2.手动创建CephFS

当然,也可以通过手动的方式创建CephFS(假设名称为mycephfs):


  1. # 先创建两个存储池
  2. ❯ ceph osd pool create cephfs.mycephfs.meta on-ssd
  3. ❯ ceph osd pool create cephfs.mycephfs.data on-hdd
  4. # 然后创建CephFS
  5. # ceph fs new <元数据存储池> <文件数据存储池>
  6. ❯ ceph fs new mycephfs cephfs.mycephfs.meta cephfs.mycephfs.data

最后,挂载CephFS(需要安装ceph-commons):


  1. ❯ mkdir -p /mnt/cephfs
  2. ❯ mount -t ceph :/ /mnt/cephfs -o name=admin,secret=AQBYSjZfQF+UJBAAC6QJjNACndkw2LcCR2XLFA==

NFS

Ceph推荐使用NFS-ganesha来提供NFS服务。

首先创建存储池nfs-ganesha(创建在SSD上):


  1. ❯ ceph osd pool create nfs-ganesha on-ssd
  2. # 以下这句可以不用执行,不过会有个”1 pool(s) do not have an application enabled“的WARN
  3. ❯ ceph osd pool application enable nfs-ganesha nfs

然后利用cephadm部署NFS服务(这里我放在了两个OSD主机上了):


  1. # ceph orch apply nfs ** ** ** --placement="** [** ...]"
  2. ❯ ceph orch apply nfs nfs nfs-ganesha nfs-ns --placement="ceph-osd1 ceph-osd2"

为了在dashboard中进行操作,可以进行如下设置:


  1. ❯ ceph dashboard set-ganesha-clusters-rados-pool-namespace nfs-ganesha/nfs-ns

Ceph的NFS是基于CephFS提供的,我们首先在CephFS中创建一个/nfs目录,用于作为NFS服务的根目录。


  1. # 前一步骤中已经挂载了CephFS到/mnt/cephfs
  2. ❯ mkdir /mnt/cephfs/nfs

其中mount的时候的secret是/etc/ceph/ceph.client.admin.keyring的值,也可以替换成secretfile=/etc/ceph/ceph.client.admin.keyring

最后,在dashboard中创建一个NFS即可:

CentOS8使用cephadm部署和配置Ceph Octopus_第2张图片

挂载NFS:


  1. mount -t nfs 192.168.7.14:/nfs /mnt/nfs

CentOS8使用cephadm部署和配置Ceph Octopus-蒲公英云 (dandelioncloud.cn)

你可能感兴趣的:(ceph,centos,docker)