搭建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
2
3
4
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节点创建新用户

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

配置sudo权限

1
2
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 的用户里的用户名。

1
2
3
4
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。

1
2
3
4
5
6
7
8
9
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[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

1
2
3
4
5
6
7
8
[mons]
server[c:e]

[mgrs]
server[c:e]

[osds]
server[c:e]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
7
8
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则表明配置成功。

1
2
3
4
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即可:

1
2
---
copy_admin_key: true

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

vim inventory

1
2
3
4
5
6
7
8
9
10
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查看集群概况及状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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

1
2
3
4
5
6
7
[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

1
2
[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的登录地址以及随机生成的用户信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

1
2
3
4
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

1
2
3
4
5
[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

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

    1
    2
    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

    1
    2
    3
    4
    HOST  ADDR  LABELS       STATUS
    vm1 vm1 mon cephadm
    vm2 vm2 mon
    vm3 vm3 mon

添加OSD节点

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

ceph orch device ls

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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节点:

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