ceph-ansible安装部署指南(centos-7.6)
本文档主要讲述如何基于社区发布的Ceph-N版进行搭建Ceph集群(EC策略,bluestore)。以及对搭建过程中遇到的一些问题进行了解答。
<一> 准备工作
一、 配置主机名
A、配置主机节点
Ceph1节点:
hostnamectl --static set-hostname ceph1
其余节点以此类推。
B、修改域名解析文件:
vi /etc/hosts
在各个集群和客户端节点的“/etc/hosts”中添加如下内容:
10.1.172.86 ceph1
10.1.172.87 ceph2
10.1.172.88 ceph3
10.1.172.88 ceph4
…
二、 配置免密登录
需配置ceph1节点对所有主/客户机节点的免密(包括ceph1本身),如果有客户端,也需要配置客户端client1节点对所有主/客户机节点的免密(包括client1本身)。配置方法如下:
在ceph1节点生成公钥,并发放到各个主机/客户机节点。
ssh-keygen -t rsa
for i in {1..9}; do ssh-copy-id ceph$i; done
输入ssh-keygen –t rsa后一路按回车使用默认配置。
三、 关闭防火墙
关闭本节点防火墙,需在所有Ceph节点执行如下命令:
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
四、 关闭SELinux
关闭节点SELinux,需在所有节点执行。临时关闭,重启后失效命令:
setenforce 0
永久关闭,重启后生效命令:
vi /etc/selinux/config
修改文件SELINUX=disabled,如:
五、 配置repo源
A、在所有集群和客户端节点建立ceph.repo
vi /etc/yum.repos.d/ceph.repo
并加入以下内容:
[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-nautilus/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
B、更新yum源
yum clean all && yum makecache
C、安装epel源
yum -y install epel-release
D、修改所有节点代理配置(如果需要)
vim /etc/environment
添加如下内容使其支持相关依赖包的安装:
export http_proxy=http://{Proxy-User-Name}:{Proxy-Password}@<Proxy-Server-IP-Address>:<Proxy-Port>
export https_proxy= http://{Proxy-User-Name}:{Proxy-Password}@<Proxy-Server-IP-Address>:<Proxy-Port>
export ftp_proxy= http://{Proxy-User-Name}:{Proxy-Password}@<Proxy-Server-IP-Address>:<Proxy-Port>
export no_proxy=127.0.0.1,localhost
六、配置NTP服务
Ceph中会自动校验存储节点之间的时间,若不同节点之间时差较大,会有告警,因此执行如下步骤:
A. 安装ntp服务
1、 在所有节点安装NTP。
yum -y install ntp ntpdate
2、 在所有集群和客户端节点备份旧配置。
cd /etc && mv ntp.conf ntp.conf.bak
3、 以ceph1为NTP服务端节点,在ceph1新建NTP文件。
vi /etc/ntp.conf
并新增如下内容作为NTP服务端:
restrict 127.0.0.1
restrict ::1
restrict 10.1.172.0 mask 255.255.255.0
server 127.127.1.0
fudge 127.127.1.0 stratum 8
4、 在ceph2、ceph3及所有其他节点新建NTP文件。
vi /etc/ntp.conf
并新增如下内容作为客户端:
server 10.1.172.86
保存并退出。
B. 启动NTP服务
1、 在ceph1节点启动NTP服务,并检查状态。
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd
2、 在除ceph1的所有节点强制同步server(ceph1)时间。
ntpdate ceph1
3、 在除ceph1的所有节点写入硬件时钟,避免重启后失效。
hwclock –w
4、 在除ceph1的所有节点安装并启动crontab工具。
yum install -y crontabs
chkconfig crond on
systemctl start crond
crontab –e
5、 添加以下内容,每隔10分钟自动与ceph1同步时间。
*/10 * * * * /usr/sbin/ntpdate 10.1.172.86
<二> 安装ansible
如下操作都仅需在ceph1节点上操作。
一、 安装ceph-ansible
A. 安装ansible
yum -y install ansible
B. 安装ceph-ansible
1、 确保环境上安装了git,可通过以下方式安装。
yum -y install git
2、 配置“http.sslVerify”参数为“false”,跳过系统证书。
git config --global http.sslVerify false
3、 下载ceph-ansible。
git clone -b stable-4.0 https://github.com/ceph/ceph-ansible.git --recursive
二、 安装ceph-ansible依赖
A. 安装python-pip
yum install -y python-pip
B. 将pip更新到最新版本
pip install –upgrade
C. 检查并安装需要的软件版本
cd /home/ceph-ansible/
pip install -r requirements.txt
三、 解决环境依赖问题
A. 所有节点安装依赖
yum install -y yum-plugin-priorities
B. 解决rpm_key依赖问题
1、 进入redhat_community_repository.yml。
vim /home/ceph-ansible/roles/ceph-common/tasks/installs/redhat_community_repository.yml
2、 注释如下代码:
C. 解决grafana依赖问题
1、 进入configure_grafana.yml。
vim /home/ceph-ansible/roles/ceph-grafana/tasks/configure_grafana.yml
2、 注释如下代码:
D. 创建服务节点配置列表
在ceph-ansible目录内新建hosts文件。
vi /home/ceph-ansible/hosts
并添加如下内容:
9节点图片太长了,所以示例图片中是两个节点为例。
该操作用于定义集群中的主机,以及每个主机在Ceph集群中扮演的角色。可根据整个集群的需要在集群节点上部署相应的应用。
各参数意义如下所示。
[mons]
作为Monitor节点
[mgrs]
作为MGR节点
[osds]
作为OSD节点,具体OSD配置在osds.yml文件中配置
[mdss]
作为MDS节点,文件存储中需要指定
[rgws]
作为RGW节点,对象存储中需要指定
[clients]
作为客户端节点
[grafana-server]
一般需要保留该参数,不然会报缺少的错误
五、修改ceph-ansible配置文件
A、配置更名
在ansible部署时,必须传递相应的playbook给ansible-playbook命令。需要修改相应的playbook名称,然后修改对应的内容,使之满足集群部署的要求。
使用ceph-ansible提供的Ansible变量用来设置Ceph集群的配置。
所有选项及默认配置放在“group_vars”目录下,每种Ceph进程对应相关的配置文件。
cd /home/ceph-ansible/group_vars/
cp mons.yml.sample mons.yml
cp mgrs.yml.sample mgrs.yml
cp mdss.yml.sample mdss.yml
cp rgws.yml.sample rgws.yml
cp osds.yml.sample osds.yml
cp clients.yml.sample clients.yml
cp all.yml.sample all.yml
B、添加ceph.conf配置参数
“all.yml”文件中,“ceph_conf_overrides”变量可用于覆盖ceph.conf中已配置的选项,或是增加新选项。
进入“all.yml”文件,修改“ceph_conf_overrides”这个参数。
vim all.yml
添加如下内容:
ceph_conf_overrides:
global:
osd_pool_default_pg_num: 64
osd_pool_default_pgp_num: 64
osd_pool_default_size: 3
mon:
mon_allow_pool_create: true
C、定义osd
osds.yml中可以对osd进行定义,支持两种方式设置OSD(object storage device)盘、WAL(write ahead log)盘和DB(data base)盘。
方法一:ceph-volume lvm batch方式
修改groups_vars路径下的osds.yml文件,根据需要指定“devices”,“dedicated_devices”和“bluestore_wal_devices”中的设备:
devices表示系统中的数据盘,可以与osds_per_device选项结合,设置每个磁盘上创建的OSD数量。
dedicated_devices即block.db。
bluestore_wal_devices即block.wal。
dedicated_devices和bluestore_wal_devices的磁盘不能为相同磁盘。
dedicated_devices和bluestore_wal_devices可以包含一个或多个磁盘。
系统会根据devices中的磁盘数量,以及osds_per_device,将dedicated_devices和bluestore_wal_devices下的磁盘进行均分。
单个OSD的block.db大于等于50GB,否则可能会以为block.db过小而安装报错。
方法二:ceph-volume,从逻辑卷中创建osd
修改groups_vars路径下的osds.yml文件,根据需要指定lvm_volumes属性下的所有OSD设备,包含几种不同的组合场景:
只指定数据盘。
指定数据盘+WAL。
指定数据盘+WAL+DB。
指定数据盘+DB。
使用此模式时需要事先在所有集群节点上创建对应的逻辑卷。
1、创建对应的vg。
/usr/sbin/vgcreate --yes -s 1G ceph-data /dev/sdd
2、基于vg创建lv。
/usr/sbin/lvcreate -l 300 -n osd-data2 ceph-data
3、 确认lv创建情况
lvs
一般没有特殊需求时,只要osds.yml配需要的盘即可,其他均使用Ceph默认配置,如下对象所示。
D、对象存储配置
1、进入site.yml文件。
vim site.yml
在hosts选项下,增加rgws的定义:
- hosts:
- mons
- osds
- mdss
- rgws
- nfss
#- rbdmirrors
- clients
- mgrs
#- iscsigws
#- scsi-gws #- for backward compatibility only!
# - grafana-server
#- rgwloadbalancers
2、 定义Ceph集群配置
在all.yml中,设置前端网络类型,端口,每个RGW节点的RGW实例数。配置可以如下:
ceph_origin: repository
ceph_repository: community
ceph_mirror: http://download.ceph.com
ceph_stable_release: nautilus
ceph_stable_repo: "{{ ceph_mirror }}/rpm-{{ ceph_stable_release }}"
ceph_stable_redhat_distro: el7
monitor_interface: enp133s0
journal_size: 5120
public_network: 10.1.172.0/0
cluster_network: 10.1.206.0/0
osd_objectstore: bluestore
## Rados Gateway options
radosgw_frontend_type: beast
radosgw_frontend_port: 12345
radosgw_interface: "{{monitor_interface}}"
radosgw_num_instances: 3
常用参数说明:
monitor_interface
Public Network的网口设备ID
radosgw_frontend_type
RGW前端类型,根据需要选填
radosgw_frontend_port
RGW前端端口,根据需要选填
radosgw_num_instances
设置每个节点上RGW的实例个数,此时RGW的访问端口基于radosgw_frontend_port指定的端口号递增。
3、 设置rgw服务权限。
在rgws.yml文件中设置RGW默认数据池和索引池的pg num和size,以及RGW服务能否访问私有设备的权限。
rgw_create_pools:
defaults.rgw.buckets.data:
pg_num: 1024
size: ""
defaults.rgw.buckets.index:
pg_num: 1024
size: ""
###########
# SYSTEMD #
###########
# ceph_rgw_systemd_overrides will override the systemd settings
# for the ceph-rgw services.
# For example,to set "PrivateDevices=false" you can specify:
ceph_rgw_systemd_overrides:
Service:
PrivateDevices: False
国内比较快的源可以选择:
http://mirrors.ustc.edu.cn/ceph/
可以将此地址替换到/etc/yum.repo.d/ceph.repo中,以及上面的group_vars/all.yml中。
E、文件存储配置
1、配置site.yml,同上面的对象存储,但增加- mdss。
2、定义ceph集群配置。
修改all.yml,通过查找CephFS关键字修改配置如下:
ceph_origin: repository
ceph_repository: community
ceph_mirror: http://download.ceph.com
ceph_stable_release: nautilus
ceph_stable_repo: "{{ ceph_mirror }}/rpm-{{ ceph_stable_release }}"
ceph_stable_redhat_distro: el7
monitor_interface: enp133s0
journal_size: 5120
public_network: 10.1.172.0/24
cluster_network: 10.1.206.0/24
osd_objectstore: bluestore
# CEPHFS #
##########
cephfs: cephfs # name of the ceph filesystem
cephfs_data_pool:
name: "{{ cephfs_data if cephfs_data is defined else 'cephfs_data' }}"
pg_num: "{{ osd_pool_default_pg_num }}"
pgp_num: "{{ osd_pool_default_pg_num }}"
rule_name: "replicated_rule"
type: 1
# erasure_profile: ""
# expected_num_objects: ""
application: "cephfs"
size: "{{ osd_pool_default_size }}"
min_size: "{{ osd_pool_default_min_size }}"
cephfs_metadata_pool:
name: "{{ cephfs_metadata if cephfs_metadata is defined else 'cephfs_metadata' }}"
pg_num: "{{ osd_pool_default_pg_num }}"
pgp_num: "{{ osd_pool_defaultpg_num }}"
rule_name: "replicated_rule"
type: 1
# erasure_profile: ""
# expected_num_objects: ""
application: "cephfs"
size: "{{ osd_pool_default_size }}"
min_size: "{{ osd_pool_default_min_size }}"
cephfs_pools:
- "{{ cephfs_data_pool }}"
- "{{ cephfs_metadata_pool }}"
实际配置可以如下对象所示:
<三>、ceph集群部署
一、 部署集群
ansible-playbook -vv -i hosts site.yml
执行结束,在执行页面会有相关的提示,如图所示,所有节点显示failed=0,则部署成功。
查看集群健康状态:
ceph health detail
显示HEALTH_OK则集群健康。
二、 删除集群
ansible-playbook -vv -i hosts infrastructure-playbooks/purge-cluster.yml
如果有报错,无法清理干净,可以通过如下命令清除:
在每个ceph节点上执行如下指令,即可将环境清理至刚安装完ceph客户端时的状态!强烈建议在旧集群上搭建之前清理干净环境,否则会发生各种异常情况。
ps aux|grep ceph |awk '{print $2}'|xargs kill -9
ps -ef|grep ceph
确保此时所有ceph进程都已经关闭!!!如果没有关闭,多执行几次
umount /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/mds/*
rm -rf /var/lib/ceph/bootstrap-mds/*
rm -rf /var/lib/ceph/bootstrap-osd/*
rm -rf /var/lib/ceph/bootstrap-rgw/*
rm -rf /var/lib/ceph/bootstrap-mgr/*
rm -rf /var/lib/ceph/tmp/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*
同时清理主节点中my-cluster目录下的所有内容:
cd /root/my-cluster/
rm *
三、 升级集群
ansible-playbook -vv -i hosts infrastructure-playbooks/rolling_update.yml
<四> 集群扩容
一、 添加ceph mon节点
1、 在集群的hosts文件的[mons]群组下添加新的Ceph Monitor节点。
2、 确认ansible可以连接到节点。
ansible all -i hosts -m ping
3、 运行脚本。
法一:
切换到ansible主目录,在主目录运行site.yml脚本。
ansible-playbook –vv -i hosts site.yml
法二:
拷贝infrastructure-playbook/add-mon.yml到主目录下,然后运行脚本。
cp infrastructure-playbook/add-mon.yml add-mon.yml
ansible-playbook -i hosts add-mon.yml
二、 添加ceph osd节点
A、 具有相同磁盘拓扑
1、 在“/ceph-ansible/infrastructure-playbooks/”路径下有个add-osd.yml文件,复制到主目录下。
cp ./infrastructure-playbooks/add-osd.yml ./add-osd.yml
2、在集群的hosts文件的[osds]群组下增加新的OSD节点名。
3、确认Ansible可以连接到节点。
ansible all -i hosts -m ping
4、 运行脚本。
ansible-playbook -i host add-osd.yml
B、 具有不同磁盘拓扑
1、在集群的hosts文件的[osds]群组下增加新的OSD节点名,并在新增OSD节点名后写入需要的devices信息。
2、和A步骤后面一样。
三、添加ceph mds节点
1、 在集群hosts文件中的[mdss]群组中添加新的MDS节点名。
2、修改主目录下site.yml脚本里的mdss配置,将注释符删除。
3、在主目录下运行脚本。
ansible-playbook -i hosts site.yml
<五> Q&A
一、 ntp服务同步时报错
ntp服务同步时报ntpdate[17416]: the NTP socket is in use, exiting。
原因:是由于 xntpd 已经绑定到了该 Socket。运行 ntpdate 时,它会首先进行广播,然后侦听端口 123。如果 xntpd 正在运行,而有一个进程已经在侦听该端口了,则会使 ntpdate 无法在上面运行。运行下列命令,即可找出 xntpd 的 PID。
ps –ef|grep xntpd
root 124185 6192 0 15:49 pts/1 00:00:00 grep xntpd
发现没有找到pid。
使用
lsof –i:123
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ntpd 17337 ntp 16u IPv4 33887 0t0 UDP *:ntp
ntpd 17337 ntp 17u IPv6 33888 0t0 UDP *:ntp
ntpd 17337 ntp 18u IPv4 33893 0t0 UDP localhost:ntp
ntpd 17337 ntp 19u IPv4 33894 0t0 UDP ceph4:ntp
ntpd 17337 ntp 20u IPv6 33895 0t0 UDP ceph4:ntp
ntpd 17337 ntp 21u IPv6 33896 0t0 UDP localhost:ntp
然后
kill -9 17337
再
ntpdate X.X.X.X
ntpdate[17423]: adjust time server 10.4.128.181 offset -0.000021 sec
即可同步成功。
二、 集群告警mons are allowing insecure global_id reclaim
集群告警mons are allowing insecure global_id reclaim时,只需要配置:
ceph config set mon mon_warn_on_insecure_global_id_reclaim false
ceph config set mon mon_warn_on_insecure_global_id_reclaim_allowed false
即可消除。
三、 集群告警1 daemons have recently crashed
集群告警1 daemons have recently crashed一般是说明某个进程出现过crash的现象。在这种情况下,需要输入:
ceph crash ls-new
查看crash具体信息:
ID ENTITY NEW
2021-05-27_01:59:30.050354Z_86a2497c-da90-4c1d-a121-13477adee12d mon.ceph3 *
可以看出在2021-05-27_01:59:30.05035出现过ceph-mon crash。前面的ID复制下来,输入:
ceph crash info <crash-id>
可以看到具体的crash信息,根据具体类型定位原因。
如果不是重要问题,可以通过:
ceph crash archive <crash-id>
消除告警,或 ceph crash archive-all
还可通过 ceph config set mgr mgr/crash/warn_recent_interval 0
完全禁用这种警告(不建议)。
四、 另一种方法新增ceph-osd
当集群需要扩容时,可以用另一种方法增加ceph-osd,使用比较方便的工具ceph-deploy自动部署新osd。首先下载安装ceph-deploy部署工具:
yum –y install ceph-deploy
在/etc/ceph/文件夹下(放ceph.conf的地方),执行:
ceph-deploy gatherkeys <node-name>
执行
ceph-deploy osd create --data /dev/vda <node-name>
即可添加新osd到集群中。
如遇到报:Insufficient Free Extents for a Logical Volume,详细比如:
Insufficient free extents (0) in volume group vg1: 5119 required。
则表明是之前搭建集群osd创立失败过,存储逻辑卷没有删除导致没有更多空间分配新的逻辑卷。这时需要手动执行:
fdisk –l
查看所有的逻辑卷,发现确实有很多并未挂载的逻辑卷,再执行:
vgremove <vg-name>
一个一个进行手动删除,删除后,再执行上述
ceph-deploy osd create --data /dev/vdi <node-name>
命令即可创建成功。如果创建成功后,有pg incomlete等警告,可以通过ceph health detail
查看详细原因,一般可能是某个池min_size设置过大导致,删除池后重新建立min_size更小的池即可。
五、 新增ceph-rgw
当集群需要新增对象网关ceph-rgw时,也可以使用比较方便的工具ceph-deploy自动部署新rgw。方法与上面的新增ceph-osd类似。
首先现在/etc/ceph/ceph.conf中新增一个配置段:
[client.rgw.node4]
rgw_frontends = "civetweb port=80"
并将此配置推送到其他节点:
ceph-deploy --overwrite-conf config push <node-name>
然后安装ceph object gateway:
ceph-deploy install --rgw <gateway-node1> [<gateway-node2> ...]
安装RGW实例:
ceph-deploy rgw create <node-name>
一旦RGW开始运行,我们就可以通过端口7480(如果没有修改的话)来访问。如:
http://<node-name>:7480
如果RGW运行正常,它应该返回类似的信息:
<ListAllMyBucketsResult>
<Owner>
<ID>anonymous</ID>
<DisplayName/>
</Owner>
<Buckets/>
</ListAllMyBucketsResult>
剩下的创建用户的步骤都应该在RGW节点上运行。
六、 创建文件系统时报不支持EC数据池问题
当拥有一个ceph_metadata元数据副本类型池和一个ceph_data数据EC类型池时,建立文件系统:
ceph fs new cephfs cephfs_metadata cephfs_data
N版可能会报:
Error EINVAL: pool 'cephfs_data' (id '11') is an erasure-coded pool. Use of an EC pool for the default data pool is discouraged; see the online CephFS documentation for more information. Use --force to override.
加上—force后:
ceph fs new cephfs cephfs_metadata cephfs_data --force
也可能会报:
Error EINVAL: pool 'cephfs_data' (id '11') is an erasure-coded pool, with no overwrite support
这是需要手动设置ceph_data池
allow_ec_overwrites=true
ceph osd pool set cephfs_data allow_ec_overwrites true
再执行
ceph fs new cephfs cephfs_metadata cephfs_data –force
就可以创建文件系统成功。
七、 手动增加ceph对象网关(每节点多网关)
1、 查看/etc/ceph/ceph.conf,确定已有rgw的keyring的位置,一般是在/var/lib/ceph/radosgw/下(本次拿该路径为例)。
2、 在/var/lib/ceph/radosgw/下新建ceph-rgw.ceph1.rgw1文件夹。
3、 创建keyring文件:
ceph-authtool --create-keyring /var/lib/ceph/radosgw/ceph-rgw.ceph1.rgw1/keyring
4、 修改keyring文件权限:
chown ceph:ceph /var/lib/ceph/radosgw/ceph-rgw.ceph1.rgw1/keyring
5、 生成ceph-radosgw服务对应的用户和Key:
ceph-authtool /var/lib/ceph/radosgw/ceph-rgw.ceph1.rgw1/keyring -n [client.rgw.ceph1.rgw1] --gen-key
(中括号内是名字,可参考已有rgw名字)
6、 为用户添加访问权限:
ceph-authtool -n client.rgw.ceph1.rgw1 --cap osd 'allow rwx' --cap mon 'allow rwx' /var/lib/ceph/radosgw/ceph-rgw.ceph1.rgw1/keyring
7、 导入keyring到集群中:
ceph -k /etc/ceph/ceph.client.admin.keyring auth add client.rgw.ceph1.rgw1 -i /var/lib/ceph/radosgw/ceph-rgw.ceph1.rgw1/keyring
8、 查看集群中是否已有对应的用户:
ceph auth list
9、 配置ceph.conf:
vim /etc/ceph/ceph.conf
,新增内容:
[client.rgw.ceph1.rgw1]
host = ceph1
keyring = /var/lib/ceph/radosgw/ceph-rgw.ceph1.rgw1/keyring
log file = /var/log/ceph/ceph-rgw-ceph1.rgw1.log
rgw frontends = beast endpoint=10.4.128.181:8081
rgw thread pool size = 512
10、 在cd /etc/systemd/system/ceph-radosgw.target.wants/
中:
cp -a ceph-radosgw\@rgw.ceph1.rgw0.service ceph-radosgw\@rgw.ceph1.rgw1.service
然后systemctl start ceph-radosgw@rgw.ceph1.rgw1.service
即可启动完成,并通过systemctl enable ceph-radosgw@rgw.ceph1.rgw1.service
设置开机启动即可。