09.OpenStack云硬盘服务Cinder

徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208

cinder-api: 接受API请求并将请求路由到cinder-volume来执行。
cinder-volume: 响应请求,读取或写向块存储数据库为维护状态,通过信息队列机制与其他进程交互(如Cinder-scheduler)或直接与上层块存储提供的硬件或软件进行交互。通过驱动结构,他可以与众多的存储提供者进行交互
Cinder-scheduler: 守护进行。类似于nova-scheduler,为存储卷的实例选取最优的块存储供应节点。

2.Cinder控制节点安装和配置

本节将介绍如何安装和配置镜像服务,部署至控制器节点上。为简单起见,存储在本地文件系统上的镜像。

2.1块存储服务先决条件

配置OpenStack的认证服务之前,你必须创建一个数据库和管理令牌。

1.创建cinder数据库,赋予数据库梯形权限,完成以下操作

mysql -u root -p123456 -e "CREATE DATABASE cinder;"

mysql -u root -p123456 -e "GRANT ALL PRIVILEGES ON \
cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder';"

mysql -u root -p123456 -e "GRANT ALL PRIVILEGES ON \
cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder';"

2.source admin来访问管理

[root@linux-node1 ~]# source admin-openrc

3.创建服务的凭证,完成下列步骤:

创建Cinder用户

[root@linux-node1 ~]# openstack user create --domain default \
--password=cinder cinder
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | daf075b6a12141c3a1f2cee4a476b680 |
| name                | cinder                           |
| password_expires_at | None                             |
+---------------------+----------------------------------+

添加Cinder用户至 "admin" 角色和服务项目

[root@linux-node1 ~]# openstack role add --project service --user cinder admin

创建Cinder以及CinderV2服务实体(块存储服务需要两个服务实体。)

[root@linux-node1 ~]# openstack service create --name cinder \
--description "OpenStack Block Storage" volume
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | 1cf249df13184585ae895724f2c741a2 |
| name        | cinder                           |
| type        | volume                           |
+-------------+----------------------------------+


[root@linux-node1 ~]# openstack service create --name cinderv2 \
--description "OpenStack Block Storage" volumev2
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | cc9b4530c62f41009643a098f1a150e9 |
| name        | cinderv2                         |
| type        | volumev2                         |
+-------------+----------------------------------+

4.创建块存储服务API端点(块存储服务要求每个服务实体的端点。)

[root@linux-node1 ~]# openstack endpoint create --region RegionOne \
volume public http://192.168.56.11:8776/v1/%\(tenant_id\)s
+--------------+--------------------------------------------+
| Field        | Value                                      |
+--------------+--------------------------------------------+
| enabled      | True                                       |
| id           | 8bbf4c4a86304877917d4bebf1e8932b           |
| interface    | public                                     |
| region       | RegionOne                                  |
| region_id    | RegionOne                                  |
| service_id   | 1cf249df13184585ae895724f2c741a2           |
| service_name | cinder                                     |
| service_type | volume                                     |
| url          | http://192.168.56.11:8776/v1/%(tenant_id)s |
+--------------+--------------------------------------------+

[root@linux-node1 ~]# openstack endpoint create --region RegionOne \
volume internal http://192.168.56.11:8776/v1/%\(tenant_id\)s
+--------------+--------------------------------------------+
| Field        | Value                                      |
+--------------+--------------------------------------------+
| enabled      | True                                       |
| id           | 63c3625a1fa040e68a08768d4ba746cd           |
| interface    | internal                                   |
| region       | RegionOne                                  |
| region_id    | RegionOne                                  |
| service_id   | 1cf249df13184585ae895724f2c741a2           |
| service_name | cinder                                     |
| service_type | volume                                     |
| url          | http://192.168.56.11:8776/v1/%(tenant_id)s |
+--------------+--------------------------------------------+

[root@linux-node1 ~]# openstack endpoint create --region RegionOne \
volume admin http://192.168.56.11:8776/v1/%\(tenant_id\)s
+--------------+--------------------------------------------+
| Field        | Value                                      |
+--------------+--------------------------------------------+
| enabled      | True                                       |
| id           | 5c65086c77b24283ba699b7515d598de           |
| interface    | admin                                      |
| region       | RegionOne                                  |
| region_id    | RegionOne                                  |
| service_id   | 1cf249df13184585ae895724f2c741a2           |
| service_name | cinder                                     |
| service_type | volume                                     |
| url          | http://192.168.56.11:8776/v1/%(tenant_id)s |
+--------------+--------------------------------------------+



[root@linux-node1 ~]# openstack endpoint create --region RegionOne \
volumev2 public http://192.168.56.11:8776/v2/%\(tenant_id\)s
+--------------+--------------------------------------------+
| Field        | Value                                      |
+--------------+--------------------------------------------+
| enabled      | True                                       |
| id           | 956ed98abbb7427ab1ebfcacacabdb66           |
| interface    | public                                     |
| region       | RegionOne                                  |
| region_id    | RegionOne                                  |
| service_id   | cc9b4530c62f41009643a098f1a150e9           |
| service_name | cinderv2                                   |
| service_type | volumev2                                   |
| url          | http://192.168.56.11:8776/v2/%(tenant_id)s |
+--------------+--------------------------------------------+

[root@linux-node1 ~]# openstack endpoint create --region RegionOne \
volumev2 internal http://192.168.56.11:8776/v2/%\(tenant_id\)s
+--------------+--------------------------------------------+
| Field        | Value                                      |
+--------------+--------------------------------------------+
| enabled      | True                                       |
| id           | 2d655aec657746979896ec26394a8dfd           |
| interface    | internal                                   |
| region       | RegionOne                                  |
| region_id    | RegionOne                                  |
| service_id   | cc9b4530c62f41009643a098f1a150e9           |
| service_name | cinderv2                                   |
| service_type | volumev2                                   |
| url          | http://192.168.56.11:8776/v2/%(tenant_id)s |
+--------------+--------------------------------------------+

[root@linux-node1 ~]# openstack endpoint create --region RegionOne \
volumev2 admin http://192.168.56.11:8776/v2/%\(tenant_id\)s
+--------------+--------------------------------------------+
| Field        | Value                                      |
+--------------+--------------------------------------------+
| enabled      | True                                       |
| id           | cf12a61a31594794ad8e2644265b2643           |
| interface    | admin                                      |
| region       | RegionOne                                  |
| region_id    | RegionOne                                  |
| service_id   | cc9b4530c62f41009643a098f1a150e9           |
| service_name | cinderv2                                   |
| service_type | volumev2                                   |
| url          | http://192.168.56.11:8776/v2/%(tenant_id)s |
+--------------+--------------------------------------------+

2.2安装和配置控制节点Cinder组件

1.安装Openstack Cinder块存储服务

[root@linux-node1 ~]# yum install openstack-cinder -y

2.编辑/etc/cinder/cinder.conf文件,并完成以下操作:

[database]部分中,配置数据库

[database]
...
connection=mysql://cinder:cinder@192.168.56.11/cinder

[DEFAULT][oslo_messaging_rabbit] 部分,部分配置RabbitMQ消息队列服务

[DEFAULT]
...
rpc_backend = rabbit


[oslo_messaging_rabbit]
...
rabbit_host = 192.168.56.11
rabbit_userid = openstack
rabbit_password = openstack

[DEFAULT][keystone_authtoken]部分,配置认证服务(注释掉[keystone_authtoken]部分的任何其他选项。)

[DEFAULT]
...
auth_strategy = keystone


[keystone_authtoken]
...
auth_uri = http://192.168.56.11:5000
auth_url = http://192.168.56.11:35357
memcached_servers = 192.168.56.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = cinder

[DEFAULT]部分,配置my_ip选项使用的控制器节点的管理接口的IP地址

[DEFAULT]
...
my_ip = 192.168.56.11

[oslo_concurrency]部分,配置锁位置

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

4.初始化Cinder块存储数据库,并验证 (忽视此输出任何消息。)

[root@linux-node1 ~]# su -s /bin/sh -c "cinder-manage db sync" cinder
[root@linux-node1 ~]# mysql -h192.168.56.11 -ucinder -pcinder -e "use cinder;show tables;"|wc -l
34

2.3配置计算使用块存储

编辑/etc/nova/nova.conf文件并添加如下

[cinder]
...
os_region_name = RegionOne

2.4完成控制节点Cinder服务安装

1.重新启动控制节点Nova服务

[root@linux-node1 ~]# systemctl restart openstack-nova-api.service

2.启动块存储服务,并将其配置启动系统时启动

[root@linux-node1 ~]# systemctl enable openstack-cinder-api.service \
openstack-cinder-scheduler.service
[root@linux-node1 ~]# systemctl start openstack-cinder-api.service \
openstack-cinder-scheduler.service

3.计算节点安装和配置存储

在存储节点上执行这些步骤

1.在OpenStack计算节点部署Cinder存储节点

[root@linux-node2 ~]# yum install lvm2

2.启动LVM服务配置为在系统启动时启动

[root@linux-node2 ~]# systemctl enable lvm2-lvmetad.service
[root@linux-node2 ~]# systemctl start  lvm2-lvmetad.service

3.创建LVM物理卷"/dev/sdb" (如果是虚拟机,需先添加一块硬盘)

[root@linux-node2 ~]#  pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created

4.创建LVM卷组cinder-volumes(块存储服务在这个卷组中创建逻辑卷。)

[root@linux-node2 ~]# vgcreate cinder-volumes /dev/sdb
  Volume group "cinder-volumes" successfully created

5.编辑/etc/lvm/lvm.conf文件,在设备部分,添加一个筛选器接受/dev/sdb设备并拒绝所有其他设备

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

3.1安装和配置计算节点Cinder组件

1.计算节点安装Openstack Cinder块存储服务

[root@linux-node2 ~]# yum install openstack-cinder targetcli python-keystone -y

2.编辑/etc/cinder/cinder.conf文件,并完成以下操作:

[database]部分中,配置数据库

[database]
...
connection=mysql://cinder:cinder@192.168.56.11/cinder

[DEFAULT][oslo_messaging_rabbit] 部分,部分配置RabbitMQ消息队列服务

[DEFAULT]
...
rpc_backend = rabbit


[oslo_messaging_rabbit]
...
rabbit_host = 192.168.56.11
rabbit_userid = openstack
rabbit_password = openstack

[DEFAULT][keystone_authtoken]部分,配置认证服务(注释掉[keystone_authtoken]部分的任何其他选项。)

[DEFAULT]
...
auth_strategy = keystone


[keystone_authtoken]
...
auth_uri = http://192.168.56.11:5000
auth_url = http://192.168.56.11:35357
memcached_servers = 192.168.56.11:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = cinder

[DEFAULT]部分,配置my_ip选项使用管理接口的IP地址

[DEFAULT]
...
my_ip = 192.168.56.12

[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]部分中,配置镜像服务接口

[DEFAULT]
...
glance_api_servers = http://192.168.56.11:9292

[oslo_concurrency]部分,配置锁位置

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

3.2完成计算节点Cinder服务安装

[root@linux-node2 ~]# systemctl enable openstack-cinder-volume.service target.service
[root@linux-node2 ~]# systemctl start openstack-cinder-volume.service target.service

4.验证操作


在控制器节点上执行这些命令。

1.source admin来访问管理

[root@linux-node1 ~]# source admin-openrc

2.列出服务组件以验证每一个过程的成功

[root@linux-node1 ~]# cinder service-list
+------------------+--------------------------------+------+---------+-------+----------------------------+-----------------+
| Binary           | Host                           | Zone | Status  | State | Updated_at                 | Disabled Reason |
+------------------+--------------------------------+------+---------+-------+----------------------------+-----------------+
| cinder-scheduler | linux-node1.xuliangwei.com     | nova | enabled | up    | 2016-10-12T03:58:13.000000 | -               |
| cinder-volume    | linux-node2.xuliangwei.com@lvm | nova | enabled | up    | 2016-10-12T03:58:10.000000 | -               |
+------------------+--------------------------------+------+---------+-------+----------------------------+-----------------+

3.在Horizon WEB UI操作

创建卷

创建卷

连接卷

连接卷

连接卷

检测

检查是否挂载成功

生产云硬盘Cinder使用建议:

在虚拟机实例中对挂载云硬盘进行分区格式化,如不使用此云硬盘,不要执行删除操作,先使用umount卸载,最后Dashboard删除云硬盘。

如果有时不想挂载这个云硬盘了,一定不要删掉,生产环境一定要注意,否则虚拟机会出现error,应使用umont,确定卸载了,再使用dashboard进行删除云硬盘