cinder块存储服务概述

OpenStack 块存储服务(cinder)将持久存储添加到虚拟机。块存储提供用于管理卷的基础结构,并与 OpenStack Compute 进行交互,以提供实例的卷。该服务还支持管理卷快照和卷类型。

块存储服务由以下组件组成:

  • cinder-api

    接受 API 请求,并将它们路由到 操作。cinder-volume

  • cinder-volume

    直接与块存储服务和进程(如 )进行交互。它还通过消息队列与这些进程进行交互。该服务响应发送到块存储服务的读取和写入请求以维护状态。它可以通过驱动程序体系结构与各种存储提供程序进行交互。cinder-scheduler cinder-volume

  • cinder-scheduler daemon

    选择要在其中创建卷的最佳存储提供程序节点。与 类似的组件。nova-scheduler

  • cinder-backup daemon

    该服务向备份存储提供程序提供任何类型的备份卷。与服务一样,它可以通过驱动程序体系结构与各种存储提供程序进行交互。cinder-backup cinder-volume

  • Messaging queue

    在块存储进程之间路由信息。

安装和配置控制器节点

本节介绍如何在控制器节点上安装和配置块存储服务,代号为block。此服务至少需要一个额外的存储节点,该节点向实例提供卷。

先决条件

在安装和配置块存储服务之前,必须创建数据库、服务凭据和 API 终结点。

  1. 若要创建数据库,请完成以下步骤:

    1. 使用数据库访问客户端以用户方式连接到数据库服务器:root

      $ mysql -u root -p
      
    2. 创建数据库:cinder

      MariaDB [(none)]> CREATE DATABASE cinder;
      
    3. 授予对数据库的适当访问权限:cinder

      MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder';
      MariaDB [(none)]> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder';
      

      替换为合适的密码。CINDER_DBPASS

    4. 退出数据库访问客户端。

  2. 源凭据以访问仅管理员 CLI 命令:admin

    $ . admin-openrc
    
  3. 若要创建服务凭据,请完成以下步骤:

    1. 创建用户:cinder

       $ openstack user create --domain default --password-prompt cinder
      User Password:
      Repeat User Password:
      +---------------------+----------------------------------+
      | Field               | Value                            |
      +---------------------+----------------------------------+
      | domain_id           | default                          |
      | enabled             | True                             |
      | id                  | 40361f373b0d48e4a7189df45ac78410 |
      | name                | cinder                           |
      | options             | {}                               |
      | password_expires_at | None                             |
      +---------------------+----------------------------------+
      
    2. 将角色添加到用户:admin``cinder

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

      注意

      此命令不提供输出。

    3. 创建 和服务实体:cinderv2 cinderv3

       $ openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
      +-------------+----------------------------------+
      | Field       | Value                            |
      +-------------+----------------------------------+
      | description | OpenStack Block Storage          |
      | enabled     | True                             |
      | id          | 6d4a9e3b739a4a78bce91910a41c3054 |
      | name        | cinderv2                         |
      | type        | volumev2                         |
      +-------------+----------------------------------+
      
       $ openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3
      
      +-------------+----------------------------------+
      | Field       | Value                            |
      +-------------+----------------------------------+
      | description | OpenStack Block Storage          |
      | enabled     | True                             |
      | id          | b15215fcf7364e728b24c65f2f50d0b2 |
      | name        | cinderv3                         |
      | type        | volumev3                         |
      +-------------+----------------------------------+
      

      注意

      块存储服务需要两个服务实体。

  4. 创建块存储服务 API 终结点:

    [root@controller ~]# openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s
    +--------------+------------------------------------------+
    | Field        | Value                                    |
    +--------------+------------------------------------------+
    | enabled      | True                                     |
    | id           | 404b00216d784b4c8557914fe21b2cd6         |
    | interface    | public                                   |
    | region       | RegionOne                                |
    | region_id    | RegionOne                                |
    | service_id   | 6d4a9e3b739a4a78bce91910a41c3054         |
    | service_name | cinderv2                                 |
    | service_type | volumev2                                 |
    | url          | http://controller:8776/v2/%(project_id)s |
    +--------------+------------------------------------------+
    [root@controller ~]# openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s
      
    [root@controller ~]# openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s
    +--------------+------------------------------------------+
    | Field        | Value                                    |
    +--------------+------------------------------------------+
    | enabled      | True                                     |
    | id           | e1f2f38033574041ab3047db3452abef         |
    | interface    | admin                                    |
    | region       | RegionOne                                |
    | region_id    | RegionOne                                |
    | service_id   | 6d4a9e3b739a4a78bce91910a41c3054         |
    | service_name | cinderv2                                 |
    | service_type | volumev2                                 |
    | url          | http://controller:8776/v2/%(project_id)s |
    +--------------+------------------------------------------+
    
    [root@controller ~]# openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s
    +--------------+------------------------------------------+
    | Field        | Value                                    |
    +--------------+------------------------------------------+
    | enabled      | True                                     |
    | id           | adde633c1f3f49578cf532982587a380         |
    | interface    | public                                   |
    | region       | RegionOne                                |
    | region_id    | RegionOne                                |
    | service_id   | b15215fcf7364e728b24c65f2f50d0b2         |
    | service_name | cinderv3                                 |
    | service_type | volumev3                                 |
    | url          | http://controller:8776/v3/%(project_id)s |
    +--------------+------------------------------------------+
    [root@controller ~]# openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s
    +--------------+------------------------------------------+
    | Field        | Value                                    |
    +--------------+------------------------------------------+
    | enabled      | True                                     |
    | id           | a5e8507d8b894bd2a9a145781f86ca18         |
    | interface    | internal                                 |
    | region       | RegionOne                                |
    | region_id    | RegionOne                                |
    | service_id   | b15215fcf7364e728b24c65f2f50d0b2         |
    | service_name | cinderv3                                 |
    | service_type | volumev3                                 |
    | url          | http://controller:8776/v3/%(project_id)s |
    +--------------+------------------------------------------+
    [root@controller ~]# openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s
    +--------------+------------------------------------------+
    | Field        | Value                                    |
    +--------------+------------------------------------------+
    | enabled      | True                                     |
    | id           | 1b2874ea8ac1490eb0a1fd6facbcb77b         |
    | interface    | admin                                    |
    | region       | RegionOne                                |
    | region_id    | RegionOne                                |
    | service_id   | b15215fcf7364e728b24c65f2f50d0b2         |
    | service_name | cinderv3                                 |
    | service_type | volumev3                                 |
    | url          | http://controller:8776/v3/%(project_id)s |
    

    注意

    块存储服务需要每个服务实体的终结点。

安装和配置组件

  1. 安装包:

    # yum install openstack-cinder
    
  2. 编辑文件并完成以下操作:/etc/cinder/cinder.conf

    1. 在 本节中,配置数据库访问:[database]

      [database]
      # ...
      connection = mysql+pymysql://cinder:cinder@controller/cinder
      

      替换为为块存储数据库选择的密码。CINDER_DBPASS

    2. 在 部分中,配置消息队列访问:[DEFAULT]``RabbitMQ

      [DEFAULT]
      # ...
      transport_url = rabbit://openstack:openstack@controller
      

      替换为为 帐户选择的密码。RABBIT_PASS``openstack``RabbitMQ

    3. 在 和 部分中,配置标识服务访问:[DEFAULT]``[keystone_authtoken]

      [DEFAULT]
      # ...
      auth_strategy = keystone
      
      [keystone_authtoken]
      # ...
      www_authenticate_uri = http://controller:5000
      auth_url = http://controller:5000
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = default
      user_domain_name = default
      project_name = service
      username = cinder
      password = cinder
      

      替换为"标识"服务中为用户选择的密码。CINDER_PASS cinder

      注意

      注释掉或删除部分中任何其他选项。[keystone_authtoken]

    4. 在 本节中,配置使用控制器节点的管理接口 IP 地址的选项:[DEFAULT]``my_ip

      [DEFAULT]
      # ...
      my_ip = 172.16.30.30
      
  3. 在 本节中,配置锁定路径:[oslo_concurrency]

    [oslo_concurrency]
    # ...
    lock_path = /var/lib/cinder/tmp
    
  4. 填充块存储数据库:

    # su -s /bin/sh -c "cinder-manage db sync" cinder
    

    注意

    忽略此输出中的任何弃用消息。

将计算配置为使用块存储

  1. 编辑该文件并添加以下内容:/etc/nova/nova.conf

    [cinder]
    os_region_name = RegionOne
    

完成安装

  1. 重新启动计算 API 服务:

    # systemctl restart openstack-nova-api.service
    
  2. 启动块存储服务并将其配置为在系统启动时启动:

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

安装和配置存储节点

先决条件

在存储节点上安装和配置块存储服务之前,必须准备存储设备。

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

  1. 安装支持实用程序包:

    • 安装 LVM 软件包:

      # yum install lvm2 device-mapper-persistent-data
      
    • 启动 LVM 元数据服务并将其配置为在系统启动时启动:

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

    注意

    默认情况下,某些发行版包括 LVM。

  2. 创建 LVM 物理卷:/dev/sdb

    # pvcreate /dev/sdb
    
    Physical volume "/dev/sdb" successfully created
    
  3. 创建 LVM 卷组:cinder-volumes

    # vgcreate cinder-volumes /dev/sdb
    
    Volume group "cinder-volumes" successfully created
    

    块存储服务在此卷组中创建逻辑卷。

  4. 只有实例可以访问块存储卷。但是,基础操作系统管理与卷关联的设备。默认情况下,LVM 卷扫描工具扫描目录中包含卷的块存储设备。如果项目在卷上使用 LVM,扫描工具将检测这些卷并尝试缓存它们,这可能会导致基础操作系统和项目卷出现各种问题。您必须重新配置 LVM 以仅扫描包含卷组的设备。编辑文件并完成以下操作:/dev cinder-volumes /etc/lvm/lvm.conf

    • 在 本节中,添加接受设备并拒绝所有其他设备的筛选器:devices /dev/sdb

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

      筛选器数组中的每一项都从接受或拒绝开始,并包括设备名称的正则表达式。阵列必须以拒绝任何剩余设备结束。您可以使用vgs -vv 命令来测试筛选器。a r r/.*/

      警告

      如果存储节点在操作系统磁盘上使用 LVM,则还必须将关联的设备添加到筛选器中。例如,如果设备包含操作系统:/dev/sda

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

      同样,如果计算节点在操作系统磁盘上使用 LVM,则还必须修改这些节点上文件中的筛选器,以仅包括操作系统磁盘。例如,如果设备包含操作系统:/etc/lvm/lvm.conf``/dev/sda

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

安装和配置组件

  1. 安装包:

    # yum install openstack-cinder targetcli python-keystone
    
  2. 编辑文件并完成以下操作:/etc/cinder/cinder.conf

    • 在 本节中,配置数据库访问:[database]

      [database]
      # ...
      connection = mysql+pymysql://cinder:cinder@controller/cinder
      

      替换为为块存储数据库选择的密码。CINDER_DBPASS

    • 在 部分中,配置消息队列访问:[DEFAULT] RabbitMQ

      [DEFAULT]
      # ...
      transport_url = rabbit://openstack:openstack@controller
      

      替换为为 帐户选择的密码。RABBIT_PASS openstack RabbitMQ

    • 在 和 部分中,配置标识服务访问:[DEFAULT] [keystone_authtoken]

      [DEFAULT]
      # ...
      auth_strategy = keystone
      
      [keystone_authtoken]
      # ...
      www_authenticate_uri = http://controller:5000
      auth_url = http://controller:5000
      memcached_servers = controller:11211
      auth_type = password
      project_domain_name = default
      user_domain_name = default
      project_name = service
      username = cinder
      password = cinder
      

      替换为"标识"服务中为用户选择的密码。CINDER_PASS cinder

      注意

      注释掉或删除部分中任何其他选项。[keystone_authtoken]

    • 在 本节中,配置选项:[DEFAULT]``my_ip

      [DEFAULT]
      # ...
      my_ip = 172.16.2.2
      

      替换为存储节点上管理网络接口的 IP 地址,通常为示例体系结构中第一个节点的 10.0.0.41。 MANAGEMENT_INTERFACE_IP_ADDRESS

    • 在本节中,使用 LVM 驱动程序、卷组、iSCSI 协议和相应的 iSCSI 服务配置 LVM endpoint。如果该节不存在,请创建它:[lvm] cinder-volumes [lvm]

      [lvm]
      volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
      volume_group = cinder-volumes
      target_protocol = iscsi
      target_helper = lioadm
      
    • 在本节中,启用 LVM 端:[DEFAULT]

      [DEFAULT]
      # ...
      enabled_backends = lvm
      

      注意

      端端名称是任意的。例如,本指南使用驱动程序的名称作为端名。

    • 在 本节中,配置影像服务 API 的位置:[DEFAULT]

      [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
    

验证 cinder 操作

验证块存储服务的操作。

注意

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

  1. 源凭据以访问仅管理员 CLI 命令:admin

    $ . admin-openrc
    
  2. 列出服务组件以验证每个进程是否成功启动:

    $ openstack volume service list
    +------------------+------------+------+---------+-------+----------------------------+
    | Binary           | Host       | Zone | Status  | State | Updated At                 |
    +------------------+------------+------+---------+-------+----------------------------+
    | cinder-scheduler | controller | nova | enabled | up    | 2020-12-10T09:36:49.000000 |
    | cinder-volume    | cinder@lvm | nova | enabled | up    | 2020-12-10T09:36:42.000000 |
    +------------------+------------+------+---------+-------+----------------------------+