title: OpenStack系列之一:手动部署OpenStack Queens(7.块存储服务)
categories: Linux
tags:
- OpenStack
timezone: Asia/Shanghai
date: 2019-01-21
块存储服务(cinder)为实例提供块存储。存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的。还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等。
典型情况下,块服务API和调度器服务运行在控制节点上。取决于使用的驱动,卷服务器可以运行在控制节点、计算节点或单独的存储节点。
块存储服务概览
OpenStack块存储服务(cinder)为虚拟机添加持久的存储,块存储提供一个基础设施为了管理卷,以及和OpenStack计算服务交互,为实例提供卷。此服务也会激活管理卷的快照和卷类型的功能。
块存储服务通常包含下列组件:
-
cinder-api
接受API请求,并将其路由到
cinder-volume
执行。 -
cinder-volume
与块存储服务和例如
cinder-scheduler
的进程进行直接交互。它也可以与这些进程通过一个消息队列进行交互。cinder-volume
服务响应送到块存储服务的读写请求来维持状态。它也可以和多种存储提供者在驱动架构下进行交互。 -
cinder-scheduler守护进程
选择最优存储提供节点来创建卷。其与
nova-scheduler
组件类似。 -
cinder-backup daemon
cinder-backup
服务提供任何种类备份卷到一个备份存储提供者。就像cinder-volume
服务,它与多种存储提供者在驱动架构下进行交互。 -
消息队列
在块存储的进程之间路由信息。
第零步:初始化准备
1.关闭防火墙并配置本地YUM(by all)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl stop firewalld
systemctl disable firewalld
systemctl stop iptables
systemctl disable iptables
systemctl status firewalld
systemctl status iptables
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom
cat <<EOF >/etc/yum.repos.d/local.repo
[local]
name=local
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
EOF
2.网络设置
2.1 网络规划
主机名:block1
IP 地址: 10.0.1.63
子网掩码: 255.255.255.0 (or /24)
默认网关: 10.0.1.1
2.2 更改主机名并写入本地hosts
# 配置域名解析
# 一些发行版本在``/etc/hosts``文件中添加了附加条目解析实际主机名到另一个IP地址如 127.0.1.1。
# 为了防止域名解析问题,你必须注释或者删除这些条目。不要删除127.0.0.1条目。
hostnamectl set-hostname block1
echo "10.0.1.61 controller" >>/etc/hosts
echo "10.0.1.62 compute1" >>/etc/hosts
echo "10.0.1.63 block1" >>/etc/hosts
3.配置时间同步NTP
# 安装chrony服务
yum install -y chrony
# 修改前备份chrony.conf
/bin/grep 666666 /etc/chrony.conf && /bin/cp /etc/chrony.conf.666666 /etc/chrony.conf || /bin/cp /etc/chrony.conf /etc/chrony.conf.666666
# 删除默认Server
sed -i "/server/d" /etc/chrony.conf
sed -i "/makestep/d" /etc/chrony.conf
# 设置同步服务器为控制节点
echo "server controller iburst" >>/etc/chrony.conf
echo "makestep 1.0 -1" >>/etc/chrony.conf
# 重启服务并查看状态是否正常并设置开机自动启动
systemctl enable chronyd.service
systemctl stop chronyd.service
systemctl start chronyd.service
systemctl status chronyd.service
chronyc tracking
# 验证
chronyc sources
4.启用OpenStack仓库
警告:在你进行更多步骤前,你的主机必须包含最新版本的基础安装软件包。
警告:禁用或移除所有自动更新的服务,因为它们会影响到您的 OpenStack 环境。
警告:当使用RDO包时,我们推荐禁用EPEL,原因是EPEL中的更新破坏向后兼容性。或者使用yum-versionlock插件指定包版本号。
4.1.启用OpenStack库
# 在CentOS中, extras仓库提供用于启用 OpenStack 仓库的RPM包。
# CentOS 默认启用extras仓库,因此你可以直接安装用于启用OpenStack仓库的包。
yum install -y centos-release-openstack-queens
4.2.完成安装
# 在主机上升级包并重启服务器
yum upgrade -y && init 6
第一步:安装和配置控制器节点(控制节点)
1.先决条件
在安装和配置Block Storage服务之前,必须创建数据库,服务凭据和API端点。
1.1.要创建数据库,请完成以下步骤:
以下有两处
xiaoliu
,请根据自己情况更改
# 1.使用数据库访问客户端以root用户身份连接到数据库服务器:
mysql -u root -p
# 2.创建cinder数据库:
CREATE DATABASE cinder;
# 3.授予对cinder数据库的适当访问权限:
# 替换CINDER_DBPASS为合适的密码。
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'xiaoliu';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'xiaoliu';
1.2.获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
source /home/admin-openrc
echo $OS_USERNAME
1.3.要创建服务证书,完成这些步骤:
# 1.创建一个 cinder 用户:
openstack user create --domain default --password-prompt cinder
# 2.添加 admin 角色到 cinder 用户上(这个命令执行后没有输出)。
openstack role add --project service --user cinder admin
# 3.Create the cinderv2 and cinderv3 service entities
# 块设备存储服务要求两个服务实体:
openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3
1.4.创建块设备存储服务的 API 入口点:
块设备存储服务每个服务实体都需要端点。
openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s
1.5.以上命令输出展示
[root@controller home]# openstack user create --domain default --password-prompt cinder
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | default |
| enabled | True |
| id | 87d4338d0c9f4b3c98d386d55b6c6f03 |
| name | cinder |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
[root@controller home]# openstack role add --project service --user cinder admin
[root@controller home]# openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Block Storage |
| enabled | True |
| id | 84c8172c7b51476c8a2aac803c245e83 |
| name | cinderv2 |
| type | volumev2 |
+-------------+----------------------------------+
[root@controller home]# openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | OpenStack Block Storage |
| enabled | True |
| id | 8b559b15bca545e7899d1b4e1ddd80a1 |
| name | cinderv3 |
| type | volumev3 |
+-------------+----------------------------------+
[root@controller home]# openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| enabled | True |
| id | 310bce02191b4be68d09fc81992994ca |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 84c8172c7b51476c8a2aac803c245e83 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+
[root@controller home]# openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| enabled | True |
| id | 80b65ef9f9fc4eb4b088b5f227e5249b |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 84c8172c7b51476c8a2aac803c245e83 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+
[root@controller home]# openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| enabled | True |
| id | 0948b943808d4fb3b75ab8d07bf93f8e |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 84c8172c7b51476c8a2aac803c245e83 |
| service_name | cinderv2 |
| service_type | volumev2 |
| url | http://controller:8776/v2/%(project_id)s |
+--------------+------------------------------------------+
[root@controller home]# openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| enabled | True |
| id | 4d658df890234fd1a92a67134da58aff |
| interface | public |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 8b559b15bca545e7899d1b4e1ddd80a1 |
| service_name | cinderv3 |
| service_type | volumev3 |
| url | http://controller:8776/v3/%(project_id)s |
+--------------+------------------------------------------+
[root@controller home]# openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| enabled | True |
| id | a521d33a52ef45f2847d75625f6ff7de |
| interface | internal |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 8b559b15bca545e7899d1b4e1ddd80a1 |
| service_name | cinderv3 |
| service_type | volumev3 |
| url | http://controller:8776/v3/%(project_id)s |
+--------------+------------------------------------------+
[root@controller home]# openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s
+--------------+------------------------------------------+
| Field | Value |
+--------------+------------------------------------------+
| enabled | True |
| id | bd081ecba5664c34b397b7a407eb023a |
| interface | admin |
| region | RegionOne |
| region_id | RegionOne |
| service_id | 8b559b15bca545e7899d1b4e1ddd80a1 |
| service_name | cinderv3 |
| service_type | volumev3 |
| url | http://controller:8776/v3/%(project_id)s |
+--------------+------------------------------------------+
2.安全并配置组件
2.1.安装软件包:
yum install -y openstack-cinder
2.2.编辑 /etc/cinder/cinder.conf,同时完成如下动作:
cp /etc/cinder/cinder.conf /etc/cinder/cinder.conf.bak
cat /etc/cinder/cinder.conf.bak | grep -v "^#" | grep -v '^$' > /etc/cinder/cinder.conf
vim /etc/cinder/cinder.conf
# 1.在 [database] 部分,配置数据库访问:
# 用你为块设备存储数据库选择的密码替换 CINDER_DBPASS。
[database]
# ...
connection = mysql+pymysql://cinder:xiaoliu@controller/cinder
# 2.在``[DEFAULT]``部分,配置``RabbitMQ``消息队列访问权限:
# 用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。
[DEFAULT]
# ...
transport_url = rabbit://openstack:xiaoliu@controller
# 3.在 “[DEFAULT]” 和 “[keystone_authtoken]” 部分,配置认证服务访问:
# 将 CINDER_PASS 替换为你在认证服务中为 cinder 用户选择的密码。
# 在 [keystone_authtoken] 中注释或者删除其他选项。
[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = xiaoliu
# 4.在 [DEFAULT 部分,配置``my_ip`` 来使用控制节点的管理接口的IP 地址。
[DEFAULT]
# ...
my_ip = 10.0.1.61
2.3.在 [oslo_concurrency] 部分,配置锁路径:
[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp
2.4.初始化块设备服务的数据库(忽略输出中任何不推荐使用的信息。):
# 写入数据库
su -s /bin/sh -c "cinder-manage db sync" cinder
# 验证数据是否写入成功:应该有35张表
mysql -uroot -p'xiaoliu' -D cinder -se "show tables;"
mysql -uroot -p'xiaoliu' -D cinder -se "show tables;" | wc -l
3.配置以允许计算节点以使用块设备存储
# 编辑文件 /etc/nova/nova.conf 并添加如下到其中:
cp /etc/nova/nova.conf /etc/nova/nova.conf.bak
vim /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne
4.完成安装
4.1.重启计算API 服务:
systemctl restart openstack-nova-api.service
systemctl status openstack-nova-api.service
4.2.启动块设备存储服务,并将其配置为开机自启:
systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl stop openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl status openstack-cinder-api.service openstack-cinder-scheduler.service
第二步:安装和配置存储节点(存储节点)
本节介绍如何为Block Storage服务安装和配置存储节点。为简单起见,此配置引用一个具有空本地块存储设备的存储节点。说明使用/dev/sdb,但您可以为特定节点替换不同的值。
该服务使用LVM驱动程序在此设备上配置逻辑卷, 并通过iSCSI传输将它们提供给实例。您可以按照这些说明进行微小修改,以使用其他存储节点水平扩展您的环境。
1.先决条件
1.1.安装 LVM 包、启动LVM的metadata服务并且设置该服务随系统启动:
yum install -y lvm2 device-mapper-persistent-data
systemctl enable lvm2-lvmetad.service
systemctl stop lvm2-lvmetad.service
systemctl start lvm2-lvmetad.service
systemctl status lvm2-lvmetad.service
1.2.为【存储节点】准备一块除系统磁盘外的一块单独的硬盘,并确认新准备的硬盘为/dev/sdb
ll /dev/sdb
1.3.创建LVM 物理卷 /dev/sdb
pvcreate /dev/sdb
1.4.创建 LVM 卷组 cinder-volumes:
块存储服务会在这个卷组中创建逻辑卷。
vgcreate cinder-volumes /dev/sdb
1.5.配置只有实例才能访问块存储卷。
但是,底层的操作系统管理着与这些卷相关联的设备。
默认情况下,LVM卷扫描工具会扫描/dev
目录,查找包含卷的块存储设备。
如果项目在他们的卷上使用了LVM,扫描工具便会在检测到这些卷时尝试缓存它们,
这可能会在底层操作系统和项目卷上产生各种问题。
所以您必须重新配置LVM,让它扫描仅包含cinder-volume
卷组的设备。
编辑/etc/lvm/lvm.conf
文件并完成下面的操作:
cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
vim /etc/lvm/lvm.conf
# 在``devices``部分,添加一个过滤器,只接受``/dev/sdb``设备,拒绝其他所有设备:
devices {
...
filter = [ "a/sdb/", "r/.*/"]
-
每个过滤器组中的元素都以
a
开头,即为 accept,或以 r 开头,即为reject并且包括一个设备名称的正则表达式规则。过滤器组必须以
r/.*/
结束,过滤所有保留设备。您可以使用 :命令:vgs -vvvv
来测试过滤器。 -
警告:
如果您的存储节点在操作系统磁盘上使用了 LVM,您还必需添加相关的设备到过滤器中。例如,如果 /dev/sda 设备包含操作系统:
filter = [ “a/sda/”, “a/sdb/”, “r/.*/”] -
警告:
类似地,如果您的计算节点在操作系统磁盘上使用了 LVM,您也必需修改这些节点上 /etc/lvm/lvm.conf 文件中的过滤器,将操作系统磁盘包含到过滤器中。例如,如果
/dev/sda
设备包含操作系统:
filter = [ “a/sda/”, “r/.*/”]
2.安装和配置组件
2.1.安装包
yum install -y openstack-cinder targetcli python-keystone
2.2.编辑/etc/cinder/cinder.conf文件并完成以下操作:
以下有三处
xiaoliu
,请根据自己情况更改
以下有一处IP地址为存储节点IP,请根据自己情况更改
cp /etc/cinder/cinder.conf /etc/cinder/cinder.conf.bak
cat /etc/cinder/cinder.conf.bak | grep -v "^#" | grep -v '^$' > /etc/cinder/cinder.conf
vim /etc/cinder/cinder.conf
# 1.在该[database]部分中,配置数据库访问:
# 替换CINDER_DBPASS为您为Block Storage数据库选择的密码。
[database]
# ...
connection = mysql+pymysql://cinder:xiaoliu@controller/cinder
# 2.在该[DEFAULT]部分中,配置RabbitMQ 消息队列访问:
# 替换RABBIT_PASS为您为openstack帐户选择的密码RabbitMQ。
[DEFAULT]
# ...
transport_url = rabbit://openstack:xiaoliu@controller
# 3.在[DEFAULT]和[keystone_authtoken]部分中,配置身份服务访问:
# 替换CINDER_PASS为您cinder在Identity服务中为用户选择的密码 。
# 注释掉或删除该[keystone_authtoken]部分中的任何其他选项 。
[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_id = default
user_domain_id = default
project_name = service
username = cinder
password = xiaoliu
# 4.在该[DEFAULT]部分中,配置my_ip选项:
# 替换MANAGEMENT_INTERFACE_IP_ADDRESS为存储节点上管理网络接口的IP地址
# 对于示例体系结构中的第一个节点,通常为10.0.0.41 。
[DEFAULT]
# ...
# my_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
my_ip = 10.0.1.63
# 5.在本[lvm]节中,使用LVM驱动程序,cinder-volumes卷组,iSCSI协议和相应的iSCSI服务配置LVM后端。
# 如果该[lvm]部分不存在,请创建它:
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm
# 6.在 [DEFAULT] 部分,启用 LVM 后端:
# 后端名称是任意的。例如,本指南使用驱动程序的名称作为后端的名称。
[DEFAULT]
# ...
enabled_backends = lvm
# 7.在该[DEFAULT]部分中,配置Image服务API的位置:
[DEFAULT]
# ...
glance_api_servers = http://controller:9292
# 8.在该[oslo_concurrency]部分中,配置锁定路径:
[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp
3.完成安装
启动块存储卷服务及其依赖的服务,并将其配置为随系统启动:
systemctl enable openstack-cinder-volume.service target.service
systemctl stop openstack-cinder-volume.service target.service
systemctl start openstack-cinder-volume.service target.service
systemctl status openstack-cinder-volume.service target.service
4.验证操作:
列出服务组件以验证是否每个进程都成功启动(控制节点):
source /home/admin-openrc
echo $OS_USERNAME
openstack volume service list
[root@controller home]# openstack volume service list
+------------------+------------+------+---------+-------+----------------------------+
| Binary | Host | Zone | Status | State | Updated At |
+------------------+------------+------+---------+-------+----------------------------+
| cinder-scheduler | controller | nova | enabled | up | 2019-01-21T08:29:14.000000 |
| cinder-volume | block1@lvm | nova | enabled | up | 2019-01-21T08:29:13.000000 |
+------------------+------------+------+---------+-------+----------------------------+