块存储服务(cinder)为实例提供块存储。存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的。还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等。

典型情况下,块服务API和调度器服务运行在控制节点上。取决于使用的驱动,卷服务器可以运行在控制节点、计算节点或单独的存储节点。

这个部分描述如何在单独节点上安装和配置块设备存储服务,即 cinder。这个服务需要至少一个额外的存储节点,以向实例提供卷。

创建数据库

在控制节点完成下面的步骤以创建数据库:

用数据库连接客户端以 root 用户连接到数据库服务器:

mysql -u root -p

创建 cinder 数据库:

CREATE DATABASE cinder;

允许 cinder 数据库合适的访问权限:

GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';
用合适的密码替换 CINDER_DBPASS

服务证书

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

创建服务证书:

创建一个 cinder 用户:

openstack user create --domain default --password CINDER_PASS cinder

添加 admin 角色到 cinder 用户上。

openstack role add --project service --user cinder admin

‎创建cinderv2cinderv3服务实体

openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2

openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3

块设备存储服务要求两个服务实体。

API 入口

创建块设备存储服务的 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

块设备存储服务每个服务实体都需要端点。

安全并配置组件

安装软件包:

yum install -y openstack-cinder

编辑 /etc/cinder/cinder.conf,同时完成如下动作:

vim /etc/cinder/cinder.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder
用你为块设备存储数据库选择的密码替换 CINDER_DBPASS

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller
用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。

[DEFAULT]”和 [keystone_authtoken] 部分,配置认证服务访问:

[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = CINDER_PASS
CINDER_PASS 替换为你在认证服务中为 cinder 用户选择的密码。

[DEFAULT 部分,配置my_ip 来使用控制节点的管理接口的IP 地址。

[DEFAULT]
# ...
my_ip = 控制节点IP地址

[oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp

初始化块设备服务的数据库:

su -s /bin/sh -c "cinder-manage db sync" cinder
忽略输出中任何不推荐使用的信息。

配置计算服务以使用块设备存储

在控制节点编辑文件 /etc/nova/nova.conf 并添加如下到其中:

vim /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne

完成安装

重启计算API 服务:

systemctl restart openstack-nova-api.service

启动块设备存储服务,并将其配置为开机自启:

systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service;systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service

安装并配置一个存储节点

这个部分描述怎样为块存储服务安装并配置存储节点。为简单起见,这里配置一个有一个空的本地块存储设备的存储节点。这个向导用的是 /dev/sdb,但是你可以为你特定的节点中替换成不同的值。

在你安装和配置块存储服务之前,你必须准备好存储设备新建主机或者虚拟机 这里我使用block1

Ⅱ. OpenStack-Ocata 服务器网络配置文章中hosts已经添加block1,请查看此文章对block1节点进行相关配置。

Ⅲ.OpenStack-Ocata 网络时间协议(NTP) 同步时间文章中对block1进行配置时间同步。

Ⅳ.OpenStack-Ocata 安装OpenStack包文章中查看更换YUM源目录,进行更换YUM源。

安装基本工具

yum install -y vim net-tools tree lrzsz bash-completion wget

配置网络接口

编辑网卡配置/etc/sysconfig/network-scripts/ifcfg-ens33文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
#UUID="86fb4d7c-a361-4f6a-b082-15e7fecf0107"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="块存储节点IP"
NETMASK="255.255.255.0"
GATEWAY="服务器或者虚拟机的网关"
DNS1="114.114.114.114"

配置名称解析

设置节点主机名为 block1

hostnamectl set-hostname block1
hostname

编辑/etc/hosts文件

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# controller
控制节点IP         controller

# compute1
计算节点IP         compute1

# block1
块存储节点IP         block1

# object1
#192.168.145.136         object1

# object2
#192.168.145.137         object2

block1节点上创建一个硬盘,如下图:

block1节点上扫描一下挂载的硬盘

echo "- - -" > /sys/class/scsi_host/host0/scan

输入lsblk后如果没有扫描到新硬盘,请扫描/sys/class/scsi_host/下的所以文件夹

我们会在host文件夹下发现host0/host1/ host2/ 我们一个一个扫描,直到lsblk命令出现新的硬盘。

echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan

发现sdb30G的硬盘。

安装工具包

安装 LVM 包:

yum install lvm2

启动LVM的metadata服务并且设置该服务随系统启动:

systemctl enable lvm2-lvmetad.service;systemctl start lvm2-lvmetad.service

使用pvcreatesdb创建为物理卷

pvcreate /dev/sdb

创建 LVM 卷组 cinder-volumes

vgcreate cinder-volumes /dev/sdb

块存储服务会在这个卷组中创建逻辑卷。

编辑/etc/lvm/lvm.conf文件

只有实例可以访问块存储卷组。但是,底层的操作系统管理着与这些卷相关联的设备。默认情况下,LVM卷扫描工具会扫描/dev 目录,查找包含卷的块存储设备。如果项目在他们的卷上使用了LVM,扫描工具便会在检测到这些卷时尝试缓存它们,这可能会在底层操作系统和项目卷上产生各种问题。所以您必须重新配置LVM,让它扫描仅包含cinder-volume卷组的设备。

vim /etc/lvm/lvm.conf

搜索devices部分,添加一个过滤器,只接受/dev/sdb设备,拒绝其他所有设备:
存储节点:

devices {
#...
filter = [ "a/sda/", "a/sdb/", "r/.*/"]

使用了LVM,所以我们需要在计算节点上修改/etc/lvm/lvm.conf文件

计算节点:

vim /etc/lvm/lvm.conf
devices {
#...
filter = [ "a/sda/", "r/.*/"]

每个过滤器组中的元素都以a开头,即为 accept,或以 r 开头,即为reject,并且包括一个设备名称的正则表达式规则。过滤器组必须以r/.*/结束,过滤所有保留设备。


解释:

如果您的存储节点在操作系统磁盘上使用了 LVM,您还必需添加相关的设备到过滤器中。例如,如果 /dev/sda 设备包含操作系统:

devices {
#...
filter = [ "a/sda/", "a/sdb/", "r/.*/"]

类似地,如果您的计算节点在操作系统磁盘上使用了 LVM,您也必需修改这些节点上 /etc/lvm/lvm.conf 文件中的过滤器,将操作系统磁盘包含到过滤器中。例如,如果/dev/sda 设备包含操作系统:

devices {
#...
filter = [ "a/sda/", "r/.*/"]

前往计算节点查看是否使用了 LVM

安全并配置组件

存储节点安装软件包:

yum install -y openstack-cinder targetcli python-keystone

编辑 /etc/cinder/cinder.conf,同时完成如下动作:

vim /etc/cinder/cinder.conf

[database] 部分,配置数据库访问:

[database]
# ...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder
用你为块设备存储数据库选择的密码替换 CINDER_DBPASS

[DEFAULT]部分,配置RabbitMQ消息队列访问权限:

[DEFAULT]
# ...
transport_url = rabbit://openstack:RABBIT_PASS@controller
用你在 “RabbitMQ” 中为 “openstack” 选择的密码替换 “RABBIT_PASS”。

[DEFAULT][keystone_authtoken]部分,配置认证服务访问:

[DEFAULT]
# ...
auth_strategy = keystone
[keystone_authtoken]
# ...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = CINDER_PASS
CINDER_PASS 替换为你在认证服务中为 cinder 用户选择的密码。

[DEFAULT] 部分,配置 my_ip 选项:

[DEFAULT]
# ...
my_ip = 存储节点IP 地址

[lvm]部分中,配置LVM后端,包括LVM驱动,cinder-volumes 卷组 ,iSCSI 协议和适当的 iSCSI服务。如果 [lvm]部分不存在,则创建它:

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm

[DEFAULT] 部分,启用 LVM 后端:

[DEFAULT]
# ...
enabled_backends = lvm

[DEFAULT] 区域,配置镜像服务 API 的位置:

[DEFAULT]
# ...
glance_api_servers = http://controller:9292

[oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
# ...
lock_path = /var/lib/cinder/tmp

完成安装

启动块存储卷服务及其依赖的服务,并将其配置为随系统启动:

systemctl enable openstack-cinder-volume.service target.service;systemctl start openstack-cinder-volume.service target.service

验证操作

验证块设备存储服务的操作,在控制节点上执行这些命令。

获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

. admin-openrc

列出服务组件以验证是否每个进程都成功启动:

openstack volume service list

现在OpenStack 环境中已经包含了块设备存储服务。

如果觉得我的文章对你有用,请随意赞赏