创建和管理服务与服务用户

服务目录

OpenStack 服务可以在注册到 keystone 的服务目录中时被发现。服务目录可以作为静态文件模板或动态数据库表进行管理。

基于文件的服务目录 (templated.Catalog)

模板化目录是一个从只读 template_file 初始化并在内存中的后端。仅当您知道您的服务目录不会随时间发生太大变化时,才选择此选项。

注意

尝试针对此驱动程序更改您的服务目录将导致 HTTP 501 Not Implemented 错误。这是预期行为。如果您想使用这些命令,则必须改用基于 SQL 的服务目录驱动程序。

keystone.conf 示例

[catalog]
driver = templated
template_file = /opt/stack/keystone/etc/default_catalog.templates

template_file 的值预计是您的服务目录配置的绝对路径。keystone 中包含一个示例 template_file,但是您应该创建自己的文件以反映您的部署。

基于 SQL 的服务目录 (sql.Catalog)

完全支持持久化配置的动态数据库支持的驱动程序。

keystone.conf 示例

[catalog]
driver = sql

注意

对于基于 sql 的目录,不需要定义 template_file

要使用此驱动程序构建您的服务目录,请参阅内置帮助

$ openstack --help
$ openstack service create --help
$ openstack endpoint create --help

创建服务

  1. 列出可用的服务

    $ openstack service list
    +----------------------------------+----------+------------+
    | ID                               | Name     | Type       |
    +----------------------------------+----------+------------+
    | 9816f1faaa7c4842b90fb4821cd09223 | cinder   | volume     |
    | 1250f64f31e34dcd9a93d35a075ddbe1 | cinderv2 | volumev2   |
    | da8cf9f8546b4a428c43d5e032fe4afc | ec2      | ec2        |
    | 5f105eeb55924b7290c8675ad7e294ae | glance   | image      |
    | dcaa566e912e4c0e900dc86804e3dde0 | keystone | identity   |
    | 4a715cfbc3664e9ebf388534ff2be76a | nova     | compute    |
    | 1aed4a6cf7274297ba4026cf5d5e96c5 | novav21  | computev21 |
    | bed063c790634c979778551f66c8ede9 | neutron  | network    |
    | 6feb2e0b98874d88bee221974770e372 |    s3    |    s3      |
    +----------------------------------+----------+------------+
    
  2. 要创建服务,请运行此命令

    $ openstack service create --name SERVICE_NAME --description SERVICE_DESCRIPTION SERVICE_TYPE
    
    参数是
    • service_name:新服务的唯一名称。

    • service_type:服务类型,例如 identitycomputenetworkimageobject-store 或任何其他服务标识符字符串。

    • service_description:服务的描述。

    例如,要创建类型为 object-storeswift 服务,请运行此命令

    $ openstack service create --name swift --description "object store service" object-store
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | object store service             |
    | enabled     | True                             |
    | id          | 84c23f4b942c44c38b9c42c5e517cd9a |
    | name        | swift                            |
    | type        | object-store                     |
    +-------------+----------------------------------+
    
  3. 要获取服务的详细信息,请运行此命令

    $ openstack service show SERVICE_TYPE|SERVICE_NAME|SERVICE_ID
    

    例如

    $ openstack service show object-store
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | object store service             |
    | enabled     | True                             |
    | id          | 84c23f4b942c44c38b9c42c5e517cd9a |
    | name        | swift                            |
    | type        | object-store                     |
    +-------------+----------------------------------+
    

创建端点

  1. 创建服务后,将其注册到端点

    $ openstack endpoint create nova public http://example.com/compute/v2.1
    +--------------+----------------------------------+
    | Field        | Value                            |
    +--------------+----------------------------------+
    | enabled      | True                             |
    | id           | c219aa779e90403eb4a78cf0aa7d38b1 |
    | interface    | public                           |
    | region       | None                             |
    | region_id    | None                             |
    | service_id   | 0f5da035b8e94629bf35e7ec1703a8eb |
    | service_name | nova                             |
    | service_type | compute                          |
    | url          | http://example.com/compute/v2.1  |
    +--------------+----------------------------------+
    

删除服务

要删除指定的服务,请指定其 ID。

$ openstack service delete SERVICE_TYPE|SERVICE_NAME|SERVICE_ID

例如

$ openstack service delete object-store

服务用户

为了能够通过身份服务对用户进行身份验证,您必须为每个 OpenStack 服务创建一个服务用户。例如,为计算、块存储和网络服务创建服务用户。

要使用服务用户配置 OpenStack 服务,请为所有服务创建一个项目,并为每个服务创建用户。将管理角色分配给每个服务用户和项目对。此角色使用户能够验证令牌并对其他用户请求进行身份验证和授权。

创建服务用户

  1. 为服务用户创建一个项目。通常,此项目命名为 service,但您可以选择任何名称

    $ openstack project create service --domain default
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | None                             |
    | domain_id   | e601210181f54843b51b3edff41d4980 |
    | enabled     | True                             |
    | id          | 3e9f3f5399624b2db548d7f871bd5322 |
    | is_domain   | False                            |
    | name        | service                          |
    | parent_id   | e601210181f54843b51b3edff41d4980 |
    +-------------+----------------------------------+
    
  2. 为您的部署创建相关服务的服务用户。例如

    $ openstack user create nova --password Sekr3tPass
    +---------------------+----------------------------------+
    | Field               | Value                            |
    +---------------------+----------------------------------+
    | domain_id           | default                          |
    | enabled             | True                             |
    | id                  | 95ec3e1d5dd747f5a512d261731d29c7 |
    | name                | nova                             |
    | options             | {}                               |
    | password_expires_at | None                             |
    +---------------------+----------------------------------+
    
  3. 将管理角色分配给用户-项目对。

    $ openstack role add --project service --user nova admin
    +-------+----------------------------------+
    | Field | Value                            |
    +-------+----------------------------------+
    | id    | 233109e756c1465292f31e7662b429b1 |
    | name  | admin                            |
    +-------+----------------------------------+
    

配置服务令牌

OpenStack 中的许多操作需要在用户代表的情况下在多个服务之间进行通信。例如,将用户的图像存储在对象存储服务中的图像服务。如果图像非常大,由于用户的令牌已过期,操作可能会失败。

在上述场景中,图像服务将附加用户的令牌和它自己的令牌(称为服务令牌),如下所示。

+----------------+
|      User      |
+-------+--------+
        | Access Image Data Request
        | X-AUTH-TOKEN: <end user token>
        |
+-------v---------+
|     Glance      |
+-------+---------+
        | Access Image Data Request
        | X-AUTH-TOKEN: <original end user token>
        | X-SERVICE-TOKEN: <glance service user token>
        |
+-------v---------+
|      Swift      |
+-----------------+

当服务从另一个服务接收到调用时,它会验证令牌是否对服务用户具有适当的角色。这在每个单独的服务配置中配置,在 [keystone_authtoken] 部分下。

如果服务令牌有效,即使用户的令牌已过期,操作也允许。

service_token_roles 选项是服务令牌必须包含的角色的列表才能是有效的服务令牌。在前面的步骤中,我们已将 admin 角色分配给服务用户,因此将选项设置为该角色并将 service_token_roles_required 设置为 true

[keystone_authtoken]
service_token_roles = admin
service_token_roles_required = true

有关服务令牌的更多信息,请参阅 keystonemiddleware 发行说明