为什么要使用Image
传统IT环境
在传统
IT 环境下,安装一个系统是要么从安装 CD 从头安装,要么用 Ghost 等克隆工具恢复。
产生的问题:
- 如果要安装的系统多了效率就很低
- 时间长,工作量大
- 安装完还要进行手工配置,比如安装其他的软件,设置 IP 等
云环境
- 云环境下需要更高效的解决方案,这就是
Image。 Image 是一个模板,里面包含了基本的操作系统和其他的软件。 - 举例来说,有家公司需要为每位员工配置一套办公用的系统,一般需要一个
Win7 系统再加 MS office 软件。 OpenStack 是这么玩的:
1.先手工安装好这么一个虚机
2.然后对虚机执行 snapshot(快照),这样就得到了一个 image
3.当有新员工入职需要办公环境时,立马启动一个或多个 该 image
的 instance(虚机)就可以了
在这个过程中,第 1 步跟传统方式类似,需要手工操作和一定时间。但第 2、3 步非常快,全自动化,一般都是秒级别。
而且 2、3 步可以循环做。 比如公司新上了一套 OA 系统,每个员工的 PC 上都得有客户端软件。 那么可以在某个员工的虚机中手工安装好 OA 客户端,然后执行 snapshot ,得到新的 image,以后就直接使用新 image 创建虚机就可以了。
另外,snapshot 还有备份的作用,能够非常方便的恢复系统。
理解Glance服务架构
理解Image Service
- Image
Service 的功能是管理
Image,让用户能够发现、获取和保存 Image。 在
OpenStack
中,提供 Image Service 的是 Glance,其具体功能如下:
主要组件就是glance-api,glance-registry
openstack image create...背后发生了什么
openstack image create "cirros" --file cirros-0.3.5-x86_64-disk.img --disk-format qcow2 --container-format bare --public
上面一条命令的背后发生了什么?
- 谁去操作?admin用户
- 对admin认证
- 返回一个token
- admin拿着这个token区访问service资源(镜像资源)
glance服务回去keystone那里认证,判断用户的token是否有效并进行鉴权
- 具体我们输入
cat /etc/glance/glance-api.conf | grep -Ev "^$|^#"
- 具体我们输入
可以看到:
[keystone_authtoken]
auth_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 = glance
password = 000000
这一段配置我们可以看到glance服务会用用glance用户去向keystone去认证
- keystone用户告诉glance服务,没有问题(restful api方式进行沟通)
认证完成之后:
- 发送一个请求(上传一个镜像)
问题:谁去接收?答:glance-api
- glance-api接收到这个请求之后,开始上传镜像
问题:上传到哪里?答:stotage_backend:file
[glance_store]
stores = file,http
default_store = file #采用文件的方式
filesystem_store_datadir = /var/lib/glance/images/ # 保存文件的地址
我们查看上传文件的目录中的文件信息:
[root@controller ~]# ll /var/lib/glance/images/ <注释1>
总用量 12960
-rw-r----- 1 glance glance 13267968 5月 15 15:18 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c
[root@controller ~]# openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c | cirros | active |
+--------------------------------------+--------+--------+
可以看到文件的id和我们的openstack的镜像ID是一致的,这样就验证了上传镜像就保存在这个文件目录中,当然也可以保存到其他的系统中比如S3等等。
问题:上传镜像后的相关元数据信息存在哪里?答:由glance-registry负责存入DB glance数据库中
剖析Glance结构
glance-api
- glance-api 是系统后台运行的服务进程。 对外提供 REST API,响应 image 查询、获取和存储的调用。
- glance-api 不会真正处理请求。 如果是与 image metadata(元数据)相关的操作,glance-api 会把请求转发给 glance-registry; 如果是与 image 自身存取相关的操作,glance-api 会把请求转发给该 image 的 store backend。
- 在控制节点上可以查看 glance-api 进程
我们可以总结出,组件与组件之间相互沟通,每个组件只处理关于自己相关的内容
[root@controller ~]# ps -elf | grep glance-*
4 R glance 4728 1 1 80 0 - 106687 - 15:08 ? 00:02:13 /usr/bin/python2 /usr/bin/glance-api
4 S glance 4729 1 0 80 0 - 95541 do_wai 15:08 ? 00:00:04 /usr/bin/python2 /usr/bin/glance-registry
1 S glance 4750 4728 0 80 0 - 106687 poll_s 15:08 ? 00:00:00 /usr/bin/python2 /usr/bin/glance-api
1 S glance 4751 4729 0 80 0 - 95541 poll_s 15:08 ? 00:00:00 /usr/bin/python2 /usr/bin/glance-registry
1 S glance 4752 4728 0 80 0 - 107583 poll_s 15:08 ? 00:00:02 /usr/bin/python2 /usr/bin/glance-api
1 S glance 4753 4729 0 80 0 - 95541 poll_s 15:08 ? 00:00:00 /usr/bin/python2 /usr/bin/glance-registry
0 S root 12488 1884 0 80 0 - 28206 pipe_w 18:11 pts/0 00:00:00 grep --color=auto glance-*
我们通过查找glance进程可以发现,glance有多个进程,之所以有多个,是因为防止用户请求过多时,来不及及时处理请求。所以使用多个进程提高效率。
glance-registry
- glance-registry
是系统后台运行的服务进程。
负责处理和
存取 image 的 metadata,例如 image 的大小和类型。
- 在控制节点上可以查看
glance-registry
进程
openstack image show cirros
可以查看镜像的元信息
+------------------+------------------------------------------------------+
| Field | Value |
+------------------+------------------------------------------------------+
| checksum | f8ab98ff5e73ebab884d80c9dc9c7290 |
| container_format | bare |
| created_at | 2020-05-15T07:18:29Z |
| disk_format | qcow2 |
| file | /v2/images/6d4ba40e-97eb-47b8-a855-4e0c114cdb2c/file |
| id | 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c |
| min_disk | 0 |
| min_ram | 0 |
| name | cirros |
| owner | 0c2f860c54b94c158aa945e1683bf644 |
| protected | False |
| schema | /v2/schemas/image |
| size | 13267968 |
| status | active |
| tags | |
| updated_at | 2020-05-15T07:18:30Z |
| virtual_size | None |
| visibility | public |
+------------------+------------------------------------------------------+
这个查看元信息的过程实际上就是发送请求给glance-api,然后由glance-api将我们的请求转发给glance-registry,然后registry从数据库中将数据返回给我们
支持的镜像格式
Database
Image 的 metadata 会保持到 database 中,默认是 MySQL。 在控制节点上可以查看 glance 的 database 信息:
- 登录数据库
查询glance数据库中的tables
[root@controller ~]# mysql -uroot -p000000 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 18 Server version: 10.1.20-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use glance; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [glance]> select * from images\G; <注释3> *************************** 1. row *************************** id: 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c name: cirros size: 13267968 status: active created_at: 2020-05-15 07:18:29 updated_at: 2020-05-15 07:18:30 deleted_at: NULL deleted: 0 disk_format: qcow2 container_format: bare checksum: f8ab98ff5e73ebab884d80c9dc9c7290 owner: 0c2f860c54b94c158aa945e1683bf644 min_disk: 0 min_ram: 0 protected: 0 virtual_size: NULL
row in set (0.00 sec)
我们从数据库中查找到的信息和之前查看镜像的元信息对比发现,是差不多的,也就证明了我们的元信息是从数据库中的表中读取出来的
Store backend
Glance 自己并不存储 image。 真正的 image 是存放在 backend 中的。 Glance 支持多种 backend,包括
A directory on a local file system(这是默认配置)
[root@controller ~]# ll /var/lib/glance/images/ <注释1> 总用量 12960 -rw-r----- 1 glance glance 13267968 5月 15 15:18 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c 真正镜像存放在这里
- GridFS
- Ceph RBD
- Amazon S3
- Sheepdog
- OpenStack Block Storage (Cinder)
- OpenStack Object Storage (Swift)
- VMware ESX
以上就是我们存放实际镜像使用的后端, 具体使用哪种 backend,是在 /etc/glance/glance-api.conf
中配置的:
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
查看目前已经存在的image
ll /var/lib/glance/images/
总用量 12960
-rw-r----- 1 glance glance 13267968 5月 15 15:18 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c
查看保存目录,每个 image 在目录下都对应有一个文件, 文件以 image 的 ID 命名。
openstack image list
+--------------------------------------+--------+--------+
| ID | Name | Status |
+--------------------------------------+--------+--------+
| 6d4ba40e-97eb-47b8-a855-4e0c114cdb2c | cirros | active |
+--------------------------------------+--------+--------+
创建Image
- OpenStack
为终端用户提供了
Web
UI(Horizon)和命令行 CLI 两种交换界面,两种方式我们都要会用: - Web UI 的功能没有 CLI 全,有些操作只提供了 CLI。 即便是都有的功能,CLI 可以使用的参数更多
- 一般来说,CLI 返回结果更快,操作起来更高效
- CLI 可放在脚本中进行批处理
- 有些耗时的操作 CLI 更合适,比如创建镜像(后面将涉及)
Web UI 创建Image
CLI 创建 image
①将 image 上传到控制节点的文件系统中,例如 /tmp/cirros-0.3.4-x86_64-disk.img
②设置环境变量
③执行 image 创建命令
④查看新的Image
⑤查询或者删除Image
(案例查看六)
API获取image列表信息
我们利用API,也就是类似于携带token向url发送GET请求,从而返回的json格式的image
操作:
- 首先我们要获取token
openstack token issue
[root@controller ~]# openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field | Value |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires | 2020-05-15T15:50:01+0000 |
| id | gAAAAABevqwZYnNSDis08XB6Ul3jnqAyGg_WyU5qzRI3_6M2yjPFHyWTAYSwGQ3NrqMqTpTUlWFLUSPKw-8wZkb8I5hqmDreshpd2kNUVWyXGZHW8D9V22laR4xl2p8FpFSEvDPiGuhsoU-vELXoaAy6goF-Ksq4dsNLSDcuJCVyKjlQ61SzuOE |
| project_id | 0c2f860c54b94c158aa945e1683bf644 |
| user_id | ea8e3d161fd04d09a0ea104417357cd3 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
设置环境变量
export token=gAAAAABevqwZYnNSDis08XB6Ul3jnqAyGg_WyU5qzRI3_6M2yjPFHyWTAYSwGQ3NrqMqTpTUlWFLUSPKw-8wZkb8I5hqmDreshpd2kNUVWyXGZHW8D9V22laR4xl2p8FpFSEvDPiGuhsoU-vELXoaAy6goF-Ksq4dsNLSDcuJCVyKjlQ61SzuOE
- 使用curl访问api
curl -i -X GET -H "X-Auth-Token: $token" -H "Content-Type: application/octet-stream"
`http://192.168.100.10:9292/v2/images`
返回json数据:
{"images": [
{"status": "active",
"name": "cirros",
"tags": [],
"container_format": "bare",
"created_at": "2020-05-15T07:18:29Z",
"size": 13267968,
"disk_format": "qcow2",
"updated_at": "2020-05-15T07:18:30Z",
"visibility": "public",
"self": "/v2/images/6d4ba40e-97eb-47b8-a855-4e0c114cdb2c",
"min_disk": 0, "protected": false,
"id": "6d4ba40e-97eb-47b8-a855-4e0c114cdb2c",
"file": "/v2/images/6d4ba40e-97eb-47b8-a855-4e0c114cdb2c/file",
"checksum": "f8ab98ff5e73ebab884d80c9dc9c7290",
"owner": "0c2f860c54b94c158aa945e1683bf644",
"virtual_size": null,
"min_ram": 0,
"schema": "/v2/schemas/image"}],
"schema": "/v2/schemas/images",
"first": "/v2/images"}
可以观察到json中的数据,和我们用命令行直接获取的image信息是一样的
如何使用Openstack CLI
- 执行命令之前,需要设置环境变量。
source admin-openrc
各个服务的命令都有增、删、改、查的操作
[root@controller ~]# openstack image openstack: 'image' is not an openstack command. See 'openstack --help'. Did you mean one of these? image add project image create image delete image list image remove project image save image set image show image unset usage list usage show
- 每个对象都有 ID(唯一标识)
- 可用 help 查看命令的用法
例如:我们在 openstack image create,中添加help将所有的选项都列举出来
[root@controller ~]# openstack help image create
usage: openstack image create [-h] [-f {json,shell,table,value,yaml}]
[-c COLUMN] [--max-width <integer>]
[--fit-width] [--print-empty] [--noindent]
[--prefix PREFIX] [--id <id>]
[--container-format <container-format>]
[--disk-format <disk-format>]
[--min-disk <disk-gb>] [--min-ram <ram-mb>]
[--file <file> | --volume <volume>] [--force]
[--protected | --unprotected]
[--public | --private | --community | --shared]
[--property <key=value>] [--tag <tag>]
[--project <project>]
[--project-domain <project-domain>]
<image-name>
Create/upload an image
positional arguments:
<image-name> New image name
optional arguments:
-h, --help show this help message and exit
--id <id> Image ID to reserve
--container-format <container-format>
Image container format. The supported options are:
ami, ari, aki, bare, docker, ova, ovf. The default
format is: bare
--disk-format <disk-format>
Image disk format. The supported options are: ami,
ari, aki, vhd, vmdk, raw, qcow2, vhdx, vdi, iso,
ploop. The default format is: raw
--min-disk <disk-gb> Minimum disk size needed to boot image, in gigabytes
--min-ram <ram-mb> Minimum RAM size needed to boot image, in megabytes
--file <file> Upload image from local file
--volume <volume> Create image from a volume
--force Force image creation if volume is in use (only
meaningful with --volume)
--protected Prevent image from being deleted
--unprotected Allow image to be deleted (default)
--public Image is accessible to the public
--private Image is inaccessible to the public (default)
--community Image is accessible to the community
--shared Image can be shared
--property <key=value>
Set a property on this image (repeat option to set
multiple properties)
--tag <tag> Set a tag on this image (repeat option to set multiple
tags)
--project <project> Set an alternate project on this image (name or ID)
--project-domain <project-domain>
Domain the project belongs to (name or ID). This can
be used in case collisions between project names
exist.
output formatters:
output formatter options
-f {json,shell,table,value,yaml}, --format {json,shell,table,value,yaml}
the output format, defaults to table
-c COLUMN, --column COLUMN
specify the column(s) to include, can be repeated
table formatter:
--max-width <integer>
Maximum display width, <1 to disable. You can also use
the CLIFF_MAX_TERM_WIDTH environment variable, but the
parameter takes precedence.
--fit-width Fit the table to the display width. Implied if --max-
width greater than 0. Set the environment variable
CLIFF_FIT_WIDTH=1 to always enable
--print-empty Print empty table if there is no data to show.
json formatter:
--noindent whether to disable indenting the JSON
shell formatter:
a format a UNIX shell can parse (variable="value")
--prefix PREFIX add a prefix to all variable names
注释
<注释1>
ls -l 和ll命令可以使用长格式显示文件内容,察看更详细的文件资料,
如:
文件属性 文件数 拥有者 所属的group 文件大小 建档日期 文件名
https://bbs.csdn.net/topics/392094781
<注释2>
ps:将某个进程显示出来,https://www.cnblogs.com/zjdxr-up/p/8405982.html
<注释3>
MySQL中\g和\G的作用:
\g的作用和MySQL中的分号”;"是一样;
\G的作用是讲查找到的内容结构旋转90度,变成纵向结构;
https://www.cnblogs.com/malinzhai/p/10716380.html
(浩哥永远滴神)
<注释4>
Linux export 命令用于设置或显示环境变量。
在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环境变量,供后续执行的程序使用。export 的效力仅限于该次登陆操作。
https://www.runoob.com/linux/linux-comm-export.html
此处评论已关闭