CentOS 部署 Ceph 并对接 OpenStack

CentOS 部署 Ceph 并对接 OpenStack

0847

CentOS 部署 Ceph 并对接 OpenStack

主机结构

主机名外网地址内网IP角色
ceph1192.168.10.6110.0.0.61ceph 储存节点1
ceph2192.168.10.6210.0.0.62ceph 储存节点2
ceph3192.168.10.6310.0.0.63ceph 储存节点3
controller02192.168.10.1310.0.0.13glance、Ceph部署节点
computer01192.168.10.1410.0.0.14cinder、nova
computer02192.168.10.1510.0.0.15nova

前期准备

编辑hosts,并同步至所有ceph节点

以其中一台机器为例,需要hosts全部同步

[root@ceph1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.61   ceph1
10.0.0.62   ceph2
10.0.0.63   ceph3
10.0.0.13   controller02
10.0.0.14   computer01
10.0.0.15   computer02

[root@ceph1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Kc/UMHPDWCAwODmzHVe/kLtyBEjYEOVcoJYvYXZeYnE root@ceph1
The key's randomart image is:
+---[RSA 2048]----+
|  oOBoE.o..      |
|  B*o*.. *       |
|  B*Boo B =      |
| +.*.o . X o     |
|  . o . S o      |
|   .   * .       |
|      . =        |
|       o         |
|                 |
+----[SHA256]-----+

[root@ceph1 ~]# ssh-copy-id root@ceph2
[root@ceph1 ~]# ssh-copy-id root@ceph3

增加Ceph源,关闭防火墙和Selinux并同步ceph所有机器

因为Ceph源在国外会比较慢,所以这里使用国内镜像源,需要添加的源有:epel,base,ceph

baseurl后面的rpm-nautilus代表着ceph的发行版本

源编写完后,使用scp同步至所有ceph机器即可。

# Base源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
# Epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo

vim /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-nautilus/el7/$basearch
enabled=1
priority=2
gpgcheck=1
gpgkey=http://mirrors.ustc.edu.cn/ceph/keys/release.asc

[ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.ustc.edu.cn/ceph/rpm-nautilus/el7/noarch
enabled=1
priority=2
gpgcheck=1
gpgkey=http://mirrors.ustc.edu.cn/ceph/keys/release.asc

yum clean all && yum makecache fast

最后检查Selinux和关闭防火墙即可

[root@ceph1 ~]# getenforce
Disabled
[root@ceph1 ~]# systemctl stop firewalld && systemctl disable firewalld

控制节点安装Ceph

Ceph的特点就是去中心化,就是说,不存在控制节点这个说法,但是在部署中,必须存在一台伪控制节点来部署ceph,但是这个控制节点不允许为ceph集群中的任何一个节点。所以在这里我们使用controller02来进行部署集群

安装ceph-deploy工具

yum -y install python-setuptools ceph-deploy

创建/etc/ceph文件夹并进入文件夹

mkdir -p /etc/ceph

如何清空ceph数据:

先清空之前的所有的Ceph数据,如果是新装可以不用执行这个步骤,如果是重新部署的话也需要提前执行下面的命令

ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys

命令语法:ceph-deploy purgedata 节点名

清空ceph正确顺序:

ceph-deploy forgetkeys
ceph-deploy purge ceph1 ceph2 ceph3
ceph-deploy purgedata ceph1 ceph2 ceph3

创建集群

首先我们需要切换至/etc/ceph文件夹,然后使用ceph-deploy创建一个集群

我们在控制节点上使用ceph-deploy生成新的ceph.conf文件

ceph-deploy new ceph1 ceph2 ceph3

创建完成后,我们可以看一下生成的ceph.conf里面的文件内容

[root@ceph1 ~]# cat /etc/ceph/ceph.conf 
[global]
fsid = 753938ba-fdd0-48b9-9d57-55f9c7e26431 mon_initial_members = ceph1, ceph2, ceph3 # hosts里对应的主机名 mon_host = 10.0.0.61,10.0.0.62,10.0.0.63 # hosts里主机名对应的IP地址 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx

在这里我们需要修改一下参数,优化一下。

[global]
fsid = 753938ba-fdd0-48b9-9d57-55f9c7e26431
mon_initial_members = ceph1, ceph2, ceph3
mon_host = 10.0.0.61,10.0.0.62,10.0.0.63
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 10.0.0.0/24    # 填写内网IP,网络IP不唯一,如果有双网卡(即有公网和内网两种IP的情况下可以这么写)建议为区间的形式进行描写
osd_pool_default_size = 2           # 修改默认副本数为2
mon clock drift allowed = 2         # 允许时钟偏移最大值,这项仅允许在测试环境可以写,生产环境要求严格同步
mon clock drift warn backoff = 31   # 允许时钟偏移最大值,这项仅允许在测试环境可以写,生产环境要求严格同步

[osd]
osd max object name len = 256
osd max object namespace len = 64
rbd default features = 1

通过控制节点发出命令安装Ceph

上面所有的配置都安装完成后,我们就可以开始进行安装了。在这里会分到两种情况

在线安装

这种情况的时候,适用于网络较好,连接外网速度不错的时候。直接使用在线安装即可,省时省力

ceph-deploy install {节点主机名}

本地安装(推荐)

这种安装方法使用的是,指定repo源的方式进行安装,这样可以使用我们的国内源进行安装,保证了安装的速度和效率

ceph-deploy install --no-adjust-repos --release=nautilus {节点1} [{节点2} ...]

各选项解释

–no-adjust-repos 不下载官方repo镜像

–release= 指定安装的发行版本

–local-mirror= 指定使用的repo源,需要与no-adjust-repos搭配 暂时出错无法使用

初始化集群

理论知识

首先在这里需要解释下理论知识:(如只需搭建可以跳过此段)

Ceph的核心组件包括Ceph OSDCeph MonitorCeph MDS

Ceph OSD:OSD的英文全称是Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等,并将一些变化情况上报给Ceph Monitor。一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD。

Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统显性的支持了其拓展性,一般Linux文件系统有好几种,比如有BTRFS、XFS、Ext4等,BTRFS虽然有很多优点特性,但现在还没达到生产环境所需的稳定性,一般比较推荐使用XFS。

伴随OSD的还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到Journal盘中,然后每隔一段时间比如5秒再将Journal盘中的数据刷新到文件系统中。一般为了使读写时延更小,Journal盘都是采用SSD,一般分配10G以上,当然分配多点那是更好,Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD功能很快做小的写操作;一个随机写入首先写入在上一个连续类型的journal,然后刷新到文件系统,这给了文件系统足够的时间来合并写入磁盘,一般情况下使用SSD作为OSD的journal可以有效缓冲突发负载。

Ceph Monitor:由该英文名字我们可以知道它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取最新的Map图,然后根据Map图和object id等计算出数据最终存储的位置。

Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。

初始化Monitor节点

首先在控制节点执行初始化命令

ceph-deploy mon create-initial

然后查看目录里的文件,会发现多出了5个key

[root@ceph1 ceph]$ ls -l
total 324
-rw------- 1 root root    113 Aug  1 03:05 ceph.bootstrap-mds.keyring
-rw------- 1 root root    113 Aug  1 03:05 ceph.bootstrap-osd.keyring
-rw------- 1 root root    113 Aug  1 03:05 ceph.bootstrap-rgw.keyring
-rw------- 1 root root    129 Aug  1 03:05 ceph.client.admin.keyring
-rw-rw-r-- 1 root root    260 Jul 29 03:14 ceph.conf
-rw-rw-r-- 1 root root 304511 Aug  1 14:32 ceph-deploy-ceph.log
-rw------- 1 root root     73 Jul 28 23:57 ceph.mon.keyring

将admin密钥发送至各节点

初始完过后需要将admin的密钥下发至所有节点

ceph-deploy admin ceph1 ceph2 ceph3

安装MGR

监控是管理的第一步,所以 Ceph-MGR 目前的主要功能是把集群的一些指标暴露给外界使用。

监控是什么东西呢?举个例子,例如用户访问网站 5xx 了,那么监控就是这么一个系统:采集网站 5xx 的个数,存起来,然后在 5xx 多的时候通过报警短信报给开发,然后为开发解决该问题提供其他信息(例如日志,指标图表)。关于监控,在此之前 Ceph 以及社区有不少尝试。

在以上背景下,Ceph 官方开发了 Ceph-MGR,主要目标实现 Ceph 集群的管理,为外界提供统一的入口。

ceph-deploy mgr create ceph1 ceph2 ceph3

安装MDS

Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。

ceph-deploy mds create ceph1 ceph2 ceph3

创建OSD

理论知识:

在Ceph的储存引擎存在两种方案,一种是Filestore,另一种是Bluestone

1)Firestore存在的问题是:

  • 在写数据前需要先写journal,会有一倍的写放大;
  • 若是另外配备SSD盘给journal使用又增加额外的成本;
  • filestore一开始只是对于SATA/SAS这一类机械盘进行设计的,没有专门针对SSD这一类的Flash介质盘做考虑。

2)而Bluestore的优势在于:

  • 减少写放大;
  • 针对FLASH介质盘做优化;
  • 直接管理裸盘,进一步减少文件系统部分的开销。
  • 但是在机械盘场景Bluestore与firestore在性能上并没有太大的优势,bluestore的优势在于flash介质盘。 为什么需要BlueStore?
    Ceph作为软件定义存储(SDS)解决方案,其首要目标是保障存储数据的安全。为了达到数据安全的目的,Ceph使用了WAL的方式(Write-Ahead-Log),这就是我们日常最熟悉的journal. 但是写前记录日志这种技术有一个主要缺陷就是它把你的硬盘性能降低到原来的二分之一(仅当日志和OSD数据共享同一个硬盘时),因为filestore在写数据前需要先写journal,所以有一倍的写放大。 filestore设计初衷就是就是为了充分发挥普通机械盘的性能,没有对SSD进行优化考虑。但随着SSD全面普及(主要性价比越来越实惠,也是新技术不断推陈出新的结果),Ceph应用在SSD之上案例越来越多,对于性能的需求是更加迫切。基于以上现实,社区推出了Bluestore的存储引擎,剔除journal方案,缩减写放大,优化SSD写入,同时数据直写裸盘。

在这里,OSD创建其实默认用的是BlueStore,所以命令会很方便

ceph-deploy osd create --data  /dev/vdb ceph1
ceph-deploy osd create --data  /dev/vdb ceph2
ceph-deploy osd create --data  /dev/vdb ceph3

查看集群状态

安装完成后,使用ceph -s查看是否安装成功且状态是否为health: HEALTH_OK

[root@controller02 ceph]# ceph -s
  cluster:
    id:     85826d39-71ba-4660-8ad9-d038c7778f35
    health: HEALTH_WARN
            mons are allowing insecure global_id reclaim

  services:
    mon: 3 daemons, quorum ceph1,ceph2,ceph3 (age 2h)
    mgr: ceph1(active, since 13m), standbys: ceph2, ceph3
    osd: 3 osds: 3 up (since 89s), 3 in (since 89s)

  data:
    pools:   0 pools, 0 pgs
    objects: 0 objects, 0 B
    usage:   3.0 GiB used, 87 GiB / 90 GiB avail
    pgs:     

或者使用以下命令逐一查看
ceph status
ceph health
ceph -s

这里整理了几个可能会出错的情况和解决办法:

错误1:出现 mon is allowing insecure global_id reclaim

解决办法:禁用不安全模式,需要在所有节点执行!

ceph config set mon auth_allow_insecure_global_id_reclaim false

对接Openstack

准备工作

在对接Ceph之前,我们需要为所有节点安装ceph,所以这里需要将ceph源用scp传送过去

因撰写文档时使用了controller02控制节点做部署工具,将其ceph.repo传送到各节点即可。在部署OpenStack时也提前写好了hosts

scp /etc/yum.repos.d/ceph.repo root@controller01:/etc/yum.repos.d/
scp /etc/yum.repos.d/ceph.repo root@computer01:/etc/yum.repos.d/
scp /etc/yum.repos.d/ceph.repo root@computer01:/etc/yum.repos.d/
scp /etc/yum.repos.d/ceph.repo root@computer02:/etc/yum.repos.d/

在做这一步之前,先需要确定安装需求:

首先有一个定理:只要需要用Ceph的机器,就需要安装Ceph(但是不需要配置为集群内的机器)

在我们的分布式部署情况下,可以得出我们需要安装的机器为:

Glance储存节点、Cinder储存节点、Nova计算节点1、2

但教程撰写的时候为了方便,直接安装到每台机器上。

然后这里可以使用ceph-deploy工具便捷安装ceph。

ceph-deploy install --no-adjust-repos --release=nautilus controller01 controller02 computer01 computer02

将ceph配置文件和admin keyring推送到所有机器上

ceph-deploy --overwrite-conf config push controller01 controller02 computer01 computer02
ceph-deploy admin controller01 controller02 computer01 computer02

创建Pool

ceph osd pool create volumes 64
ceph osd pool create vms 64
ceph osd pool create images 64

#设置自启动
ceph osd pool application enable vms mon
ceph osd pool application enable images mon
ceph osd pool application enable volumes mon

配置存储池鉴权

在控制节点创建 Ceph 客户端及存储池的鉴权,生成相应的 key 文件

ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images' -o /etc/ceph/ceph.client.cinder.keyring

ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images' -o /etc/ceph/ceph.client.glance.keyring

将所有的key拷贝到其他的所有OpenStack节点

scp *.keyring controller01:/etc/ceph/
scp *.keyring controller02:/etc/ceph/
scp *.keyring computer01:/etc/ceph/
scp *.keyring computer02:/etc/ceph/

在Openstack的控制节点(Glance、Cinder控制节点)修改密钥文件拥有者为对应的组件用户

chown glance:glance /etc/ceph/ceph.client.glance.keyring
chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring

给Nova添加密钥

为方便操作,我们切换到nova节点上,如有多个Nova节点,请多次操作。

# 生成cinder密钥
[root@computer01 ~]# ceph auth get-key client.cinder | tee client.cinder.key
AQAk98FgsJDPFxAAkzA9E53Y5/wqrfKcTnkiAQ==
[root@computer01 ~]# uuidgen
1d5e8076-9a21-402a-b1c8-7685a55127ce
# uuidgen 只需要运行一次即可,所有涉及 uuid 的地方都共用这个生成的 uuid

cat > secret.xml <<EOF
<secret ephemeral='no' private='no'>
  <uuid>1d5e8076-9a21-402a-b1c8-7685a55127ce</uuid>
  <usage type='ceph'>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF

[root@computer01 ~]# virsh secret-define --file secret.xml 
生成 secret 1d5e8076-9a21-402a-b1c8-7685a55127ce

[root@computer01 ~]# virsh secret-set-value --secret 1d5e8076-9a21-402a-b1c8-7685a55127ce --base64 $(cat client.cinder.key) && rm client.cinder.key secret.xml
# 出现删除提示,输入y,回车

修改配置文件

为了准确和脚本方便,这边使用openstack-config工具进行快速更改

安装方法:

yum -y install openstack-utils

配置Glance

Glance 有多种后端用于存储镜像,如果默认使用 Ceph 块设备,则需要在 Glance 组件所在节点进行配置

openstack-config --set /etc/glance/glance-api.conf DEFAULT "show_image_direct_url" "True"
openstack-config --set /etc/glance/glance-api.conf glance_store "default_store" "rbd"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_user" "glance"
openstack-config --set /etc/glance/glance-api.conf glance_store "rbd_store_pool" "images"
openstack-config --set /etc/glance/glance-api.conf glance_store "stores" "glance.store.filesystem.Store, glance.store.http.Store, glance.store.rbd.Store"
openstack-config --set /etc/glance/glance-api.conf paste_deploy "flavor" "keystone"

配置Cinder

使 Cinder 组件访问 Ceph 块设备,需要配置 Cinder 对应的块设备驱动及其他选项,在 Cinder 组件所在节点进行配置

openstack-config --set /etc/cinder/cinder.conf DEFAULT "enabled_backends" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_driver" "cinder.volume.drivers.rbd.RBDDriver"
openstack-config --set /etc/cinder/cinder.conf ceph "volume_backend_name" "ceph"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_pool" "volumes"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_flatten_volume_from_snapshot" "false"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_max_clone_depth" "5"
openstack-config --set /etc/cinder/cinder.conf ceph "rados_connect_timeout" "-1"
openstack-config --set /etc/cinder/cinder.conf ceph "glance_api_version" "2"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_user" "cinder"
openstack-config --set /etc/cinder/cinder.conf ceph "rbd_secret_uuid" "1d5e8076-9a21-402a-b1c8-7685a55127ce"  ## ☆ 注意替换此处的UUID为之前生成的统一UUID

配置Nova

Nova 组件访问 Ceph 的块设备,需要在运行 Nova 的各节点上进行配置

如果需要从ceph rbd中启动虚拟机,必须将ceph配置为nova的临时后端;

推荐在计算节点的配置文件中启用rbd cache功能

为了便于故障排查,配置admin socket参数,这样每个使用ceph rbd的虚拟机都有1个socket将有利于虚拟机性能分析与故障解决

相关配置只涉及全部计算节点ceph.conf文件的[client][client.cinder]字段,以compute01节点为例

/etc/ceph/ceph.conf

[client]
rbd cache = true
rbd cache writethrough until flush = true
admin socket = /var/run/ceph/guests/$cluster-$type.$id.$pid.$cctid.asok
log file = /var/log/qemu/qemu-guest-$pid.log
rbd concurrent management ops = 20
[client.cinder]
keyring = /etc/ceph/ceph.client.cinder.keyring

创建ceph.conf文件中指定的socker与log相关的目录,并更改属主

mkdir -p /var/run/ceph/guests/ /var/log/qemu/
chown qemu:libvirt /var/run/ceph/guests/ /var/log/qemu/

配置nova.conf

openstack-config --set /etc/nova/nova.conf DEFAULT "disk_cachemodes" "writeback"
openstack-config --set /etc/nova/nova.conf DEFAULT "force_raw_images" "True"
openstack-config --set /etc/nova/nova.conf libvirt "images_type" "rbd"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_pool" "vms"
openstack-config --set /etc/nova/nova.conf libvirt "images_rbd_ceph_conf" "/etc/ceph/ceph.conf"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_user" "cinder"
openstack-config --set /etc/nova/nova.conf libvirt "rbd_secret_uuid" "1d5e8076-9a21-402a-b1c8-7685a55127ce"  ## 同上!注意替换此处UUID
openstack-config --set /etc/nova/nova.conf libvirt "inject_password" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_key" "false"
openstack-config --set /etc/nova/nova.conf libvirt "inject_partition" "-2"
openstack-config --set /etc/nova/nova.conf libvirt "live_migration_flag" "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST"
openstack-config --set /etc/nova/nova.conf libvirt "hw_disk_dicard" "unmap"
# 虚拟机临时root磁盘discard功能,”unmap”参数在scsi接口类型磁盘释放后可立即释放空间

重启OpenStack各服务

控制节点,重启各服务

systemctl restart openstack-glance-api
systemctl restart openstack-nova-api
systemctl restart openstack-cinder-api
systemctl restart openstack-cinder-scheduler

计算节点,重启Nova服务

slibvirtd.service openstack-nova-compute

储存节点,重启Cinder服务

systemctl restart openstack-cinder-volume

验证对接有效性

Ceph客户端验证

在各 OpenStack 节点上运行命令

ceph status
ceph -s

如果能顺利执行,则证明客户端安装成功。

Glance 组件对接验证

在控制节点上,激活admin身份

. admin-openrc

然后通过Glance上传一个镜像

glance image-create --name cirros --disk-format raw --container-format ovf --f {镜像路径}

通过查询 Glance存储池信息,查看镜像是否已经上传

rbd ls images

如果查看到镜像信息,则证明 Glance 组件对接成功。

Cinder组件对接验证

在控制节点通过 Cinder 创建一个空白云盘

cinder create --display-name {volume-name} {volume-size(以G为单位)}

通过查询 Cinder 存储池信息,查看空白云盘是否已经承载在 Ceph

rbd ls volumes

如果查询到云盘信息,则证明 Cinder 组件对接成功。

Nova 组件对接验证

首先通过命令行创建虚拟机,查看是否本地创建vm调用ceph做后端

. demo-openrc
openstack server create --flavor test --image ubuntu_1604 --network public ubuntu

然后查询VM是否创建成功

nova list | grep {instacne-name}

如果创建的 VM 为 Active 状态,则证明 Nova 组件对接成功。

© 版权声明
THE END
喜欢就支持一下吧
点赞7
分享
评论 抢沙发

请登录后发表评论