4-Openstack 镜像服务 Glance

熊 0 阅读 虚拟化

1. Glance服务简介

在Openstack中 , Glance主要提供镜像服务 , 虚拟机的创建需要Glance的支持。Glance有Glance-api和Glance-Registry两个重要服务 , 其中Glance-api主要接受云系统镜像的构建、删除和读取请求 , Glance-Registry主要进行云镜像系统的注册服务。

Glance不需要配置消息队列 , 但是Glance需要配置Keystone认证中心 , 在默认情况下 , Glance将上传的镜像存放在/var/lib/glance/images/目录下。

Glance支持多种镜像格式 , 包括raw、vhd、vhdx、vmdk、vdi、iso、qcow2、aki、ami等。

2. Glance服务架构

在Openstack中 , Glance服务架构如下图所示 :

openstack-glance-1

在以上架构中 , Glance api负责接收REST API的请求 , 类似nova-api , 并通过其他模块来完成镜像的查找、获取、上传以及删除等操作 , 该模块默认监听9292端口。Glance-Registry负责与MySQL数据库交互 , 监听9191端口 , 用于存储或者获取镜像的元数据 , 并提供元数据相关的REST接口。Glance-Registry的数据库中有两张表 , 一张是image表 , 保存了镜像的格式和大小等信息;另一张是image property表 , 保存了镜像的定制化信息。

这里需要注意Glance-Registry服务已经在Queens版本中已经被弃用了。

Image Store是一个存储的接口层 , glance通过该接口获取镜像。Image Store本身支持Amazon的S3、Openstack的Swift、Ceph、sheepdog、ClusterFS等多种分布式存储。需要注意的是 , Image Stoge主要是镜像保存与获取的接口 , 仅仅是一个接口层 , 具体的实现还需要外部存储支持。

3. Glance 服务功能

镜像服务就是用来管理镜像的 , 让用户能够发现、获取和保存镜像。在OpenStack中提供镜像服务的是Glance , 其主要功能如下 :

  • 查询和获取镜像的元数据和镜像本身

  • 注册和上传虚拟机镜像 , 包括镜像的创建、上传、下载和管理

  • 维护镜像信息 , 包括元数据和镜像本身

  • 支持多种方式存储镜像 , 包括普通的文件系统、Swift、Amazon S3等

  • 对虚拟机实例执行创建快照命令来创建新的镜像 , 或者备份虚拟机的状态

image API的版本

Glance提供的RESTful API目前只有两个版本 : API v1和API v2。

  • v1只提供基本的镜像和成员操作功能 , 包括镜像创建、删除、下载、列表、详细信息查询、更新 , 以及镜像租户成员的创建、删除和列表。

  • v2除了支持v1的所有功能外 , 主要增加了镜像位置的添加、删除、修改、元数据和名称空间操作 , 以及镜像标记操作。

两个版本对镜像存储支持相同 , v1从N版开始已经过时 , 迁移路径使用v2进行替代

4. 镜像格式

虚拟机镜像文件磁盘格式

raw  #无结构的磁盘格式  
vhd  #改格式通用于VMware、Xen、VirtualBox以及其他虚拟机管理程序  
vhdx  #vhd格式的增强版本 , 支持更大的磁盘尺寸  
vmdx  #一种比较通用的虚拟机磁盘格式  
vdl  #由VirtualBox虚拟机监控程序和QEMU仿真器支持的磁盘格式  
iso  #用于光盘 ( CD-ROM ) 数据内容的档案格式  
ploop  #由Virtualzzo支持 , 用于运行OS容器的磁盘格式  
qcow2  #由QEMU仿真支持 , 可动态扩展 , 支持写时复制 ( Copy on Write ) 的磁盘格式  
aki  #在Glance中存储的Amazon内核格式  
ari  #在Glance中存储的Amazon虚拟内存盘 ( Ramdisk ) 格式  
ami  #在Glance中存储的Amazon机器格式

虚拟机镜像文件容器格式

bare  #没有容器或元数据“信封”的镜像  
ovf  #开放虚拟化格式  
ova  #在Glance中存储的开放虚拟化设备格式  
aki  #在Glance中存储的Amazon内核格式  
ari  #在Glance中存储的Amazon虚拟内存盘 ( Ramdisk ) 格式  
Docker  #在Glance中存储的容器文件系统的Docker的tar档案

如果不能确定选择哪种容器格式 , 那么简单地容器格式指定为bare是最安全地。

5.镜像状态

镜像从上传到识别的过程 :

queued  #初始化过程 , 镜像文件刚被创建 , 在Glance数据库只有其元数据 , 镜像数据还没有上传至数据库中。 
saving  #导入数据库过程 , 是镜像地原始数据在上传到数据库中地一种过渡状态 , 表示正在上传镜像。  
uploading  #提交给服务识别过程 , 指示已进行导入数据提交调用 , 此状态下不允许调用PUT/file ( saving状态会执行PUT/file , 这是另外一种上传的方法 ) 。  
importing  #准使用状态 , 指示已经完成导入调用 , 但是镜像还未准备好使用。 

镜像上载完成后的状态

active  #表示可使用  
deactivated  #表示只对管理员开放的权限  
killed  #表示镜像上传中发生错误  
deleted  #镜像将在不久后自动删除 , 镜像不可用 ( 保留数据 )   
pending_delete  #与deleted类似 , 但是删除后无法恢复

访问权限

Public ( 公共的 )   #可以被所有的项目使用  
Private ( 私有的 )  #只有被镜像所有者所在的项目使用  
Shared ( 共享的 )   #一个非共有的镜像可以共享给其他项目 , 这是通过项目成员 ( member-* ) 操作来实现的  
Protected ( 受保护的 )   #这种镜像不能被删除

6. 工作流程解析

openstack-glance-2

红色方框是对客户端的请求进行认证和授权的服务流程 : openstack的操作都需要经过keystone进行身份认证 , 并授权 , glance也不例外 , 授权成功再去请求glance服务 , glance服务接收到外部请求后 , 会去keystone进行认证 , 此请求是否已授权 , 认证通过后 , 才会将请求传到后端。

  • Auth(授权) : 用来控制镜像的访问权限 , 决定镜像信息是否可以修改。

黄色方框的glance domain controller 是主用的中间件 , 相当于调度器 , 作用是将glance 内部服务的操作分发到下面的各个功能层。

  • 1 ) Policy ( 规则定义 ) : 定义镜像操作的访问规则。

  • 2 ) Quota ( 配额限制 ) : 管理员对用户定义了镜像大小的镜像上传上限。

  • 3 ) Location ( 定位 ) : 通过glance_store与后台进行交互 , 在该层新位置添加进行时检查位置URI是否正确 , 防止镜像位置重复。

蓝色方框里镜像的元数据是通过glance-registry存放在数据库中。镜像本身 ( chunk 块数据 ) 是通过glance的存储驱动存储在后端的各种存储系统中。

  • 1 ) Registry Layer ( 注册层 ) : 通过使用单独的服务控制Glance Controller与Glance DB之间的安全交互。

  • 2 ) Glance DB : 存储镜像的元数据信息。

  • 3 ) Glance Store : 用来处理Glance和各种存储后端的交互 , 提供了一个统一接口来访问后端的存储。

绿色方框是存储后端 ( store backend ) 将镜像本身的数据存放在后端存储系统。

  • DB ( 数据库 ) : 实现与数据库进行交互的API , 将镜像转换为响应的格式存储在数据库中。

7. 安装配置 Glance

7.1 准备环境

  1. 创建glance数据库和glance用户,并授权glance用户允许从任何主机连接以及对glance数据库有所有的权限

    在mysql服务器创建glance数据库并授权

    [root@node02 ~]# mysql -uroot -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 111
    Server version: 10.5.22-MariaDB MariaDB Server
    ​
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    ​
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    ​
    MariaDB [(none)]>  CREATE DATABASE glance;
    Query OK, 1 row affected (0.001 sec)
    ​
    MariaDB [(none)]> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%'  IDENTIFIED BY 'glance123';
    Query OK, 0 rows affected (0.009 sec)

    在别的主机上使用glance用户连接数据库,看看是否能够正常连接?

    [root@node01 ~]#  mysql -uglance -pglance123 -hnode02
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 113
    Server version: 10.5.22-MariaDB MariaDB Server
    ​
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    ​
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    ​
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | glance             |
    | information_schema |
    +--------------------+
    2 rows in set (0.003 sec)
    ​
  2. 导出admin用户的环境变量,创建glance用户并设置其密码为glance

    [root@node01 ~]# openstack user create --domain default --password-prompt glance
    User Password:
    Repeat User Password:
    +---------------------+----------------------------------+
    | Field               | Value                            |
    +---------------------+----------------------------------+
    | domain_id           | default                          |
    | enabled             | True                             |
    | id                  | d8c9809484274553a1fc6ec17e56375c |
    | name                | glance                           |
    | options             | {}                               |
    | password_expires_at | None                             |
    +---------------------+----------------------------------+
    ​
  3. 将glance用户授权为admin角色,并将其添加到service项目中

    [root@node01 ~]# openstack role add --project service --user glance admin
  4. 创建glance服务实体

    [root@node01 ~]# openstack service create --name glance \
      --description "OpenStack Image" image
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | OpenStack Image                  |
    | enabled     | True                             |
    | id          | 479e564368434f41b50c7d3ac1492dab |
    | name        | glance                           |
    | type        | image                            |
    +-------------+----------------------------------+
  5. 创建glance endport (服务端点,注册服务)

    公共端点

    [root@node01 ~]# openstack endpoint create --region RegionOne image public http://openstack-vip.net:9292
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | 035dae46d8664cb3bc260d068079ac7f |
    | interface    | public                           |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | 479e564368434f41b50c7d3ac1492dab |
    | service_name | glance                           |
    | service_type | image                            |
    | url          | http://openstack-vip.net:9292    |
    +--------------+----------------------------------+

    私有端点

    [root@node01 ~]# openstack endpoint create --region RegionOne image internal http://openstack-vip.net:9292
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | f4f985d57c3d4928bbeb3af81b2791dc |
    | interface    | internal                         |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | 479e564368434f41b50c7d3ac1492dab |
    | service_name | glance                           |
    | service_type | image                            |
    | url          | http://openstack-vip.net:9292    |
    +--------------+----------------------------------+

    管理端点

    [root@node01 ~]# openstack endpoint create --region RegionOne image admin http://openstack-vip.net:9292
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | bccb239fe00c4a49bcc147c1a56506b8 |
    | interface    | admin                            |
    | region       | RegionOne                        |
    | region_id    | RegionOne                        |
    | service_id   | 479e564368434f41b50c7d3ac1492dab |
    | service_name | glance                           |
    | service_type | image                            |
    | url          | http://openstack-vip.net:9292    |
    +--------------+----------------------------------+

7.2 安装配置组件

  1. 安装软件包

    [root@node01 ~]# dnf --enablerepo=crb  install openstack-glance -y

    这里需要注意,其中有一个包python3-pyxattr是官网提供的crb仓库中。默认这个仓库是关闭的。因此这里需要临时开启这个库才能进行下一步安装。

    直接安装有如下图所示报错

    image-20240916230245761
  2. 配置glance-api

    编辑/etc/glance/glance-api.conf文件,在[database]配置段配置连接glance数据的地址

    [database]
    # ...
    connection = mysql+pymysql://glance:glance123@openstack-vip.net/glance

    在[keystone_authtoken]配置段中配置认证相关信息

    www_authenticate_uri  = http://openstack-vip.net:5000
    auth_url = http://openstack-vip.net:5000
    memcached_servers = openstack-vip.net:11211
    auth_type = password
    project_domain_name = Default
    user_domain_name = Default
    project_name = service
    username = glance
    password = glance

    在[paste_deploy]配置段中添加flavor = keystone

    [paste_deploy]
    # ...
    flavor = keystone

    在[glance_store]配置段中配置本地文件系统存储和镜像文件的位置:

    [DEFAULT]
    # ...
    enabled_backends=fs:file
    
    [glance_store]
    # ...
    default_backend = fs
    
    [fs]
    filesystem_store_datadir = /var/lib/glance/images/

    在 [oslo_limit] 部分,配置对 Keystone 的访问, 这里的endpoint_id为创建Image服务API端点中类型为public的id

    [oslo_limit]
    auth_url = http://openstack-vip.net:5000
    auth_type = password
    user_domain_id = default
    username = glance
    system_scope = all
    password = glance
    endpoint_id = 035dae46d8664cb3bc260d068079ac7f 
    region_name = RegionOne

    确保 Glance 账户对系统级资源(如限制)具有读取权限:

    openstack role add --user glance --user-domain Default --system all reader

    在 [DEFAULT] 部分,可以可选地启用每个租户的配额:

    [DEFAULT]
    use_keystone_limits = True

    请注意,如果启用了这个选项,您必须已经按照上述描述创建了注册的限制。

  3. 初始化glance数据,生成相关表

    [root@node01 ~]# su -s /bin/sh -c "glance-manage db_sync" glance
  4. 准备policy.json配置文件

    [root@node01 ~]# cat /etc/glance/policy.json 
    {
        "context_is_admin":  "role:admin",
        "default": "role:admin",
    
        "add_image": "",
        "delete_image": "",
        "get_image": "",
        "get_images": "",
        "modify_image": "",
        "publicize_image": "role:admin",
        "copy_from": "",
    
        "download_image": "",
        "upload_image": "",
    
        "delete_image_location": "",
        "get_image_location": "",
        "set_image_location": "",
    
        "add_member": "",
        "delete_member": "",
        "get_member": "",
        "get_members": "",
        "modify_member": "",
    
        "manage_image_cache": "role:admin",
    
        "get_task": "role:admin",
        "get_tasks": "role:admin",
        "add_task": "role:admin",
        "modify_task": "role:admin",
    
        "deactivate": "",
        "reactivate": "",
    
        "get_metadef_namespace": "",
        "get_metadef_namespaces":"",
        "modify_metadef_namespace":"",
        "add_metadef_namespace":"",
    
        "get_metadef_object":"",
        "get_metadef_objects":"",
        "modify_metadef_object":"",
        "add_metadef_object":"",
    
        "list_metadef_resource_types":"",
        "get_metadef_resource_type":"",
        "add_metadef_resource_type_association":"",
    
        "get_metadef_property":"",
        "get_metadef_properties":"",
        "modify_metadef_property":"",
        "add_metadef_property":"",
    
        "get_metadef_tag":"",
        "get_metadef_tags":"",
        "modify_metadef_tag":"",
        "add_metadef_tag":"",
        "add_metadef_tags":""
    
    }
    [root@node01 ~]# chown root:glance /etc/glance/policy.json 

  5. 启动openstack-glance-api服务,并将其设置为开机启动。这里这个服务默认监听端口为9292

    [root@node01 ~]# systemctl enable openstack-glance-api.service
    [root@node01 ~]# systemctl start openstack-glance-api.service
  6. 修改haproxy高可用节点的haproxy配置。在原有的haproxy之后添加如下配置

    listen openstack_glance_port
        bind 192.168.71.250:9292
        mode tcp
        log global
        server 192.168.71.11 192.168.71.11:9292 check inter 3000 fall 3 rise 5
  7. 验证glance服务可以使用

    [root@node01 ~]# glance image-list   #结果为空为正常,出现其他结果则进行排错
    +----+------+
    | ID | Name |
    +----+------+
    +----+------+
    [root@node01 ~]# openstack image list #没有结果正常
    
    [root@node01 ~]# 

7.3 测试上传镜像

  1. 导入admin用户的环境变量

    [root@node01 ~]# . keystone_admin.rc 
  2. 下载对应的测试镜像

    [root@node01 ~]#  wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
  3. 将cirros上传至glance看看是否能够正常上传

    [root@node01 ~]# glance image-create --name "cirros"   --file cirros-0.4.0-x86_64-disk.img   --disk-format qcow2 --container-format bare   --visibility=public
    +------------------+----------------------------------------------------------------------------------+
    | Property         | Value                                                                            |
    +------------------+----------------------------------------------------------------------------------+
    | checksum         | 443b7623e27ecf03dc9e01ee93f67afe                                                 |
    | container_format | bare                                                                             |
    | created_at       | 2024-09-16T19:40:23Z                                                             |
    | disk_format      | qcow2                                                                            |
    | id               | dc037659-f15e-4a4f-9d20-bd6f8eb05109                                             |
    | min_disk         | 0                                                                                |
    | min_ram          | 0                                                                                |
    | name             | cirros                                                                           |
    | os_hash_algo     | sha512                                                                           |
    | os_hash_value    | 6513f21e44aa3da349f248188a44bc304a3653a04122d8fb4535423c8e1d14cd6a153f735bb0982e |
    |                  | 2161b5b5186106570c17a9e58b64dd39390617cd5a350f78                                 |
    | os_hidden        | False                                                                            |
    | owner            | 9b05bf0c98b24add999507856db2dac5                                                 |
    | protected        | False                                                                            |
    | size             | 12716032                                                                         |
    | status           | active                                                                           |
    | stores           | fs                                                                               |
    | tags             | []                                                                               |
    | updated_at       | 2024-09-16T19:40:24Z                                                             |
    | virtual_size     | 46137344                                                                         |
    | visibility       | public                                                                           |
    +------------------+----------------------------------------------------------------------------------+
    
    [root@node01 ~]# openstack image list
    +--------------------------------------+--------+--------+
    | ID                                   | Name   | Status |
    +--------------------------------------+--------+--------+
    | dc037659-f15e-4a4f-9d20-bd6f8eb05109 | cirros | active |
    +--------------------------------------+--------+--------+

    验证:查看glance的镜像仓库目录下是否有文件生成

    [root@node01 ~]# ll /var/lib/glance/images/
    total 12420
    -rw-r----- 1 glance glance 12716032 Sep 17 03:40 dc037659-f15e-4a4f-9d20-bd6f8eb05109


参考链接

玩转企业云计算平台系列 ( 四 ) : Openstack 镜像服务 Glance (qq.com)