案例描述

本案例共讲述了OpenStack云平台中基础组件与服务的使用,包括Glance镜像服务,Nova计算服务,Cinder块存储服务,Swift对象存储服务的使用方法。具体案例如下:

1.Glance镜像服务:镜像的上传及过程中限制disk和ram;

2.Nova计算服务:创建云主机,开启实例大小调整,和调优操作;

3.Cinder块存储服务:云硬盘的基础使用,创建,挂载,扩容Cinder;

4.Swift对象存储服务:对象存储的基础使用,分片存储。

案例一:Glance镜像服务的基本使用

案例准备

规划节点

节点规划见表1。

表1 节点规划

IP 主机名 节点
172.128.11.13 controller 控制节点
172.128.11.19 compute 计算节点

基础准备

登录物理OpenStack平台,使用云主机搭建的OpenStack平台作为实验节点。

案例实施

Glance镜像服务介绍

Glance是OpenStack镜像服务,用来注册、登陆和检索虚拟机镜像。Glance服务提供了一个REST API,使读者能够查询虚拟机镜像元数据和检索的实际镜像。通过镜像服务提供的虚拟机镜像可以存储在不同的位置,从简单的文件系统对象存储到类似OpenStack对象存储系统。Glance与其他组件的关系如图1-1所示。

30

图1-1 Glance与其他组件的关系

默认情况下,上传的虚拟机镜像存储路径为/var/lib/glance/images/。Glance负责镜像文件的注册、查询和存储管理。

● glance-api负责接受Image API请求,处理image查询和存储等

● glance-registry负责存储,处理和检索image的元数据(大小,类型等)

● 使用数据库来存储image文件的元数据

● 支持不同的存储仓库来存储image文件,包括swift,本地磁盘,RADOS块设备,Amazon S3,HTTP。


Glance重要概念

(1)镜像状态

镜像状态是Glance管理镜像重要的一个内容,Glance组件给整个OpenStack提供的镜像查询和检索,Glance可以通过虚拟机镜像的状态感知某一镜像的可用状态。如图1-2所示,OpenStack中镜像的状态分成以下几种:

● Queued:Queued状态这是一种初始化镜像状态,在镜像文件刚刚被创建,在glance数据库中已经保存了镜像标示符,但还没有上传至glance中,此时的glance对镜像数据没有任何描述,其存储空间为0。

● Saving:Saving状态是镜像的原始数据在上传中的一种过度状态,它产生在镜像数据上传至glance的过程中,一般来讲,glance收到一个image请求后,才将镜像上传给glance。

● Active:Active状态是当镜像成功上传完毕以后的一种状态,它表明glance中可用的镜像。

● Killed:Killed状态出现在镜像上传失败或者镜像文件不可读的情况下,glance将镜像状态设置成Killed。

● Deleted:Deleted状态表明一个镜像文件马上会被删除,只是当前glance这种仍然保留该镜像文件的相关信息和原始镜像数据。

● Pending_delete:Pending_delete状态类似于deleted,虽然此时的镜像文件没有删除,但镜像文件不能恢复的。

31

图1-2 Glance镜像文件状态转换过程

(2)Glance基本架构和三大模块

它的设计模式采用C/S架构模式,Client通过Glance提供的REST API与Glance的服务器(Server)程序进行通信,Glance的服务器程序通过网络端口监听,接收Client发送来的镜像操作请求,基本架构如图1-3所示。

32

图1-3 Glance架构图

● Glance-api:接收REST API的请求,然后通过其他模块(glance-registry及image store)来完成诸如镜像的查找、获取、上传、删除等操作,默认监听端口9292。

● Glance-registry:用于与MariaDB数据库交互,用于存储或获取镜像的元数据(metadata);通过glance-registry,可以向数据库中写入或获取镜像的各种数据,glance-registry监听端口9191。

● Store Adapter:是一个存储的接口层,通过这个接口,glance可以获取镜像,image store支持的存储有Amazon的S3、OpenStack本身的Swift,本地文件存储和其他分布式存储。

(3)Glance组件的工作过程

如图1-4所示介绍了Glance组件在申请镜像是所与OpenStack平台进行交互的流程图。

33

图1-4 glance工作过程


创建镜像

(1)下载CirrOS镜像文件

CirrOS是一个极小的云操作系统,可以使用这个小的操作系统来进行Glance服务组件的操作练习。将提供的cirros-0.3.4-x86_64-disk.img镜像上传到controller节点的root目录下面。

1
2
[root@controller ~]# ls
cirros-0.3.4-x86_64-disk.img

将镜像上传至controller节点后,通过file命令查看镜像文件信息。

1
2
[root@controller ~]# file cirros-0.3.4-x86_64-disk.img 
cirros-0.3.4-x86_64-disk.img: QEMU QCOW Image (v2), 41126400 bytes

(2)创建镜像

通过命令创建镜像,命令的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@controller images]# glance help image-create 
usage: glance image-create [--architecture ]
[--protected [True|False]] [--name ]
[--instance-uuid ]
[--min-disk ] [--visibility ]
[--kernel-id ]
[--tags [ ...]]
[--os-version ]
[--disk-format ]
[--os-distro ] [--id ]
[--owner ] [--ramdisk-id ]
[--min-ram ]
[--container-format ]
[--property ] [--file ]
[--progress]

参数说明:

1
2
3
4
5
--disk-format:镜像格式
--container-format: 镜像在其他项目中可见性
--progress: 显示上传镜像的进度
--file:选择本地镜像文件
--name:上传后镜像的名称

使用镜像cirros-0.3.4-x86_64-disk.img通过命令上传镜像至OpenStack中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@controller ~]# glance image-create --name cirros-0.3.4 --disk-format qcow2 --container-format bare --progress < cirros-0.3.4-x86_64-disk.img
+------------------+--------------------------------------------------------------------+
| Property | Value |
+------------------+--------------------------------------------------------------------+
| checksum | f8ab98ff5e73ebab884d80c9dc9c7290 |
| container_format | bare |
| created_at | 2022-02-10T03:15:29Z |
| disk_format | qcow2 |
| id | 32a2513c-e5ba-438b-a5ee-63c35c03b284 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros-0.3.4 |
| os_hash_algo | sha512 |
| os_hash_value | f0fd1b50420dce4ca382ccfbb528eef3a38bbeff00b54e95e3876b9bafe7ed2d6f9
19ca35d9046d437c6d2d8698b1174a335fbd66035bb3edc525d2cdb187232 |
| os_hidden | False |
| owner | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protected | False |
| size | 13267968 |
| status | active |
| tags | [] |
| updated_at | 2022-02-10T03:15:29Z |
| virtual_size | Not available |
| visibility | shared |
+------------------+--------------------------------------------------------------------+

管理镜像

(1)查看镜像

通过命令可以在OpenStack平台中查看当前glance中所上传的镜像名称。具体命令如下:

1
2
3
4
5
6
[root@controller ~]# glance image-list
+--------------------------------------+--------------+
| ID | Name |
+--------------------------------------+--------------+
| 32a2513c-e5ba-438b-a5ee-63c35c03b284 | cirros-0.3.4 |
+--------------------------------------+--------------+

也可以使用命令查看镜像的详细信息。具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@controller ~]# glance image-show  32a2513c-e5ba-438b-a5ee-63c35c03b284
+------------------+--------------------------------------------------------------------+
| Property | Value |
+------------------+------------------------------------------------------------------ -+
| checksum | f8ab98ff5e73ebab884d80c9dc9c7290 |
| container_format | bare |
| created_at | 2022-02-10T03:15:29Z |
| disk_format | qcow2 |
| id | 32a2513c-e5ba-438b-a5ee-63c35c03b284 |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros-0.3.4 |
| os_hash_algo | sha512 |
| os_hash_value | f0fd1b50420dce4ca382ccfbb528eef3a38bbeff00b54e95e3876b9bafe7ed2d6f9
19ca35d9046d437c6d2d8698b1174a335fbd66035bb3edc525d2cdb187232 |
| os_hidden | False |
| owner | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protected | False |
| size | 13267968 |
| status | active |
| tags | [] |
| updated_at | 2022-02-10T03:15:29Z |
| virtual_size | Not available |
| visibility | shared |
+------------------+--------------------------------------------------------------------+

(2)修改镜像

可以使用glance image-update更新镜像信息,命令的格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@controller images]# glance help image-update 
usage: glance image-update [--architecture ]
[--protected [True|False]] [--name ]
[--instance-uuid ]
[--min-disk ] [--visibility ]
[--kernel-id ]
[--os-version ]
[--disk-format ]
[--os-distro ] [--owner ]
[--ramdisk-id ] [--min-ram ]
[--container-format ]
[--property ] [--remove-property key]

参数说明:

1
2
3
4
5
--min-disk:镜像启动最小硬盘大小
--name:镜像名称
--disk-format:镜像格式
--min-ram:镜像启动最小内存大小
--container-format:镜像在项目中可见性

如果需要改变镜像启动硬盘最低要求值(min-disk)1G,min-disk默认单位为G。使用glance image-update更新镜像信息操作如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@controller ~]# glance image-update --min-disk=1 32a2513c-e5ba-438b-a5ee-63c35c03b284

+------------------+--------------------------------------------------------------------+
| Property | Value |
+------------------+--------------------------------------------------------------------+
| checksum | f8ab98ff5e73ebab884d80c9dc9c7290 |
| container_format | bare |
| created_at | 2022-02-10T03:15:29Z |
| disk_format | qcow2 |
| id | 32a2513c-e5ba-438b-a5ee-63c35c03b284 |
| min_disk | 1 |
| min_ram | 0 |
| name | cirros-0.3.4 |
| os_hash_algo | sha512 |
| os_hash_value | f0fd1b50420dce4ca382ccfbb528eef3a38bbeff00b54e95e3876b9bafe7ed2d6f9
19ca35d9046d437c6d2d8698b1174a335fbd66035bb3edc525d2cdb187232 |
| os_hidden | False |
| owner | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protected | False |
| size | 13267968 |
| status | active |
| tags | [] |
| updated_at | 2022-02-10T03:16:59Z |
| virtual_size | Not available |
| visibility | shared |
+------------------+--------------------------------------------------------------------+

也可以使用命令更新镜像启动内存最低要求值(min-ram)为1G,min-ram默认单位为M。使用glance image-update更新镜像信息操作如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@controller ~]# glance image-update --min-ram=1024 32a2513c-e5ba-438b-a5ee-63c35c03b284
+------------------+--------------------------------------------------------------------+
| Property | Value |
+------------------+--------------------------------------------------------------------+
| checksum | f8ab98ff5e73ebab884d80c9dc9c7290 |
| container_format | bare |
| created_at | 2022-02-10T03:15:29Z |
| disk_format | qcow2 |
| id | 32a2513c-e5ba-438b-a5ee-63c35c03b284 |
| min_disk | 1 |
| min_ram | 1024 |
| name | cirros-0.3.4 |
| os_hash_algo | sha512 |
| os_hash_value | f0fd1b50420dce4ca382ccfbb528eef3a38bbeff00b54e95e3876b9bafe7ed2d6f9
19ca35d9046d437c6d2d8698b1174a335fbd66035bb3edc525d2cdb187232 |
| os_hidden | False |
| owner | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protected | False |
| size | 13267968 |
| status | active |
| tags | [] |
| updated_at | 2022-02-10T03:17:21Z |
| virtual_size | Not available |
| visibility | shared |
+------------------+--------------------------------------------------------------------+

(3)删除镜像

可以使用glance image-delete删除上传至OpenStack平台中的镜像,使用命令格式如下:

1
2
3
4
5
6
7
8
9
[root@controller images]# glance help image-delete
usage: glance image-delete [ ...]

Delete specified image.

Positional arguments:
ID of image(s) to delete.

Run `glance --os-image-api-version 1 help image-delete` for v1 help

只需要在命令后跟上镜像ID即可。命令如下:

1
2
3
4
5
6
[root@controller images]# glance image-delete 32a2513c-e5ba-438b-a5ee-63c35c03b284
[root@controller images]# glance image-list
+--------------------------------------+-------------------------------+
| ID | Name |
+--------------------------------------+-------------------------------+
+--------------------------------------+-------------------------------+

案例二:Nova服务的基本使用

案例准备

规划节点

节点规划见表2。

表2 节点规划

IP 主机名 节点
172.128.11.13 controller 控制节点
172.128.11.19 compute 计算节点

基础准备

登录物理OpenStack平台,使用云主机搭建的OpenStack平台作为实验节点。

案例实施

Nova简介

计算服务是OpenStack最核心的服务之一,负责维护和管理云环境的计算资源,它在OpenStack项目中代号是nova。

Nova自身并没有提供任何虚拟化能力,它提供计算服务,使用不同的虚拟化驱动来与底层支持的Hypervisor(虚拟机管理器)进行交互。所有的计算实例(虚拟服务器)由Nova进行生命周期的调度管理(启动、挂起、停止、删除等)。

Nova需要Keystone、Glance、Neutron、Cinder和Swift等其他服务的支持,能与这些服务集成,实现如加密磁盘、裸金属计算实例等。


Nova架构

Nova项目最初的源代码由美国国家航空航天局(NASA)贡献,截至Ocata版本,Nova项目已发行了十几个版本,也是社区所有项目中最为成熟和用户生产环境部署率最高的项目。在2010年OpenStack项目成立之初,Nova项目主要分为Nova-Compute、Nova-volume和Nova-network三大功能模块。在2012年9月OpenStack的Folsom版本发行时,社区才将Nova-volume和Nova-network独立出来分别构建了Cinder和Quantum项目(后因商标原因更名为Neutron项目)。Nova服务除了Nova-Compute、Nova-volume和Nova-network三大功能模块之外,还有处理RESTful API请求的Nova-API模块、调度Nova-Compute的Nova-scheduler模块、用以模块信息交互的消息队列系统和配置及状态数据存储的数据库。而在早期的OpenStack版本中,仅有Nova、Swift和Glance三大项目,如果用户不准备使用对象存储Swift,则Nova和Glance项目即构成了早期的OpenStack云平台。如图2-1所示。

34

图2-1 Nova架构图

在OpenStack的Folsom版本发行后,Nova-volume和Nova-network被独立成为块存储Cinder项目和网络Neutron项目,而Nova自身的功能模块也被不断细分,除了Nova-Compute和Nova-API功能模块,以及消息队列和数据库之外,Nova项目还构建了Nova-cert、Nova-Conductor、Nova-consoleauth和nova-console等模块。块存储Cinder项目和网络服务Neutron独立后,OpenStack中三大核心功能计算、存储和网络项目之间的逻辑架构如如图2-2所示。

35

图2-2 Nova与OpenStack平台逻辑结构


创建flavor类型

flavor类型为OpenStack在创建云主机时需要提供的云主机大小类型,云主机的资源大小可使用不同的flavor类型来进行定义。

(1)创建flavor类型

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@controller ~]# openstack help  flavor create 
usage: openstack flavor create [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width ]
[--fit-width] [--print-empty] [--noindent]
[--prefix PREFIX] [--id ] [--ram ]
[--disk ] [--ephemeral ]
[--swap ] [--vcpus ]
[--rxtx-factor ] [--public | --private]
[--property ] [--project ]
[--project-domain ]


Create new flavor

使用命令创建一个flavor,10G的硬盘大小,1G内存,2颗vcpu,ID为1,名称为centos。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@controller ~]#  openstack flavor create --disk 10 --ram 1024  --vcpus 2 --id 1 centos
+----------------------------+--------+
| Field | Value |
+----------------------------+--------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| disk | 10 |
| id | 1 |
| name | centos |
| os-flavor-access:is_public | True |
| properties | |
| ram | 1024 |
| rxtx_factor | 1.0 |
| swap | |
| vcpus | 2 |
+----------------------------+--------+

(2)查看flavor类型

使用“openstack flavor list”命令查看flavor类型列表,命令如下:

1
2
3
4
5
6
[root@controller ~]# openstack flavor list 
+----+--------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+--------+------+------+-----------+-------+-----------+
| 1 | centos | 1024 | 10 | 0 | 2 | True |
+----+--------+------+------+-----------+-------+-----------+

也可以使用“openstack flavor show”命令查看具体的flavor类型的详细信息。命令格式如下:

1
2
3
4
5
[root@controller ~]# openstack help flavor show
usage: openstack flavor show [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width ] [--fit-width]
[--print-empty] [--noindent] [--prefix PREFIX]

通过命令查看创建的“centos”的flavor类型详细信息。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@controller ~]# openstack flavor show centos
+----------------------------+--------+
| Field | Value |
+----------------------------+--------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| access_project_ids | None |
| disk | 10 |
| id | 1 |
| name | centos |
| os-flavor-access:is_public | True |
| properties | |
| ram | 1024 |
| rxtx_factor | 1.0 |
| swap | |
| vcpus | 2 |
+----------------------------+--------+

访问安全组

访问安全组为是OpenStack提供给云主机的一个访问策略控制组,通过安全组中的策略可以控制云主机的出入访问规则。

(1)查看访问安全组

使用命令“openstack security group list”可以查看当前所创建的访问安全组列表。命令如下:

1
2
3
4
5
6
7
[root@controller ~]# openstack security group list
+--------------------------+---------+------------------------+------------------+------+
| ID | Name | Description | Project | Tags |
+--------------------------+---------+------------------------+------------------+------+
|896ce430-21f8-4673-8110-af| default | Default security group |1776912d52a7444d8b| [] |
ce97e43715 2d09eb86e8d1d9
+--------------------------+---------+------------------------+------------------+------+

“default”为openstack平台自带的安全组,通过命令可以查看安全组中的安全规则,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@controller ~]#  openstack security group rule list default
+--------------------+-------------+-----------+-----------+------------+----------------------+
| ID | IP Protocol | Ethertype | IP Range | Port Range | Remote Security Group|
+--------------------+-------------+-----------+-----------+------------+----------------------+
| 1e6c27ff-b456-4d2a | None | IPv4 | 0.0.0.0/0 | | 896ce430-21f8-4673 |
-a64d-51197fea048e -8110-afce97e43715
| 699e2744-e926-4bb4 | None | IPv6 | ::/0 | | None |
-9e4f-54885f669bc5
| 7aa363c8-5df3-4ce3 | None | IPv6 | ::/0 | | 896ce430-21f8-4673 |
-a775-9e453f086c87 -8110-afce97e43715
| bb08b786-09f4-44f3 | None | IPv4 | 0.0.0.0/0 | | None |
-a030-71b189a0f84f
+--------------------+-------------+-----------+-----------+------------+----------------------+

在安全规则的列表中,不能看出每条规则的具体策略,通过使用命令“openstack security group rule show”查看规则的详细信息。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@controller ~]# openstack  security group rule show 7aa363c8-5df3-4ce3-a775-9e453f086c87
+-------------------+-------------------------------------------------------------------+
| Field | Value |
+-------------------+-------------------------------------------------------------------+
| created_at | 2022-02-10T03:21:40Z |
| description | None |
| direction | ingress |
| ether_type | IPv6 |
| id | 7aa363c8-5df3-4ce3-a775-9e453f086c87 |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| name | None |
| port_range_max | None |
| port_range_min | None |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protocol | None |
| remote_group_id | 896ce430-21f8-4673-8110-afce97e43715 |
| remote_ip_prefix | ::/0 |
| revision_number | 0 |
| security_group_id | 896ce430-21f8-4673-8110-afce97e43715 |
| tags | [] |
| updated_at | 2022-02-10T03:21:40Z |
+-------------------+-------------------------------------------------------------------+

(2)创建访问安全组

创建一个新的安全组,命令格式如下:

1
2
3
4
5
6
7
8
9
[root@controller ~]# openstack help security group create 
usage: openstack security group create [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width ]
[--fit-width] [--print-empty]
[--noindent] [--prefix PREFIX]
[--description ]
[--project ]
[--project-domain ]

使用命令创建新的安全组规则,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@controller ~]# openstack security group create test
+-----------------+---------------------------------------------------------------------+
| Field | Value |
+-----------------+---------------------------------------------------------------------+
| created_at | 2022-02-10T03:25:18Z |
| description | test |
| id | 96373f68-be50-4819-b9a6-8fc8d3e9dc0a |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| name | test |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| revision_number | 1 |
| rules | created_at='2022-02-10T03:25:18Z', direction='egress', ethertype
='IPv4', id='2bbc98ad-4784-419d-b815-4ee2c6c75b54', updated_at='2022-02-10T03:25:18Z' |
| | created_at='2022-02-10T03:25:19Z', direction='egress', ethertype
='IPv6', id='70fcb5e0-fd86-461e-84a4-2a83b4b90730', updated_at='2022-02-10T03:25:19Z' |
| tags | [] |
| updated_at | 2022-02-10T03:25:18Z |
+-----------------+---------------------------------------------------------------------+

(3)删除访问安全组

可以使用命令删除不需要使用的访问安全组,命令如下:

1
2
3
4
5
6
7
8
[root@controller ~]# openstack security group delete test
[root@controller ~]# openstack security group list
+-------------------------+---------+------------------------+------------------+------+
| ID | Name | Description | Project | Tags |
+-------------------------+---------+------------------------+------------------+------+
| 896ce430-21f8-4673-8110 | default | Default security group | 1776912d52a7444d | [] |
-afce97e43715 8b2d09eb86e8d1d9
+-------------------------+---------+------------------------+------------------+------+

(4)添加安全规则

在默认安全组中添加三条需要使用的访问规则,使用“openstack security group rule create”命令,命令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@controller ~]# openstack  help security group rule create 
usage: openstack security group rule create [-h]
[-f {json,shell,table,value,yaml}]
[-c COLUMN]
[--max-width ]
[--fit-width] [--print-empty]
[--noindent] [--prefix PREFIX]
[--remote-ip | --remote-group ]
[--description ]
[--dst-port ]
[--icmp-type ]
[--icmp-code ]
[--protocol ]
[--ingress | --egress]
[--ethertype ]
[--project ]
[--project-domain ]

在“defualt”安全组中添加一条策略,从入口方向放行所有ICMP规则,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@controller ~]# openstack security group rule create --protocol icmp --ingress  default
+-------------------+-------------------------------------------------------------------+
| Field | Value |
+-------------------+-------------------------------------------------------------------+
| created_at | 2022-02-10T04:47:42Z |
| description | |
| direction | ingress |
| ether_type | IPv4 |
| id | 61014f36-5c20-46ce-b779-7d0c7458e691 |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| name | None |
| port_range_max | None |
| port_range_min | None |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protocol | icmp |
| remote_group_id | None |
| remote_ip_prefix | 0.0.0.0/0 |
| revision_number | 0 |
| security_group_id | 896ce430-21f8-4673-8110-afce97e43715 |
| tags | [] |
| updated_at | 2022-02-10T04:47:42Z |
+-------------------+-------------------------------------------------------------------+

在“defualt”安全组中添加一条策略,从入口方向放行所有TCP规则,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@controller ~]# openstack security group rule create --protocol tcp --ingress  default
+-------------------+-------------------------------------------------------------------+
| Field | Value |
+-------------------+-------------------------------------------------------------------+
| created_at | 2022-02-10T04:47:59Z |
| description | |
| direction | ingress |
| ether_type | IPv4 |
| id | 03ace6cf-ec1a-42a9-a754-c21fe887d1c0 |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| name | None |
| port_range_max | None |
| port_range_min | None |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protocol | tcp |
| remote_group_id | None |
| remote_ip_prefix | 0.0.0.0/0 |
| revision_number | 0 |
| security_group_id | 896ce430-21f8-4673-8110-afce97e43715 |
| tags | [] |
| updated_at | 2022-02-10T04:47:59Z |
+-------------------+-------------------------------------------------------------------+

在“defualt”安全组中添加一条策略,从入口方向放行所有UDP规则,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@controller ~]# openstack security group rule create --protocol udp --ingress  default
+-------------------+------------------------------------------------------------------+
| Field | Value |
+-------------------+------------------------------------------------------------------+
| created_at | 2022-02-10T04:48:22Z |
| description | |
| direction | ingress |
| ether_type | IPv4 |
| id | 9ec501e5-2c16-4d89-8a15-57a16a8fe3cd |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| name | None |
| port_range_max | None |
| port_range_min | None |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| protocol | udp |
| remote_group_id | None |
| remote_ip_prefix | 0.0.0.0/0 |
| revision_number | 0 |
| security_group_id | 896ce430-21f8-4673-8110-afce97e43715 |
| tags | [] |
| updated_at | 2022-02-10T04:48:22Z |
+-------------------+------------------------------------------------------------------+

查看“default”安全组中所有的规则列表信息,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@controller ~]# openstack security group rule list default
+--------------------+-----------+---------+------- -+----------+---------------------+
| ID |IP Protocol|Ethertype| IP Range |Port Range|Remote Security Group|
+--------------------+-----------+---------+-----------+----------+---------------------+
| 03ace6cf-ec1a-42a9 | tcp | IPv4 | 0.0.0.0/0 | | None |
-a754-c21fe887d1c0
| 1e6c27ff-b456-4d2a | None | IPv4 | 0.0.0.0/0 | | 896ce430-21f8-4673 |
-a64d-51197fea048e -8110-afce97e43715
| 61014f36-5c20-46ce | icmp | IPv4 | 0.0.0.0/0 | | None |
-b779-7d0c7458e691
| 699e2744-e926-4bb4 | None | IPv6 | ::/0 | | None |
-9e4f-54885f669bc5
| 7aa363c8-5df3-4ce3 | None | IPv6 | ::/0 | | 896ce430-21f8-4673 |
-a775-9e453f086c87 -8110-afce97e43715
| 9ec501e5-2c16-4d89 | udp | IPv4 | 0.0.0.0/0 | | None |
-8a15-57a16a8fe3cd
| bb08b786-09f4-44f3 | None | IPv4 | 0.0.0.0/0 | | None |
-a030-71b189a0f84f
+--------------------+-----------+---------+-----------+----------+---------------------+

启动虚拟机

(1)查询可用镜像

使用“openstack image list”命令查看当前可用镜像列表。命令如下:

1
2
3
4
5
6
[root@controller ~]# openstack image list
+--------------------------------------+--------------+--------+
| ID | Name | Status |
+--------------------------------------+--------------+--------+
| 32a2513c-e5ba-438b-a5ee-63c35c03b284 | cirros-0.3.4 | active |
+--------------------------------------+--------------+--------+

使用“openstack flavor list”命令查看可用的类型。命令如下:

1
2
3
4
5
6
[root@controller ~]# openstack flavor list
+----+--------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+--------+------+------+-----------+-------+-----------+
| 1 | centos | 1024 | 10 | 0 | 2 | True |
+----+--------+------+------+-----------+-------+-----------+

(2)创建网络和子网

使用“openstack network create ”命令创建网络息。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@controller ~]# openstack network create --provider-network-type vlan --provider-physical-network provider network-vlan --provider-segment 200
+---------------------------+-----------------------------------------------------------+
| Field | Value |
+---------------------------+-----------------------------------------------------------+
| admin_state_up | UP |
| availability_zone_hints | |
| availability_zones | |
| created_at | 2022-02-10T05:02:18Z |
| description | |
| dns_domain | None |
| id | cccedc78-027d-40e9-afbd-708154923ca6 |
| ipv4_address_scope | None |
| ipv6_address_scope | None |
| is_default | False |
| is_vlan_transparent | None |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| mtu | 1500 |
| name | network-vlan |
| port_security_enabled | True |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| provider:network_type | vlan |
| provider:physical_network | provider |
| provider:segmentation_id | 200 |
| qos_policy_id | None |
| revision_number | 1 |
| router:external | Internal |
| segments | None |
| shared | False |
| status | ACTIVE |
| subnets | |
| tags | |
| updated_at | 2022-02-10T05:02:18Z |
+---------------------------+-----------------------------------------------------------+

使用“openstack subnet create”创建子网。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@controller ~]# openstack subnet list
[root@controller ~]# openstack subnet create --network network-vlan --allocation-pool start=192.168.200.100,end=192.168.200.200 --gateway 192.168.200.1 --subnet-range 192.168.200.0/24 subnet-vlan
+-------------------+------------------------------------------------------------------+
| Field | Value |
+-------------------+------------------------------------------------------------------+
| allocation_pools | 192.168.200.100-192.168.200.200 |
| cidr | 192.168.200.0/24 |
| created_at | 2022-02-10T05:03:52Z |
| description | |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 192.168.200.1 |
| host_routes | |
| id | 69c14fff-de95-440a-bc8e-fe9f43e4b424 |
| ip_version | 4 |
| ipv6_address_mode | None |
| ipv6_ra_mode | None |
| location | cloud='', project.domain_id=, project.domain_name='000000',
project.id='1776912d52a7444d8b2d09eb86e8d1d9', project.name='admin', region_name='',
zone= |
| name | subnet-vlan |
| network_id | cccedc78-027d-40e9-afbd-708154923ca6 |
| prefix_length | None |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| revision_number | 0 |
| segment_id | None |
| service_types | |
| subnetpool_id | None |
| tags | |
| updated_at | 2022-02-10T05:03:52Z |
+-------------------+------------------------------------------------------------------+

(3)修改openstack平台(云主机则跳过)

因为当前环境为本地PC环境的VMWare Workstation软件启动的虚拟机,所以在此openstack平台启动云主机,需要对openstack平台配置文件进行修改,修改nova服务配置文件,设置参数“virt_type=qemu”。命令参数如下:

1
2
[root@compute ~]# crudini --set /etc/nova/nova.conf libvirt virt_type  qemu
[root@compute ~]# systemctl restart openstack-nova-compute

(4)启动云主机

使用“openstack server create”命令创建云主机,其命令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@controller ~]# openstack help server create
usage: openstack server create [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width ]
[--fit-width] [--print-empty] [--noindent]
[--prefix PREFIX]
(--image | --volume ) --flavor
[--security-group ]
[--key-name ]
[--property ]
[--file ]
[--user-data ]
[--availability-zone ]
[--block-device-mapping ]
[--nic ]
[--network ] [--port ]
[--hint ]
[--config-drive |True]
[--min ] [--max ] [--wait]

通过命令创建云主机,使用cirros镜像,flavor为2核vCPU、1G内存、10G硬盘,使用network-vlan网络。云主机名为“cirros-test”创建命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@controller ~]# openstack server create --image cirros-0.3.4 --flavor 1 --network network-vlan cirros-test
+-------------------------------------+-----------------------------------------------------+
| Field | Value |
+-------------------------------------+-----------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | |
| OS-EXT-SRV-ATTR:host | None |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None |
| OS-EXT-SRV-ATTR:instance_name | |
| OS-EXT-STS:power_state | NOSTATE |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | 77zZUHVY7Krg |
| config_drive | |
| created | 2022-02-10T05:05:59Z |
| flavor | centos (1) |
| hostId | |
| id | 7e424f14-eed1-44f5-a29a-0b64749cbc4d |
| image | cirros-0.3.4 (32a2513c-e5ba-438b-a5ee-63c35c03b284) |
| key_name | None |
| name | cirros-test |
| progress | 0 |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| properties | |
| security_groups | name='default' |
| status | BUILD |
| updated | 2022-02-10T05:05:59Z |
| user_id | e415c8bc53884e72a7993dffbcde2a1e |
| volumes_attached | |
+-------------------------------------+-----------------------------------------------------+

管理虚拟机

(1)查看虚拟机

使用“openstack server list”命令查看虚拟机列表信息,使用命令如下:

1
2
3
4
5
6
7
[root@controller ~]# openstack server list
+--------------------+-------------+--------+-----------------+--------------+--------+
| ID | Name | Status | Networks | Image | Flavor |
+--------------------+-------------+--------+-----------------+--------------+--------+
| 7e424f14-eed1-44f5 | cirros-test | ACTIVE | network-vlan= | cirros-0.3.4 | centos |
-a29a-0b64749cbc4d 192.168.200.132
+--------------------+-------------+--------+-----------------+--------------+--------+

使用命令可以查看虚拟机的具体信息,包括使用的安全组、flavor以及网络信息,通过命令“openstack server show”进行查看。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@controller ~]# openstack server show cirros-test
+-------------------------------------+----------------------------------------------------------+
| Field | Value |
+-------------------------------------+----------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | nova |
| OS-EXT-SRV-ATTR:host | compute |
| OS-EXT-SRV-ATTR:hypervisor_hostname | compute |
| OS-EXT-SRV-ATTR:instance_name | instance-00000001 |
| OS-EXT-STS:power_state | Running |
| OS-EXT-STS:task_state | None |
| OS-EXT-STS:vm_state | active |
| OS-SRV-USG:launched_at | 2022-02-10T05:06:13.000000 |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | network-vlan=192.168.200.132 |
| config_drive | |
| created | 2022-02-10T05:05:59Z |
| flavor | centos (1) |
| hostId | 736518b10ef6cb7486f2b93262900c0cabc8e7f84bba5a7a8347c7e0 |
| id | 7e424f14-eed1-44f5-a29a-0b64749cbc4d |
| image | cirros-0.3.4 (32a2513c-e5ba-438b-a5ee-63c35c03b284) |
| key_name | None |
| name | cirros-test |
| progress | 0 |
| project_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| properties | |
| security_groups | name='default' |
| status | ACTIVE |
| updated | 2022-02-10T05:06:13Z |
| user_id | e415c8bc53884e72a7993dffbcde2a1e |
| volumes_attached | |
+-------------------------------------+----------------------------------------------------------+

(2)操作虚拟机

可以通过命令操作虚拟机,对虚拟机进行关机、开机、重启等操作。关闭虚拟机操作,命令如下:

1
2
3
4
5
6
7
[root@controller ~]# openstack server stop cirros-test
+-------------------------+-------------+---------+-----------------+--------------+--------+
| ID | Name | Status | Networks | Image | Flavor |
+-------------------------+-------------+---------+-----------------+--------------+--------+
| 7e424f14-eed1-44f5-a29a | cirros-test | SHUTOFF | network-vlan= | cirros-0.3.4 | centos |
-0b64749cbc4d 192.168.200.132
+-------------------------+-------------+---------+-----------------+--------------+--------+

通过命令操作虚拟机,对虚拟机进行开机操作,命令如下:

1
2
3
4
5
6
7
8
[root@controller ~]# openstack server start cirros-test
[root@controller ~]# openstack server list
+-------------------------+-------------+--------+-----------------+--------------+--------+
| ID | Name | Status | Networks | Image | Flavor |
+-------------------------+-------------+--------+-----------------+--------------+--------+
| 7e424f14-eed1-44f5-a29a | cirros-test | ACTIVE | network-vlan= | cirros-0.3.4 | centos |
-0b64749cbc4d 192.168.200.132
+-------------------------+-------------+--------+-----------------+--------------+--------+

通过命令操作虚拟机,对虚拟机进行重启操作,命令如下:

1
2
3
4
5
6
7
8
[root@controller ~]# openstack server reboot cirros-test
[root@controller ~]# openstack server list
+-------------------------+-------------+--------+-----------------+--------------+--------+
| ID | Name | Status | Networks | Image | Flavor |
+-------------------------+-------------+--------+-----------------+--------------+--------+
| 7e424f14-eed1-44f5-a29a | cirros-test | ACTIVE | network-vlan= | cirros-0.3.4 | centos |
-0b64749cbc4d 192.168.200.132
+-------------------------+-------------+--------+-----------------+--------------+--------+

云主机调整类型大小

(1)修改配置文件

修改controller节点和compute节点nova.conf配置文件,添加调整类型大小的参数。

controller节点设置参数如下所示:

1
2
[root@controller ~]# crudini --set /etc/nova/nova.conf DEFAULT allow_resize_to_same_host True
[root@controller ~]# crudini --set /etc/nova/nova.conf DEFAULT scheduler_default_filters RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

修改完配置文件后重启相关服务。命令如下所示:

1
[root@controller ~]# systemctl restart openstack-nova*

compute节点设置参数如下所示:

1
2
[root@compute ~]# crudini --set /etc/nova/nova.conf DEFAULT allow_resize_to_same_host True
[root@compute ~]# crudini --set /etc/nova/nova.conf DEFAULT scheduler_default_filters RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

修改完配置文件后重启相关服务。命令如下所示:

1
[root@compute ~]# systemctl restart openstack-nova-compute

(2)创建云主机类型

现有云主机硬盘和内存不满足使用,需要对现有云主机进行资源扩容,将内存扩容至2G,硬盘扩容至15G大小,类型名称为“centos1”首先创建一个新的云主机类型满足扩容资源的需求。通过命令创建新云主机类型,命令如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@controller ~]#  openstack flavor create --disk 15 --ram 2048 --vcpus 2 centos1
+----------------------------+--------------------------------------+
| Field | Value |
+----------------------------+--------------------------------------+
| OS-FLV-DISABLED:disabled | False |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| disk | 15 |
| id | 182eac11-33b4-4153-8f8f-42e67c67e8bf |
| name | centos1 |
| os-flavor-access:is_public | True |
| properties | |
| ram | 2048 |
| rxtx_factor | 1.0 |
| swap | |
| vcpus | 2 |
+----------------------------+--------------------------------------+

查看当前云主机类型列表,命令如下:

1
2
3
4
5
6
7
[root@controller ~]# openstack flavor list
+--------------------------------------+---------+------+------+-----------+-------+-----------+
| ID | Name | RAM | Disk | Ephemeral | VCPUs | Is Public |
+--------------------------------------+---------+------+------+-----------+-------+-----------+
| 1 | centos | 1024 | 10 | 0 | 2 | True |
| 182eac11-33b4-4153-8f8f-42e67c67e8bf | centos1 | 2048 | 15 | 0 | 2 | True |
+--------------------------------------+---------+------+------+-----------+-------+-----------+

(3)调整云主机类型

查看云主机列表,通过命令查看云主机列表。命令如下:

1
2
3
4
5
6
7
[root@controller ~]# openstack server list
+-------------------------+-------------+--------+-----------------+--------------+--------+
| ID | Name | Status | Networks | Image | Flavor |
+-------------------------+-------------+--------+-----------------+--------------+--------+
| 7e424f14-eed1-44f5-a29a | cirros-test | ACTIVE | network-vlan= | cirros-0.3.4 | centos |
-0b64749cbc4d 192.168.200.132
+-------------------------+-------------+--------+-----------------+--------------+--------+

使用命令“openstack server resize”调整云主机类型,命令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@controller ~]# openstack help server resize  
usage: openstack server resize [-h] [--flavor | --confirm | --revert]
[--wait]
<server>

<server> Server (name or ID)

optional arguments:
-h, --help show this help message and exit
--flavor Resize server to specified flavor
--confirm Confirm server resize is complete
--revert Restore server state before resize
--wait Wait for resize to complete

使用命令调整云主机“cirros-test”类型为centos1,使用–wait参数,在命令执行后,调整云主机需要一定时间,添加–wait参数后会在确认时回馈“complete”。命令如下所示:

1
2
3
4
5
6
7
8
9
[root@controller ~]# openstack server resize --flavor centos1 --wait cirros-test
Complete
[root@controller ~]# openstack server list
+-------------------------+-------------+---------------+-----------------+--------------+---------+
| ID | Name | Status | Networks | Image | Flavor |
+-------------------------+-------------+---------------+-----------------+--------------+---------+
| 7e424f14-eed1-44f5-a29a | cirros-test | VERIFY_RESIZE | network-vlan= | cirros-0.3.4 | centos1 |
-0b64749cbc4d 192.168.200.132
+-------------------------+-------------+---------------+-----------------+--------------+---------+

在命令执行完毕后,返回“Complete”值时,通过命令查看云主机列表信息。命令如下:

1
2
3
4
5
6
7
[root@controller ~]# openstack server list
+-------------------------+-------------+--------+-----------------+--------------+---------+
| ID | Name | Status | Networks | Image | Flavor |
+-------------------------+-------------+--------+-----------------+--------------+---------+
| 7e424f14-eed1-44f5-a29a | cirros-test | ACTIVE | network-vlan= | cirros-0.3.4 | centos1 |
-0b64749cbc4d 192.168.200.132
+-------------------------+-------------+--------+-----------------+--------------+---------+

案例三:Cinder服务的基本使用

案例准备

规划节点

节点规划见表3。

表3 节点规划

IP 主机名 节点
172.128.11.13 controller 控制节点
172.128.11.19 compute 计算节点

基础准备

登录物理OpenStack平台,使用云主机搭建的OpenStack平台作为实验节点。

案例实施

Cinder概述

OpenStack早期版本是使用nova-volume为云平台提供持久性块存储服务器的。从Folsom版本后,就把作为Nova组成部分的nova-volume分离了出来,形成了独立的Cinder组件。Cinder本身并不直接提供块存储设备实际的管理和服务,而是在虚拟机和具体的存储设备之间引入一个抽象的“逻辑存储卷”。Cinder与Neutron类似也是通过Plugins-Agent的方式通过添加了不同厂家的DRIVE来整合多种厂家的后端存储设备,并通过提供统一的API接口的方式为云平台提供持久性的块设备存储服务,类似于Amazon的EBS(Elastic Block Storage)。Cinder服务的实现在OpenStack众多服务中,只依赖Keystone服务提供认证。可能有些人觉得Cinder提供的Volume作为云主机的云磁盘,因此Cinder与Nova也有依赖关系。其实,这是一种错误的映像,Cinder-Volume创建的“逻辑存储卷”不仅可以用于云主机的云磁盘,也可以用于其他场景,其创建卷的过程与Nova创建的云主机的状态并没有直接关联。或者换个角度来看,Nova创建的云主机也可以不用挂载Cinder创建的Volume而正常运行。


Cinder架构

在OpenStack中,块存储服务Cinder为Nova项目所实现的虚拟机实例提供了数据持久性的存储服务。此外,块存储还提供了Volumes管理的基础架构,同时还负责Volumes的快照和类型管理。从功能层面来看,Cinder以插件架构的形式为各种存储后端提供了统一API访问接口的抽象层实现,使得存储客户端可以通过统一的API访问不同的存储资源,而不用担心底层各式各样的存储驱动。Cinder提供的块存储通常以存储卷的形式挂载到虚拟机后才能使用,目前一个Volume同时只能挂载到一个虚拟机,但是不同的时刻可以挂载到不同的虚拟机,因此Cinder块存储与AWS的EBS不同,不能像EBS一样提供共享存储解决方案。除了挂载到虚拟机作为块存储使用外,用户还可以将系统镜像写入块存储并从加载有镜像的Volume启动系统(SAN BOOT)。

Cinder的逻辑架构如图3-1所示,除了cinder-client外,其余均是Cinder服务的核心组件,共有4个:cinder-api、cinder-scheduler、cinder-volume和cinder-backup。而cinder-client其实就是封装了Cinder提供的REST接口的CLI工具。

36

图3-1 cinder逻辑架构图

(1)cinder-api

对外提供REST API,对操作需求进行解析,对API进行路由并寻找相应的处理方法,包含卷的CRUD,快照的CRUD、备份、Volume Type的管理、卷的挂载/卸载等操作。Cinder API本质上其实是一个WSGI App,启动Cinder API服务相当于启动一个名为osapi_volume的WSGI服务去监听Client的HTTP请求。OpenStack定义了两种类型的Cinder资源,包括核心资源(Core Resoure)和扩展资源(Extension Resoure)。而核心资源及其API路由器分为V1及V2两个版本,分别放在V1和V2两个目录下,其中API路由器(目录中的router.py)负责把HTTP请求分发到其管理的核心资源中去;V1的核心资源则包括卷(Volume)、卷类型(Volume Type)、快照(Snapshot)的操作管理,比如创建和删除一个卷,或为某个卷做一个快照等;V2的核心资源增加了Qos、limit及备份的操作管理(H版本以后)。

(2)Cinder-scheduler

负责收集后端存储Backends上报的容量、能力信息。根据指定的算法完成卷到cinder-volume的映射。在Folsom版本中,cinder-scheduler服务只是实现了简单调度(Simple Scheduler)算法和随机调度(Chancer Scheduler)算法。简单调度算法就是获取活动的卷服务节点,按剩余容量从小到大排列,选择剩余容量最多的Host节点;随机调度算法就是在满足条件的节点中随机挑选出一个Host节点。在G版本后有了类似nova-scheduler的基于过滤和权重的新调度策略FilterScheduler。

(3)Cinder-volume

多节点部署,使用不同的配置文件、接入不同的backend设备,由各存储厂商插入driver代码与设备交互完成设备容量和能力信息收集、卷操作。每个存储节点都会运行一个cinder-volume服务,若干个这样的存储节点联合起来可以构成一个存储资源池。

(4)Cinder-backup

实现卷的数据备份到其他介质。目前支持的有以Ceph、Swift和IBM TSM(Tivoli Storage Manager)为后端存储的备份存储系统,其中默认的是采用Swift备份的存储系统。与Cinder-volume类似,Cinder-backup也通过Driver插件架构的形式与不同的存储备份后端交互。

(5)Cinder-db

提供存储卷、快照、备份、service等数据,支持Mysql、PG、MSSQL等SQL数据库。


块存储服务

(1)查看服务状态

使用“openstack volume service list”命令查询块存储服务状态,命令代码如下所示:

1
2
3
4
5
6
7
[root@controller ~]# openstack volume service list
+------------------+-------------+------+---------+-------+----------------------------+
| Binary | Host | Zone | Status | State | Updated At |
+------------------+-------------+------+---------+-------+----------------------------+
| cinder-volume | compute@lvm | nova | enabled | up | 2022-02-10T05:21:08.000000 |
| cinder-scheduler | controller | nova | enabled | up | 2022-02-10T05:21:06.000000 |
+------------------+-------------+------+---------+-------+----------------------------+

(2)创建块存储

通过使用命令“openstack volume create”创建块存储,命令格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@controller ~]# openstack help volume create 
usage: openstack volume create [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width ]
[--fit-width] [--print-empty] [--noindent]
[--prefix PREFIX] [--size ]
[--type ]
[--image | --snapshot | --source | --source-replicated ]
[--description ] [--user ]
[--project ]
[--availability-zone ]
[--consistency-group consistency-group>]
[--property ] [--hint ]
[--multi-attach] [--bootable | --non-bootable]
[--read-only | --read-write]

通过命令创建块存储,大小为2G,名称为“volume”。命令如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@controller ~]# openstack volume create --size 2 volume
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2022-02-10T05:21:32.000000 |
| description | None |
| encrypted | False |
| id | 67634904-65eb-471f-9ab6-79296e2494b7 |
| migration_status | None |
| multiattach | False |
| name | volume |
| properties | |
| replication_status | None |
| size | 2 |
| snapshot_id | None |
| source_volid | None |
| status | creating |
| type | None |
| updated_at | None |
| user_id | e415c8bc53884e72a7993dffbcde2a1e |
+---------------------+--------------------------------------+

(3)查看块存储

使用“openstack volume list”命令查看块存储列表信息。命令如下:

1
2
3
4
5
6
[root@controller ~]# openstack volume list
+--------------------------------------+--------+-----------+------+-------------+
| ID | Name | Status | Size | Attached to |
+--------------------------------------+--------+-----------+------+-------------+
| 67634904-65eb-471f-9ab6-79296e2494b7 | volume | available | 2 | |
+--------------------------------------+--------+-----------+------+-------------+

通过openstack命令查看某一块存储的详细信息。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@controller ~]# openstack volume show volume
+--------------------------------+--------------------------------------+
| Field | Value |
+--------------------------------+--------------------------------------+
| attachments | [] |
| availability_zone | nova |
| bootable | false |
| consistencygroup_id | None |
| created_at | 2022-02-10T05:21:32.000000 |
| description | None |
| encrypted | False |
| id | 67634904-65eb-471f-9ab6-79296e2494b7 |
| migration_status | None |
| multiattach | False |
| name | volume |
| os-vol-host-attr:host | compute@lvm#LVM |
| os-vol-mig-status-attr:migstat | None |
| os-vol-mig-status-attr:name_id | None |
| os-vol-tenant-attr:tenant_id | 1776912d52a7444d8b2d09eb86e8d1d9 |
| properties | |
| replication_status | None |
| size | 2 |
| snapshot_id | None |
| source_volid | None |
| status | available |
| type | None |
| updated_at | 2022-02-10T05:21:33.000000 |
| user_id | e415c8bc53884e72a7993dffbcde2a1e |
+--------------------------------+--------------------------------------+

(4)挂载云硬盘

块存储设备创建成功后,可以在OpenStack上将该设备挂载至云主机上,可以作为一块云硬盘来进行使用。给云主机添加一块磁盘。

将块存储挂载至云主机的命令为“openstack server add volume”,其命令格式为:

1
2
3
4
5
6
7
8
[root@controller ~]# openstack help server add volume
usage: openstack server add volume [-h] [--device ]

Add volume to server

positional arguments:
Server (name or ID)
Volume to add (name or ID)

使用命令将创建的“volume”块存储添加至云主机“cirros-test”上。命令如下:

1
[root@controller ~]# openstack server add volume cirros-test volume

使用命令查看块存储的列表信息,命令代码如下所示:

1
2
3
4
5
6
7
[root@controller ~]# openstack volume list
+-------------------------+--------+--------+------+--------------------------------------+
| ID | Name | Status | Size | Attached to |
+-------------------------+--------+--------+------+--------------------------------------+
| 67634904-65eb-471f-9ab6 | volume | in-use | 2 | Attached to cirros-test on /dev/vdb |
-79296e2494b7
+-------------------------+--------+--------+------+--------------------------------------+

扩展卷

(1)扩展卷大小

创建完卷后可能因为需求的变更,需要对已有的卷进行扩容操作,这时需要用到“openstack volume set”命令修改卷的信息。命令格式如下:

1
2
3
4
5
6
7
8
9
10
[root@controller ~]# openstack  help  volume set
usage: openstack volume set [-h] [--name ] [--size ]
[--description ] [--no-property]
[--property ]
[--image-property ] [--state ]
[--type ]
[--retype-policy ]
[--bootable | --non-bootable]
[--read-only | --read-write]

通过命令将 “volume” 卷大小从2G扩容至3G,使用–size参数可修改已创建好的卷大小。命令操作如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@controller ~]# openstack volume list
+-------------------------+--------+--------+------+--------------------------------------+
| ID | Name | Status | Size | Attached to |
+-------------------------+--------+--------+------+--------------------------------------+
| 67634904-65eb-471f-9ab6 | volume | in-use | 2 | Attached to cirros-test on /dev/vdb |
-79296e2494b7
+-------------------------+--------+--------+------+--------------------------------------+
[root@controller ~]# openstack volume set --size 3 volume
[root@controller ~]# openstack volume list
+--------------------------------------+--------+-----------+------+-------------+
| ID | Name | Status | Size | Attached to |
+--------------------------------------+--------+-----------+------+-------------+
| 67634904-65eb-471f-9ab6-79296e2494b7 | volume | available | 3 | |
+--------------------------------------+--------+-----------+------+-------------+

(2)验证卷大小

将扩容后的卷“volume”挂载至云主机“cirros-test”上,操作命令如下所示:

1
2
3
4
5
6
7
[root@controller ~]# openstack server add volume centos_server volume
[root@controller ~]# openstack volume list
+--------------------------------------+--------+----------+------+-------------+
| ID | Name | Status | Size | Attached to |
+--------------------------------------+--------+----------+------+-------------+
| 67634904-65eb-471f-9ab6-79296e2494b7 | volume | reserved | 3 | |
+--------------------------------------+--------+----------+------+-------------+

可以看到卷“volume”挂载至云主机“cirros-test”上盘符的名称为/dev/vdb,使用dashboard的控制台界面,输入命令“lsblk”查看云硬盘大小是否为3G。命令操作如下所示:

1
2
3
4
5
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 15G 0 disk
├─vda1 252:1 0 15G 0 part /
vdb 252:16 0 3G 0 disk

可以看到显示盘符“vdb”大小为3G。此时云硬盘已经扩展完成。

案例四:Swift服务的基本使用

案例准备

规划节点

节点规划见表4。

表4 节点规划

IP 主机名 节点
172.128.11.13 controller 控制节点
172.128.11.19 compute 计算节点

基础准备

登录物理OpenStack平台,使用云主机搭建的OpenStack平台作为实验节点。

案例实施

Swift概述

Swift 最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一,为其Nova子项目提供虚机镜像存储服务。Swift构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。Swift在OpenStack系统中不依赖于任何服务,可以独立部署为其他系统提供分布式对象存储服务。而在OpenStack的应用中,其Proxy Server往往由Keystone节点兼任,由Keystone来完成服务访问的安全认证。

Swift是业务提供时,使用普通的服务器来构建冗余的、可扩展的分布式对象存储集群,存储容量可达PB级。通过统一REST API进行友好访问,不仅易于扩展,且无中心数据库,避免单点故障或单点性能瓶颈。Swift主要通过Account、Container和Object三个表单结构来完成存储对象的存储、查询、获取和上传等功能,通过数据存储的多副本机制实现数据的高可用。


Swift的架构和组件

Swift的架构是一种完全对称、面向资源的分布式系统架构,所有组件都可扩展,避免因单点失效而影响整个系统运转。通信方式采用非阻塞式 I/O 模式,提高了系统吞吐和响应能力,如下图所示。系统架构整体上采用分层的理念设计,共分为两层:访问层和存储层。Controller的Ring以上部分属于访问层,接收外部REST API的访问,实现负载均衡和访问安全验证,并定位对象数据的存储的位置。后端的Server部分属于存储层,用来分别存储不同的对象数据:Account、Container和Object。


Swift中的数据结构原理

Swift中最重要的算法就是一致性哈希(Consistent Hashing),它是Swift实现海量数据存储,并能实现数据均衡度和可扩展性兼容的保证,可以不过分的认为一致性哈希算法是所有分布式存储的灵魂,不仅Swift中有它的影子,在开源分布式存储Ceph以及华为分布式存储FusionStorage中同样有它的影子。在面对海量级别的对象,需要存放在成千上万台服务器和硬盘设备上,首先要解决寻址问题,即如何将对象均匀地分布到这些设备地址上。这也是Swift中的一致性哈希首先要解决的问题,算法的基本思路是:通过计算可将对象均匀分布到虚拟空间的虚拟节点上,在增加或删除节点时可大大减少需移动的数据量;虚拟空间大小通常采用2的n次幂,便于进行高效的移位操作;然后通过独特的数据结构 Ring(环)再将虚拟节点映射到实际的物理存储设备上,完成寻址过程。


对象存储服务

(1)查看服务状态

在openstack平台中使用命令“swift stat”查看对象存储服务状态,执行命令如下所示:

1
2
3
4
5
6
7
8
9
10
[root@controller ~]# swift stat
Account: AUTH_563a1bd3cee84608913f046e5a39fffd
Containers: 0
Objects: 0
Bytes: 0
X-Put-Timestamp: 1612342537.62212
X-Timestamp: 1612342537.62212
X-Trans-Id: tx308afd55a7dd4527bebee-00601a64f6
Content-Type: text/plain; charset=utf-8
X-Openstack-Request-Id: tx308afd55a7dd4527bebee-00601a64f6

(2)创建容器

通过“openstack container create”命令创建容器,命令格式如下所示:

1
2
3
4
5
6
7
[root@controller ~]# openstack  help container create 
usage: openstack container create [-h] [-f {csv,json,table,value,yaml}]
[-c COLUMN] [--max-width ]
[--fit-width] [--print-empty] [--noindent]
[--quote {all,minimal,none,nonnumeric}]
[--sort-column SORT_COLUMN]
[ ...]

使用命令创建容器,名称为“swift-test”,操作命令如下:

1
2
3
4
5
6
[root@controller ~]# openstack  container create  swift-test
+---------------------------------------+------------+------------------------------------+
| account | container | x-trans-id |
+---------------------------------------+------------+------------------------------------+
| AUTH_13b5e35202d54a84ae7a5ae5c57b9846 | swift-test | tx14edab5036414bfab0e64-006204b5ef |
+---------------------------------------+------------+------------------------------------+

(3)查看容器

使用命令查询容器列表信息,命令如下所示:

1
2
3
4
5
6
[root@controller ~]# openstack container list 
+------------+
| Name |
+------------+
| swift-test |
+------------+

使用命令查询容器详细信息,命令如下所示:

1
2
3
4
5
6
7
8
9
[root@controller ~]# openstack container show swift-test
+--------------+---------------------------------------+
| Field | Value |
+--------------+---------------------------------------+
| account | AUTH_13b5e35202d54a84ae7a5ae5c57b9846 |
| bytes_used | 0 |
| container | swift-test |
| object_count | 0 |
+--------------+---------------------------------------+

(4)创建对象

创建完容器后,可以创建对象,通过使用命令“openstack object create”在对象中创建对象。命令格式如下所示:

1
2
3
4
5
6
7
[root@controller ~]# openstack help object create
usage: openstack object create [-h] [-f {csv,json,table,value,yaml}]
[-c COLUMN] [--max-width ]
[--fit-width] [--print-empty] [--noindent]
[--quote {all,minimal,none,nonnumeric}]
[--sort-column SORT_COLUMN] [--name ]
[ ...]

在使用命令创建对象前,需要将上传后的目录结构在本地创建。在本地创建名为“test”的目录“/root/test”,将/root/anaconda-ks.cfg文件复制至“/root/test”目录中。命令代码如下所示:

1
2
[root@controller ~]# mkdir test
[root@controller ~]# cp anaconda-ks.cfg test/

创建对象的过程也是向容器中上传文件,使用命令创建“test/anaconda-ks.cfg”和“anaconda-ks.cfg”对象。操作命令如下所示:

1
2
3
4
5
6
[root@controller ~]# openstack object create swift-test test/anaconda-ks.cfg 
+----------------------+------------+----------------------------------+
| object | container | etag |
+----------------------+------------+----------------------------------+
| test/anaconda-ks.cfg | swift-test | 41656296ae6768ae924a5b5f3fe15bf0 |
+----------------------+------------+----------------------------------+

(5)查看对象

创建完对象后,通过命令查看容器中对象信息,使用命令“openstack object list”查看对象信息,命令格式如下所示:

1
2
3
4
5
6
7
8
9
10
[root@controller ~]# openstack  help object list 
usage: openstack object list [-h] [-f {csv,json,table,value,yaml}] [-c COLUMN]
[--max-width ] [--fit-width]
[--print-empty] [--noindent]
[--quote {all,minimal,none,nonnumeric}]
[--sort-column SORT_COLUMN] [--prefix ]
[--delimiter ] [--marker ]
[--end-marker ]
[--limit ] [--long] [--all]

使用命令查看容器“swift-test”中所有对象信息,操作命令如下:

1
2
3
4
5
6
[root@controller ~]# openstack object list swift-test
+----------------------+
| Name |
+----------------------+
| test/anaconda-ks.cfg |
+----------------------+

通过查询命令可以看出,在通过命令上传对象时,本地路径即为容器内对象路径。使用命令“openstack object show”查询“swift-test”容器中“test/anaconda-ks.cfg”对象详细信息,命令如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
[root@controller opt]# openstack object show swift-test test/anaconda-ks.cfg
+----------------+---------------------------------------+
| Field | Value |
+----------------+---------------------------------------+
| account | AUTH_13b5e35202d54a84ae7a5ae5c57b9846 |
| container | swift-test |
| content-length | 6880 |
| content-type | application/octet-stream |
| etag | 41656296ae6768ae924a5b5f3fe15bf0 |
| last-modified | Thu, 10 Feb 2022 06:54:30 GMT |
| object | test/anaconda-ks.cfg |
+----------------+---------------------------------------+

(6)下载对象

存储在容器中的对象,可以在需要使用时,通过“openstack object save”命令进行下载至本地,命令格式如下所示:

1
2
3
4
[root@controller ~]# openstack help object save 
usage: openstack object save [-h] [--file ]

Save object locally

使用命令将“swift-test”容器中“test/anaconda-ks.cfg”对象下载至本地/opt/目录下。操作命令如下所示:

1
2
3
4
[root@controller ~]# cd /opt/
[root@controller opt]# openstack object save swift-test test/anaconda-ks.cfg
[root@controller opt]# ls test/
anaconda-ks.cfg

(7)删除对象

使用“openstack object delete”命令删除容器内的对象,命令格式如下所示:

1
2
[root@controller opt]# openstack help object delete
usage: openstack object delete [-h] [ ...]

使用删除对象命令将“swift-test”容器内“test/anaconda-ks.cfg”删除,查看“swift-test”容器中对象列表信息。操作命令如下所示:

1
2
3
4
5
6
7
[root@controller opt]# openstack object delete swift-test test/anaconda-ks.cfg
[root@controller opt]# openstack object list swift-test
+-----------------+
| Name |
+-----------------+
| anaconda-ks.cfg |
+-----------------+

(8)删除容器

使用“openstack container delete”命令删除容器,命令格式如下所示:

1
2
3
[root@controller opt]# openstack help container delete
usage: openstack container delete [-h] [--recursive]
[ ...]

使用删除容器命令将“swift-test”容器删除,因为容器内存有对象,所以无法直接删除。

1
2
[root@controller opt]# openstack container delete swift-test
Conflict (HTTP 409) (Request-ID: tx8c3de39f832f49ac9d655-00601bba0a)

需要添加“–recursive”参数将容器内部对象一起删除,才可以删除“swift-test”容器,查看容器列表信息。操作命令如下:

1
2
[root@controller opt]# openstack container delete --recursive swift-test 
[root@controller opt]# openstack container list

分片存储案例

(1)创建容器

使用命令创建一个容器test并查看容器的状态信息,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@controller ~]# swift post test
[root@controller ~]# swift stat test
Account: AUTH_13b5e35202d54a84ae7a5ae5c57b9846
Container: test
Objects: 0
Bytes: 0
Read ACL:
Write ACL:
Sync To:
Sync Key:
Accept-Ranges: bytes
X-Storage-Policy: Policy-0
Last-Modified: Thu, 10 Feb 2022 07:00:01 GMT
X-Timestamp: 1644476400.54127
X-Trans-Id: tx1523620b734d425fb7249-006204b7f7
Content-Type: application/json; charset=utf-8
X-Openstack-Request-Id: tx1523620b734d425fb7249-006204b7f7

(2)上传镜像并分片存储

将提供的cirros-0.3.4-x86_64-disk.img镜像上传至controller节点的/root目录下,并使用命令上传至test容器中,进行分片存储,每个片段的大小为10M,命令如下:

1
2
3
4
[root@controller ~]# ll
total 8088152
-rw-------. 1 root root 1741 Oct 20 16:11 anaconda-ks.cfg
-rw-r--r--. 1 root root 13287936 Oct 21 14:23 cirros-0.3.4-x86_64-disk.img

上传镜像至容器并进行分片:

1
2
3
4
[root@controller ~]# swift upload test -S 10000000 cirros-0.3.4-x86_64-disk.img
cirros-0.3.4-x86_64-disk.img segment 0
cirros-0.3.4-x86_64-disk.img segment 1
cirros-0.3.4-x86_64-disk.img

查看cirros镜像的存储路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@controller ~]#  swift stat test cirros-0.3.4-x86_64-disk.img 
Account: AUTH_13b5e35202d54a84ae7a5ae5c57b9846
Container: test
Object: cirros-0.3.4-x86_64-disk.img
Content Type: application/octet-stream
Content Length: 13267968
Last Modified: Thu, 10 Feb 2022 07:01:25 GMT
ETag: "fedf8be64303d80840c0c67304617bb2"
Manifest: test_segments/cirros-0.3.4-x86_64-disk.img/1644463107.000000/13267968/10000000/
Meta Mtime: 1644463107.000000
Accept-Ranges: bytes
X-Timestamp: 1644476484.47485
X-Trans-Id: tx80ea2f784bd046f1813c7-006204b85a
X-Openstack-Request-Id: tx80ea2f784bd046f1813c7-006204b85a

查看存储路径中的数据片:

1
2
3
[root@controller ~]# swift list test_segments
cirros-0.3.4-x86_64-disk.img/1644463107.000000/13267968/10000000/00000000
cirros-0.3.4-x86_64-disk.img/1644463107.000000/13267968/10000000/00000001

可以看到,cirros镜像在上传至swfit对象存储中被分片存储了,单个存储片的大小为10M,因为该镜像大小为16M左右,所有分成了两个存储片。