为什么要使用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

  1. Image
    Service 的功能是管理
    Image,让用户能够发现、获取和保存 Image。

  2. OpenStack
    中,提供 Image Service 的是 Glance,其具体功能如下:

    • 提供 REST API 让用户能够查询和获取 image 的元数据和 image 本身
    • 支持多种方式存储 image,包括普通的文件系统、Swift、Amazon S3 等
    • 对 Instance 执行 Snapshot 创建新的 image

      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方式进行沟通)

认证完成之后:

  1. 发送一个请求(上传一个镜像)

问题:谁去接收?答:glance-api

  1. 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从数据库中将数据返回给我们

支持的镜像格式


glance支持以上格式,每一种格式都有其作用

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

略,(太low了,还用可视化,滑天下之大稽)

CLI 创建 image

①将 image 上传到控制节点的文件系统中,例如 /tmp/cirros-0.3.4-x86_64-disk.img
②设置环境变量
③执行 image 创建命令
④查看新的Image
⑤查询或者删除Image
(案例查看六)

API获取image列表信息

我们利用API,也就是类似于携带token向url发送GET请求,从而返回的json格式的image
操作:

  1. 首先我们要获取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                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  1. 设置环境变量

    export token=gAAAAABevqwZYnNSDis08XB6Ul3jnqAyGg_WyU5qzRI3_6M2yjPFHyWTAYSwGQ3NrqMqTpTUlWFLUSPKw-8wZkb8I5hqmDreshpd2kNUVWyXGZHW8D9V22laR4xl2p8FpFSEvDPiGuhsoU-vELXoaAy6goF-Ksq4dsNLSDcuJCVyKjlQ61SzuOE
  2. 使用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信息是一样的

当然也可以使用api去创建。

如何使用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

最后修改:2024 年 03 月 14 日
如果觉得我的文章对你有用,请随意赞赏