搭建高可用OpenStack(Queen版)集群(十一)之OpenStack集成ceph服务

一、OpenStack集成ceph服务

一)Openstack集成Ceph准备

1、OpenStack存储知识
1、OpenStack数据存储分类

Openstack环境中,数据存储可分为临时性存储与永久性存储。

临时性存储:主要由本地文件系统提供,并主要用于nova虚拟机的本地系统与临时数据盘,以及存储glance上传的系统镜像;

永久性存储:主要由cinder提供的块存储与swift提供的对象存储构成,以cinder提供的块存储应用最为广泛,块存储通常以云盘的形式挂载到虚拟机中使用。

2、OpenStack需要进行数据存储的组件

Openstack中需要进行数据存储的三大项目主要是nova项目(虚拟机镜像文件),glance项目(共用模版镜像)与cinder项目(块存储)。

下图为cinder,glance与nova访问ceph集群的逻辑图:

  1. ceph与openstack集成主要用到ceph的rbd服务,ceph底层为rados存储集群,ceph通过librados库实现对底层rados的访问;
  2. openstack各项目客户端调用librbd,再由librbd调用librados访问底层rados;
  3. 实际使用中,nova需要使用libvirtdriver驱动以通过libvirt与qemu调用librbd;cinder与glance可直接调用librbd;
  4. 写入ceph集群的数据被条带切分成多个object,object通过hash函数映射到pg(构成pg容器池pool),然后pg通过几圈crush算法近似均匀地映射到物理存储设备osd(osd是基于文件系统的物理存储设备,如xfs,ext4等)。

2、创建pool

Ceph默认使用pool的形式存储数据,pool是对若干pg进行组织管理的逻辑划分,pg里的对象被映射到不同的osd,因此pool分布到整个集群里。

可以将不同的数据存入1个pool,但如此操作不便于客户端数据区分管理,因此一般是为每个客户端分别创建pool。

为cinder,nova,glance分别创建pool,命名为:volumes,vms,images

创建pool,需要覆盖默认的pg num,官方文档对pg num的数量有如下建议:

1、pool创建在monitor节点操作,以controller01节点为例;

这里volumes池是永久性存储,vms是实例临时后端存储,images是镜像存储

复制代码
su - cephde
$ sudo ceph osd pool create volumes 128
$ sudo ceph osd pool create vms 128
$ sudo ceph osd pool create images 128
2、查看状态
复制代码
[cephde@controller01 ~]$ sudo ceph pg stat 
396 pgs: 396 active+undersized; 0B data, 6.03GiB used, 77.9GiB / 84.0GiB avail
[cephde@controller01 ~]$ sudo ceph osd lspools
1 vms,2 volumes,3 images,
3、安装ceph客户端
1、控制节点安装python-rbd
  • glance-api服务所在节点需要安装python-rbd
  • 这里glance-api服务运行在3个控制节点上
复制代码
sudo yum install python-rbd -y
2、存储节点安装ceph-common
  • cinder-volume与nova-compute服务所在节点需要安装ceph-common;
  • 这里cinder-volume与nova-compute服务运行在3个计算(存储)节点
复制代码
sudo yum install ceph-common -y
3、授权设置

在控制节点controller01操作 (root用户执行)

1、创建用户
  • ceph默认启用cephx authentication(见ceph.conf),需要为nova/cinder与glance客户端创建新的用户并授权;
  • 可在管理节点上分别为运行cinder-volume与glance-api服务的节点创建client.glance与client.cinder用户并设置权限;
  • 针对pool设置权限,pool名对应创建的pool
复制代码
[root@controller01 ~]# 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' 
[client.cinder]
    key = AQCv3plbaAahKxAAjIsIVNMR++B7X22AkkviPA==
[root@controller01 ~]# ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'
[client.glance]
    key = AQDB3plbufA/CBAAlFdliGPJbhM1wCgORaZ+3w==
2、推动client.glance秘钥(可以使用脚本)

将创建client.glance用户生成的秘钥推送到运行glance-api服务的节点

复制代码
ceph auth get-or-create client.glance | ssh root@controller01 tee /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.glance | ssh root@controller02 tee /etc/ceph/ceph.client.glance.keyring
ceph auth get-or-create client.glance | ssh root@controller03 tee /etc/ceph/ceph.client.glance.keyring

同时修改秘钥文件的属主与用户组

复制代码
ssh root@controller01 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ssh root@controller02 chown glance:glance /etc/ceph/ceph.client.glance.keyring
ssh root@controller03 chown glance:glance /etc/ceph/ceph.client.glance.keyring
3、推送client.cinder秘钥(nova-volume)

将创建的client.cinder用户生成的秘钥推送到运行cinder-volume服务的节点(计算节点)

复制代码
ceph auth get-or-create client.cinder | ssh root@compute01 tee /etc/ceph/ceph.client.cinder.keyring
ceph auth get-or-create client.cinder | ssh root@compute02 tee /etc/ceph/ceph.client.cinder.keyring

同时修改秘钥文件的属主与用户组

复制代码
ssh root@compute01 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
ssh root@compute02 chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring
4、推送client.cinder秘钥(nova-compute)

这里nova-compute服务与nova-volume服务运行在相同节点,不必重复操作

5、libvirt秘钥

nova-compute所在节点需要将client.cinder用户的秘钥文件存储到libvirt中;当基于ceph后端的cinder卷被attach到虚拟机实例时,libvirt需要用到该秘钥以访问ceph集群;

在管理节点向计算(存储)节点推送client.cinder秘钥文件,生成的文件是临时性的,将秘钥添加到libvirt后可删除

复制代码
ceph auth get-key client.cinder | ssh root@compute01 tee /etc/ceph/client.cinder.key
ceph auth get-key client.cinder | ssh root@compute02 tee /etc/ceph/client.cinder.key

在计算(存储)节点将秘钥加入

  1. 首先生成1个uuid,全部计算(存储)节点可共用此uuid(其他节点不用操作)
  2. uuid后续配置nova.conf文件时也会用到,请保持一致。
复制代码
[root@compute01 ~]# uuidgen
d6addd93-c7ba-43e3-a9dd-ee53677cbd2c

添加秘钥

复制代码
cat>/etc/ceph/secret.xml<<EOF
<secret ephemeral='no' private='no'>
  <uuid>d6addd93-c7ba-43e3-a9dd-ee53677cbd2c</uuid>
  <usage type='ceph'>
    <name>client.cinder secret</name>
  </usage>
</secret>
EOF

virsh secret-define --file /etc/ceph/secret.xml
virsh secret-set-value --secret d6addd93-c7ba-43e3-a9dd-ee53677cbd2c  --base64 $(cat /etc/ceph/client.cinder.key)

扩展知识:

virsh命令详解:virsh 命令_virsh nodesuspend --help csdn-CSDN博客

http://virtual.51cto.com/art/201611/520859.htm

二)glance集成ceph

控制节点操作

1、配置glance-api.conf

在运行glance-api服务的节点修改glance-api.conf文件,含3个控制节点,以controller01节点为例

以下只列出涉及glance集成ceph的section

1、修改glance的配置文件

vim /etc/glance/glance-api.conf

复制代码
# 打开copy-on-write功能
[DEFAULT]
show_image_direct_url = True

# 变更默认使用的本地文件存储为ceph rbd存储;
# 注意红色字体部分前后一致
[glance_store]
#stores = file,http
#default_store = file
#filesystem_store_datadir = /var/lib/glance/images/
stores = rbd
default_store = rbd
rbd_store_chunk_size = 8
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
2、变更配置文件,重启服务
复制代码
systemctl restart openstack-glance-api.service
systemctl restart openstack-glance-registry.service

systemctl status openstack-glance-api.service openstack-glance-registry.service
2、上传镜像

镜像上传后,默认地址为ceph集群(ID)的images pool下

复制代码
openstack image create "cirros-qcow2" \
 --file ~/cirros-0.3.5-x86_64-disk.img \
 --disk-format qcow2 --container-format bare \
 --public

检查镜像是否存在

复制代码
[root@controller01 ~]# rbd ls images
bb8ab915-4ba0-4d6b-b8e8-52a4de601bff
3、定义pool类型

控制节点操作

1、images启用后,ceph集群状态变为HEALTH_WARN
复制代码
[root@controller01 ~]# ceph -s
  cluster:
    id:     7e861d4a-a9ea-46e2-b272-89025cda8ca9
    health: HEALTH_WARN
            application not enabled on 1 pool(s)
 
  services:
    mon: 3 daemons, quorum controller03,controller01,controller02
    mgr: controller01_mgr(active), standbys: controller03_mgr, controller02_mgr
    osd: 6 osds: 6 up, 6 in
 
  data:
    pools:   3 pools, 384 pgs
    objects: 8 objects, 12.7MiB
    usage:   6.05GiB used, 77.9GiB / 84.0GiB avail
    pgs:     384 active+clean
 
  io:
    client:   0B/s rd, 0op/s rd, 0op/s wr
2、使用"ceph health detail",能给出解决办法;

未定义pool池类型,可定义为'cephfs', 'rbd', 'rgw'等

复制代码
[root@controller01 ~]# ceph health detail
HEALTH_WARN application not enabled on 1 pool(s)
POOL_APP_NOT_ENABLED application not enabled on 1 pool(s)
    application not enabled on pool 'images'
    use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications.
3、同时解决volumes与vms两个pool的问题
复制代码
ceph osd pool application enable images rbd
ceph osd pool application enable volumes rbd
ceph osd pool application enable vms rbd

4、查看各个pool中的application
复制代码
[root@controller01 ~]# ceph health detail
HEALTH_OK

查看各个pool中的application

复制代码
ceph osd pool application get images
ceph osd pool application get volumes
ceph osd pool application get vms

三)Cinder集成Ceph

1、配置cinder.conf
  • cinder利用插件式结构,支持同时使用多种后端存储;
  • 在cinder-volume所在节点设置cinder.conf中设置相应的ceph rbd驱动即可;

在存储节点操作

1、修改配置文件,以下只列出涉及cinder集成ceph的section

vim /etc/cinder/cinder.conf

复制代码
# 后端使用ceph存储
[DEFAULT]
enabled_backends = ceph

# 新增[ceph] section;
# 注意红色字体部分前后一致
[ceph]
# ceph rbd驱动
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = true
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
# 如果配置多后端,则“glance_api_version”必须配置在[DEFAULT] section
glance_api_version = 2
rbd_user = cinder
rbd_secret_uuid = d6addd93-c7ba-43e3-a9dd-ee53677cbd2c
volume_backend_name = ceph
2、变更配置文件后重启服务

启动块存储卷服务,并查看服务状态

复制代码
systemctl restart openstack-cinder-volume.service 
systemctl status openstack-cinder-volume.service
2、验证

在控制节点验证

查看cinder服务状态,cinder-volume集成ceph后,状态为"up"

复制代码
. admin-openrc
复制代码
方法一:
cinder service-list

方法二:
openstack volume service list

执行结果如下

复制代码
[root@controller01 ~]# openstack volume service list
+------------------+----------------+------+---------+-------+----------------------------+
| Binary           | Host           | Zone | Status  | State | Updated At                 |
+------------------+----------------+------+---------+-------+----------------------------+
| cinder-scheduler | controller01   | nova | enabled | up    | 2018-09-19T05:00:20.000000 |
| cinder-scheduler | controller03   | nova | enabled | up    | 2018-09-19T05:00:23.000000 |
| cinder-scheduler | controller02   | nova | enabled | up    | 2018-09-19T05:00:19.000000 |
| cinder-volume    | compute01@ceph | nova | enabled | up    | 2018-09-19T05:00:19.000000 |
| cinder-volume    | compute02@ceph | nova | enabled | up    | 2018-09-19T05:00:21.000000 |
复制代码
[root@controller01 ~]# cinder service-list
+------------------+----------------+------+---------+-------+----------------------------+-----------------+
| Binary           | Host           | Zone | Status  | State | Updated_at                 | Disabled Reason |
+------------------+----------------+------+---------+-------+----------------------------+-----------------+
| cinder-scheduler | controller01   | nova | enabled | up    | 2018-09-19T04:39:59.000000 | -               |
| cinder-scheduler | controller02   | nova | enabled | up    | 2018-09-19T04:39:59.000000 | -               |
| cinder-scheduler | controller03   | nova | enabled | up    | 2018-09-19T04:40:02.000000 | -               |
| cinder-volume    | compute01@ceph | nova | enabled | up    | 2018-09-19T04:39:59.000000 | -               |
| cinder-volume    | compute02@ceph | nova | enabled | up    | 2018-09-19T04:40:01.000000 | -               |
3、生成volume
1、设置卷类型

在任意控制节点为cinder的ceph后端存储创建对应的type,在配置多存储后端时可区分类型;

可通过"cinder type-list"查看

复制代码
[root@controller01 ~]# cinder type-create ceph
+--------------------------------------+------+-------------+-----------+
| ID                                   | Name | Description | Is_Public |
+--------------------------------------+------+-------------+-----------+
| 406ee6a7-9e8f-49c4-b476-f475ab6f4749 | ceph | -           | True      |
+--------------------------------------+------+-------------+-----------+

为ceph type设置扩展规格,键值" volume_backend_name",value值"ceph"

复制代码
[root@controller01 ~]# cinder type-key ceph set volume_backend_name=ceph
[root@controller01 ~]# cinder extra-specs-list
+--------------------------------------+------+---------------------------------+
| ID                                   | Name | extra_specs                     |
+--------------------------------------+------+---------------------------------+
| 406ee6a7-9e8f-49c4-b476-f475ab6f4749 | ceph | {'volume_backend_name': 'ceph'} |
+--------------------------------------+------+---------------------------------+
2、生成volume

生成volume:最后的数字"1"代表容量为1G

复制代码
cinder create --volume-type ceph --name ceph-volume1 1

检查生成的volume

复制代码
方法一:
cinder list
方法二:
openstack volume list

检查ceph集群的volumes pool

复制代码
rbd ls volumes

四)Nova集成Ceph

1、配置ceph.conf
  • 如果需要从ceph rbd中启动虚拟机,必须将ceph配置为nova的临时后端;
  • 推荐在计算节点的配置文件中启用rbd cache功能;
  • 为了便于故障排查,配置admin socket参数,这样每个使用ceph rbd的虚拟机都有1个socket将有利于虚拟机性能分析与故障解决;

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

1、更改配置文件

vim /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
2、创建ceph.conf文件中指定的socker与log相关的目录,并更改属主
复制代码
mkdir -p /var/run/ceph/guests/ /var/log/qemu/
chown qemu:libvirt /var/run/ceph/guests/ /var/log/qemu/ 
2、配置nova.conf

全部计算节点配置nova后端使用ceph集群的vms池,以compute01节点为例

1、修改配置

vim /etc/nova/nova.conf

复制代码
[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
# uuid前后一致
rbd_secret_uuid = d6addd93-c7ba-43e3-a9dd-ee53677cbd2c
disk_cachemodes="network=writeback"
live_migration_flag="VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED"
# 禁用文件注入
inject_password = false
inject_key = false
inject_partition = -2
# 虚拟机临时root磁盘discard功能,”unmap”参数在scsi接口类型磁盘释放后可立即释放空间
hw_disk_discard = unmap
# 通过“egrep -c '(vmx|svm)' /proc/cpuinfo”命令查看主机是否支持硬件加速,返回1或者更大的值表示支持,返回0表示不支持;
# # 支持硬件加速使用”kvm”类型,不支持则使用”qemu”类型;
# # 一般虚拟机不支持硬件加速
# 原有配置
virt_type=kvm
2、重启服务
复制代码
systemctl restart libvirtd.service
systemctl restart openstack-nova-compute.service
systemctl status libvirtd.service openstack-nova-compute.service 
3、配置live-migration
1、修改/etc/libvirt/libvirtd.conf

全部计算节点操作

注意:根据不同主机,将监听地址改成对应的IP地址

egrep -vn "^$|^#" /etc/libvirt/libvirtd.conf

复制代码
# 取消以下三行的注释
22:listen_tls = 0
33:listen_tcp = 1
45:tcp_port = "16509"
# 取消注释,并修改监听端口
55:listen_addr = "10.20.9.46"
# 取消注释,同时取消认证
158:auth_tcp = "none" 
2、修改/etc/sysconfig/libvirtd

在全部计算节点操作

egrep -vn "^$|^#" /etc/sysconfig/libvirtd

复制代码
# 取消注释
9:LIBVIRTD_ARGS="--listen" 
3、设置防火墙iptables
  • live-migration时,源计算节点主动连接目的计算节点tcp16509端口,可以使用"virsh -c qemu+tcp://{node_ip or node_name}/system"连接目的计算节点测试;
  • 迁移前后,在源目计算节点上的被迁移instance使用tcp49152~49161端口做临时通信;
  • 因虚拟机已经启用iptables相关规则,此时切忌随意重启iptables服务,尽量使用插入的方式添加规则;
  • 同时以修改配置文件的方式写入相关规则,切忌使用"iptables saved"命令;

在全部计算节点操作(若开了防火墙,需要设置)

复制代码
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 16509 -j ACCEPT
iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 49152:49161 -j ACCEPT 
4、重启服务

libvirtd与nova-compute服务都需要重启

复制代码
systemctl restart libvirtd.service
systemctl restart openstack-nova-compute.service

systemctl status libvirtd.service openstack-nova-compute.service
netstat -tunlp | grep 16509 
4、验证

在任意控制节点操作

如果使用ceph提供的volume做启动盘,即虚拟机运行镜像文件存放在共享存储上,此时可以方便地进行live-migration。

1、创建基于ceph存储的bootable存储卷

当nova从rbd启动instance时,镜像格式必须是raw格式,否则虚拟机在启动时glance-api与cinder均会报错;

首先进行格式转换,将*.img文件转换为*.raw文件(这个没有返回值,执行完在指定的目录下生成指定格式的文件)

复制代码
qemu-img convert -f qcow2 -O raw ~/cirros-0.3.5-x86_64-disk.img ~/cirros-0.3.5-x86_64-disk.raw

生成raw格式镜像

复制代码
openstack image create "cirros-raw" \
--file ~/cirros-0.3.5-x86_64-disk.raw \
--disk-format raw --container-format bare \
--public 

使用新镜像创建bootable卷(注意image-id根据自己的做出更改)

复制代码
cinder create --image-id 93e3535c-09dd-4095-82fc-69a1125ae3f9 --volume-type ceph --name ceph-bootable1 2

#查看新创建的bootable卷

复制代码
cinder list 

从基于ceph后端的volumes新建实例;

"--boot-volume"指定具有"bootable"属性的卷,启动后,虚拟机运行在volumes卷

复制代码
[root@controller01 ~]# nova boot --flavor m1.tiny \
 --boot-volume db0f83c0-14f7-4548-8807-4b1f593630a4 \
 --nic net-id=91e78b9c-cfcd-4af2-851a-a27839edf571 \
 --security-group default \
 cirros-cephvolumes-instance1 
2、从ceph rbd启动虚拟机(命令行创建实例)

--nic:net-id指网络id,非subnet-id;

最后"cirros-cephrbd-instance1"为instance名

复制代码
nova boot --flavor m1.tiny --image cirros-raw --nic net-id=91e78b9c-cfcd-4af2-851a-a27839edf571 --security-group default cirros-cephrbd-instance1

查询生成的instance

复制代码
nova list 

查看生成的instance的详细信息

复制代码
nova show 7648251c-62a1-4f98-ba3f-e5f30f5804b4 

验证是否从ceph rbd启动

复制代码
rbd ls vms 
3、对rbd启动的虚拟机进行live-migration

使用"nova show 7648251c-62a1-4f98-ba3f-e5f30f5804b4"得知从rbd启动的instance在迁移前位于compute02节点;

或使用"nova hypervisor-servers compute02"进行验证;

复制代码
nova live-migration cirros-cephrbd-instance1 compute01

迁移过程中可查看状态

复制代码
nova list 

迁移完成后,查看instacn所在节点;

或使用"nova show 7648251c-62a1-4f98-ba3f-e5f30f5804b4"命令查看"hypervisor_hostname"

复制代码
nova hypervisor-servers compute02
nova hypervisor-servers compute0
相关推荐
Data跳动4 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
Java程序之猿5 小时前
微服务分布式(一、项目初始化)
分布式·微服务·架构
来一杯龙舌兰6 小时前
【RabbitMQ】RabbitMQ保证消息不丢失的N种策略的思想总结
分布式·rabbitmq·ruby·持久化·ack·消息确认
节点。csn7 小时前
Hadoop yarn安装
大数据·hadoop·分布式
NiNg_1_2349 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
隔着天花板看星星10 小时前
Spark-Streaming集成Kafka
大数据·分布式·中间件·spark·kafka
技术路上的苦行僧14 小时前
分布式专题(8)之MongoDB存储原理&多文档事务详解
数据库·分布式·mongodb
龙哥·三年风水14 小时前
workman服务端开发模式-应用开发-后端api推送修改二
分布式·gateway·php
小小工匠15 小时前
分布式协同 - 分布式事务_2PC & 3PC解决方案
分布式·分布式事务·2pc·3pc
闯闯的日常分享17 小时前
分布式锁的原理分析
分布式