摘要:本文罗列了OpenStack Nova Ussuri版本的新增功能,并会对其中重要项进行详细分析。
1. 支持在Nova cells间进行cold migrate和resize操作
相关概念
nova cell V2:
为了降低数据库和消息队列的访问瓶颈引入了cell的概念。
下图是nova cell V2架构简图:
cold migrate & resize:
Resize和冷迁移的工作流程相同,区别只是Resize时必须保持新的Flavor配置大于旧的配置,而冷迁移则要求两者相同。
需求由来
首先看下之前版本的cold migrate和resize流程,下图基于Train版nova代码:
,--------. ,--------------. ,--------------. ,---------. ,----------------. ,----------------.
|nova_api| |nova_conductor| |nova_scheduler| |placement| |nova_compute_dst| |nova_compute_src|
`---+----' `------+-------' `------+-------' `----+----' `-------+--------' `-------+--------'
Migrate VM| | | | | |
----------> | | | | |
| | | | | |
| RPC cast: | | | | |
| resize_instance() | | | | |
| ---------------------> | | | |
| | | | | |
| | MigrationTask | ,--------------------!. | |
| | ------------------------> |RPC call: |_\ | |
| | | |select_destination() | | |
| | | `----------------------' | |
| | | | | |
| | <- - - - - - - - - - - - | | |
| | | | | |
| | | RPC cast: | | |
| | | prep_resize() | | |
| | ----------------------------------------------------------------------------> |
| | | | | |
| | | |Restful: | |
| | | |GET /allocations/{consumer}| |
| | | |<--------------------------- |
| | | | | |
| | | |Restful: | ,------------------------------------!.
| | | |PUT /allocations/{consumer}| |Set inventory for placement provider|_\
| | | |<--------------------------- `--------------------------------------'
| | | | | |
| | | | | RPC cast: |
| | | | | resize_instance |
| | | | | -------------------------->
| | | | | |
| | | | | RPC cast: |
| | | | | finish_resize() |
| | | | | <--------------------------
| | | | | |
confirm | | | | | |
----------> | | | | |
| | | | | |
| | | RPC cast: | | |
| | | confirm_resize()| | |
| ------------------------------------------------------------------------------------------------------------------------------->
| | | | | |
revert | | | | | |
----------> | | | | |
| | | | | |
| | RPC cast: | | |
| | revert_resize() | | |
| ---------------------------------------------------------------------------------------------------> |
| | | | | |
| | | | | RPC cast: |
| | | | | finish_revert_resize() |
| | | | | -------------------------->
,---+----. ,------+-------. ,------+-------. ,----+----. ,-------+--------. ,-------+--------.
|nova_api| |nova_conductor| |nova_scheduler| |placement| |nova_compute_dst| |nova_compute_src|
`--------' `--------------' `--------------' `---------' `----------------' `----------------'
主要分为5个阶段:
1、nova-conductor/nova-scheduler选择计算节点
nova-conductor通过select_destination访问nova-scheduler进行调度,选择一个合适的目的节点(resize操作与源节点相同)。
2、pre_resize阶段,预备迁移
会在目的主机进行相同节点是否支持迁移检查以及其他检查,并会向placement查询新节点是否满足分配,并占用Inventory。然后通知源节点执行resize_instance。
3、resize_instance阶段
这一阶段会关闭源节点网络、磁盘等设备,并通过scp(rsync可选)向远端节点拷贝磁盘数据,同节点执行cp指令。然后通知目标节点,resize结束。
4、结束迁移
目标节点收到finish_resize,开始配置网络、挂在卷并启动虚机。
5、确认迁移
这里给予用户一次反悔撤销的机会,若确认将会删除源节点虚机数据否则进行迁移回退。
U版本逻辑
上图中nova_compute_src(源计算节点)和nova_compute_dst(目标计算节点)间直接通过消息队列进行通信,而由于新引入了cell V2架构,放到跨cell场景时,双方无法通过消息队列进行通信,自然会失败,故只能在同cell内进行resize和cold migrate操作。U版本为了解决这一问题,在跨cell进行冷迁移或者resize时,会统一由API Cell的nova-conductor来指挥整个过程,不让src compute和dest compute节点通讯,且与nova-conductor都通过RPC call进行通信(当然,同cell内的虚拟机迁移仍然保持之前的逻辑)。新增逻辑的顺序图如下:
,--------. ,--------------. ,--------------. ,---------. ,----------------. ,----------------.
|nova_api| |nova_conductor| |nova_scheduler| |placement| |nova_compute_dst| |nova_compute_src|
`---+----' `------+-------' `------+-------' `----+----' `-------+--------' `-------+--------'
Migrate VM| | | | | |
----------> | | | | |
| | | | | |
| RPC cast: | | | | |
| migrate_server() | | | | |
| -------------------------------> | | | |
| | | | | |
| | MigrationTask | ,--------------------!. | |
| | ---------------------------------------------> |RPC call: |_\ | |
| | | |select_destination() | | |
| | | `----------------------' | |
| | | | | |
| | <- - - - - - - - - - - - - - - - - - - - - - - | | |
| | | | | |
| | | | | |
| | | ========================== | |
=================================================================================================== CrossCellMigrationTask ===================================================================================================
| | | ========================== | |
| | | | | |
| | PrepResizeAtDestTask | | ,------------------------------------!.
| | -------------------------------------------------------------------------------------------------> |RPC call: |_\
| | | | | |prep_snapshot_based_resize_at_dest() |
| | | | | `--------------------------------------'
| | | | | |
| | <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| | | | | |
| | | |Restful: | |
| | | |GET /allocations/{consumer}| |
| | | |<--------------------------- |
| | | | | |
| | | |Restful: | ,------------------------------------!.
| | | |PUT /allocations/{consumer}| |Set inventory for placement provider|_\
| | | |<--------------------------- `--------------------------------------'
| | | | | |
| | | PrepResizeAtSourceTask | | ,--------------------------------------!.
| | -----------------------------------------------------------------------------------------------------------------------------> |RPC call: |_\
| | | | | | |prep_snapshot_based_resize_at_source() |
| | | | | | `----------------------------------------'
| | | | | |
| | <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| | | | | |
| | FinishResizeAtDestTask | | ,--------------------------------------!.
| | -------------------------------------------------------------------------------------------------> |RPC call: |_\
| | | | | |finish_snapshot_based_resize_at_dest() |
| | | | | `----------------------------------------'
| | | | | |
| | <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
| | | | | |
| |----. ,-------------------------!. | | |
| | | FinishResizeAtDestTask |update_instance_mapping()|_\ | | |
| |<---' `---------------------------' | | |
| | | | | |
confirm | | | | | |
----------> | | | | |
| | | | | |
| RPC cast: | | | | |
| confirm_snapshot_based_resize()| | | | |
| -------------------------------> | | | |
| | | | | |
| | | | | |
| | | ===================== | |
===================================================================================================== ConfirmResizeTask ======================================================================================================
| | | ===================== | |
| | | | | |
| | RPC call: | | |
| | confirm_snapshot_based_resize_at_source() | |
| | ----------------------------------------------------------------------------------------------------------------------------->
| | | | | |
| | | | | |
| | <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| | | | | |
| |----. | | | |
| | | hard delete source cell instance | | | |
| |<---' | | | |
| | | | | |
| |----. | | | |
| | | update target cell instance status | | | |
| |<---' | | | |
| | | | | |
revert | | | | | |
----------> | | | | |
| | | | | |
| | RPC cast: | | | |
| | revert_snapshot_based_resize() | | |
| ----------------------------------------------------------------------------------------------------------------------------------> |
| | | | | |
| | | | | |
| | | =================== | |
====================================================================================================== ReverResizeTask =======================================================================================================
| | | =================== | |
| | | | | |
| |----. | | |
| | | update records from target to source cell | | |
| |<---' | | |
| | | | | |
| |----. | | | |
| | | update instance mapping | | | |
| |<---' | | | |
| | | | | |
| | RPC call: | | | |
| | revert_snapshot_based_resize_at_dest() | | |
| | -------------------------------------------------------------------------------------------------> |
| | | | | |
| | | | | |
| | <------------------------------------------------------------------------------------------------- |
| | | | | |
| |----. | | | |
| | | hard delete target cell instance | | | |
| |<---' | | | |
| | | | | |
| | RPC call: | | |
| | finish_revert_snapshot_based_resize_at_source() | |
| | ----------------------------------------------------------------------------------------------------------------------------->
| | | | | |
| | | | | |
| | <- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
,---+----. ,------+-------. ,------+-------. ,----+----. ,-------+--------. ,-------+--------.
|nova_api| |nova_conductor| |nova_scheduler| |placement| |nova_compute_dst| |nova_compute_src|
`--------' `--------------' `--------------' `---------' `----------------' `----------------'
U版本resize流程主要分为5个Task:
1、MigrationTask
nova-conductor会先判断目标节点与源节点是否在同一个cell,若在相同cell,则执行U版本之前的逻辑,会涉及源、目的节点的通信;若不在同一个cell,则将执行CrossCellMigrationTask。
2、PrepResizeAtDestTask
声明资源并对目标节点中的选定主机进行验证,与之前版本的pre_resize阶段功能类似。
3、PrepResizeAtSourceTask
在源主机上准备实例(停止虚机,可以选择对其进行快照,断开卷和关闭网络等操作),与之前版本的resize_instance阶段类似,不过此时发起方为nova-conductor。这里提到了快照,由于跨cell,无法将根磁盘直接拷贝到目标主机,这里采用对根磁盘打快照并上传到Glance中的方式来达到数据迁移的目的(对于卷启动的虚机则直接通过向目标节点挂载根卷的方式来完成数据迁移)。
4、FinishResizeAtDestTask
在目标主机上完成调整大小(迁移),交换实例上的隐藏字段并更新实例映射,与之前版本的结束迁移阶段类似,不过此时的发起方为nova-conductor。
5、确认迁移
这里给予用户一次反悔撤销的机会,若确认将会删除源节点虚机数据,否则进行迁移回退。同样,跨cell时发起方revert操作的发起方也变为nova-conductor。
2. 支持nova-manage placement auditCLI,以查找和清理孤立的资源分配
placement孤立资源会导致
实际可分配资源使用量较少
无法删除作为resource provider的计算节点
产生原因
可能发生这种情况的一种情况是当计算节点出现问题,因此管理员将其强制关闭并从中撤离虚机。请注意,在这种情况下,“撤离”是指虚拟机evacuate操作,而不是从正在运行的计算服务实时迁移所有服务器。假定计算节点已关闭并且被隔离。假设vm1已经从计算节点devstack1撤离到计算节点devstack2:
$ openstack --os-compute-api-version 2.53 compute service list --service nova-compute
+--------------------------------------+--------------+-----------+------+---------+-------+----------------------------+
| ID | Binary | Host | Zone | Status | State | Updated At |
+--------------------------------------+--------------+-----------+------+---------+-------+----------------------------+
| e3c18c2d-9488-4863-b728-f3f292ec5da8 | nova-compute | devstack1 | nova | enabled | down | 2019-10-25T20:13:51.000000 |
| 50a20add-cc49-46bd-af96-9bb4e9247398 | nova-compute | devstack2 | nova | enabled | up | 2019-10-25T20:13:52.000000 |
| b92afb2e-cd00-4074-803e-fff9aa379c2f | nova-compute | devstack3 | nova | enabled | up | 2019-10-25T20:13:53.000000 |
+--------------------------------------+--------------+-----------+------+---------+-------+----------------------------+
$ vm1=$(openstack server show vm1 -f value -c id)
$ openstack server show $vm1 -f value -c OS-EXT-SRV-ATTR:host
devstack2
此时,placement中的devstack1和devstack2资源提供者已经进行了分配:
$ devstack1=$(openstack resource provider list --name devstack1 -f value -c uuid)
$ devstack2=$(openstack resource provider list --name devstack2 -f value -c uuid)
$ openstack resource provider show --allocations $devstack1
+-------------+-----------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------+-----------------------------------------------------------------------------------------------------------+
| uuid | 9546fce4-9fb5-4b35-b277-72ff125ad787 |
| name | devstack1 |
| generation | 6 |
| allocations | {u'a1e6e0b2-9028-4166-b79b-c177ff70fbb7': {u'resources': {u'VCPU': 1, u'MEMORY_MB': 512, u'DISK_GB': 1}}} |
+-------------+-----------------------------------------------------------------------------------------------------------+
$ openstack resource provider show --allocations $devstack2
+-------------+-----------------------------------------------------------------------------------------------------------+
| Field | Value |
+-------------+-----------------------------------------------------------------------------------------------------------+
| uuid | 52d0182d-d466-4210-8f0d-29466bb54feb |
| name | devstack2 |
| generation | 3 |
| allocations | {u'a1e6e0b2-9028-4166-b79b-c177ff70fbb7': {u'resources': {u'VCPU': 1, u'MEMORY_MB': 512, u'DISK_GB': 1}}} |
+-------------+-----------------------------------------------------------------------------------------------------------+
$ openstack --os-placement-api-version 1.12 resource provider allocation show $vm1
+--------------------------------------+------------+------------------------------------------------+----------------------------------+----------------------------------+
| resource_provider | generation | resources | project_id | user_id |
+--------------------------------------+------------+------------------------------------------------+----------------------------------+----------------------------------+
| 9546fce4-9fb5-4b35-b277-72ff125ad787 | 6 | {u'VCPU': 1, u'MEMORY_MB': 512, u'DISK_GB': 1} | 2f3bffc5db2b47deb40808a4ed2d7c7a | 2206168427c54d92ae2b2572bb0da9af |
| 52d0182d-d466-4210-8f0d-29466bb54feb | 3 | {u'VCPU': 1, u'MEMORY_MB': 512, u'DISK_GB': 1} | 2f3bffc5db2b47deb40808a4ed2d7c7a | 2206168427c54d92ae2b2572bb0da9af |
+--------------------------------------+------------+------------------------------------------------+----------------------------------+----------------------------------+
可以通过下面方式查看撤离记录:
$ nova migration-list --source-compute devstack1 --migration-type evacuation
+----+--------------------------------------+-------------+-----------+----------------+--------------+-------------+--------+--------------------------------------+------------+------------+----------------------------+----------------------------+------------+
| Id | UUID | Source Node | Dest Node | Source Compute | Dest Compute | Dest Host | Status | Instance UUID | Old Flavor | New Flavor | Created At | Updated At | Type |
+----+--------------------------------------+-------------+-----------+----------------+--------------+-------------+--------+--------------------------------------+------------+------------+----------------------------+----------------------------+------------+
| 1 | 8a823ba3-e2e9-4f17-bac5-88ceea496b99 | devstack1 | devstack2 | devstack1 | devstack2 | 192.168.0.1 | done | a1e6e0b2-9028-4166-b79b-c177ff70fbb7 | None | None | 2019-10-25T17:46:35.000000 | 2019-10-25T17:46:37.000000 | evacuation |
+----+--------------------------------------+-------------+-----------+----------------+--------------+-------------+--------+--------------------------------------+------------+------------+----------------------------+----------------------------+------------+
此时尝试删除devstack1的resource provider将失败:
$ openstack resource provider delete $devstack1
Unable to delete resource provider 9546fce4-9fb5-4b35-b277-72ff125ad787: Resource provider has allocations. (HTTP 409)
新增查找孤立资源的意义
对于上述例子,是既定条件下的问题复现,但是在实际的生产环境中往往会出现许多无法快速定位的孤立资源,对于运维管理人员的排查处理会造成很大影响。而新增的孤立资源查找方法将解决这一问题:
nova-manage placement audit [--verbose] [--delete] [--resource_provider <uuid>]
执行该命令后会遍历所有的resource provider(如果提供resource provider的UUID,则只遍历其本身),然后验证、计算是否存在与现有实例或迁移UUID相关的分配。如果不相关,将会输出哪些分配是孤立的。
可以通过指定-delete来要求删除所有孤立的分配(osc-placement1.7.x以前版本需要手动覆盖分配后再删除;1.8版本之后则需要使用unset命令后再删除);
通过指定--verbose以获取执行期间的详细进度输出;
此命令要求设置api_database.connection和Placement配置选项。必须输入Placement API> = 1.14。
返回代码:
3. 支持具有resource request的neutron port的实例的撤离,实时迁移和搁置
相关概念
Port Resource Requests:
在Neutron Port属性中包含resource request(用于向placement查询、更新),比如QOS Minimal bandwidth rule。Nova在创建或移动实例时,会从每个port收集并组合resource request,在调度期间将一个allocation请求发送到placement,placement将确保目标provider能够满足该port的资源请求。
Port resource requests样例如下:
{u'required': [u'CUSTOM_PHYSNET_PHYSNET1',
u'CUSTOM_VNIC_TYPE_NORMAL'],
u'resources': {u'NET_BW_EGR_KILOBIT_PER_SEC': 1000,
u'NET_BW_IGR_KILOBIT_PER_SEC': 1000}}
CUSTOM_PHYSNET_PHYSNET1对应物理网络名称,由neutron ovs-agent/sr-iov-agent配置项bridge_mappings来定义;
CUSTOM_VNIC_TYPE_NORMAL为该port类型;
NET_BW_EGR_KILOBIT_PER_SEC和NET_BW_IGR_KILOBIT_PER_SEC表明最小带宽出入方向的限制大小。
历史情况
从Microversion 2.72开始,nova支持使用neutron port创建服务器时,port具有可见的资源请求(仅管理员端口属性) resource_request。例如,如果neutron port附加了QoS最小带宽规则,则它具有resource request。自从Stein版本的nova以来,删除此类实例或分离此类port是可行的,而无需任何特定的microversion。
但是,nova仍不支持以下API操作:
不支持使用具有QoS最小带宽规则的neutron network创建实例。用户需要在该network中预先创建port,使用该port创建实例。
不支持连接具有QoS最小带宽规则的Neutron port和network。
另外,nova的19.0.0(Stein)版本不支持以下API操作:
尚不支持使用具有resource request的port来移动(resizing, migrating, live-migrating, evacuating, unshelving after shelve offload)实例。
从20.0.0(Train)开始,nova支持具有资源请求的中子端口的服务器的冷迁移和调整大小,需要满足以下两个方面的要求:
源和目标计算服务都升级到20.0.0(Train);
[upgrade_levels]/compute配置不阻止使用最新的RPC版本;
原理概述
这里以创建带有resource_request端口的实例为例,其余实现思路类似,大体为:
,--------. ,--------------. ,--------------. ,---------. ,------------.
|nova_api| |nova_conductor| |nova_scheduler| |placement| |nova_compute|
`---+----' `------+-------' `------+-------' `----+----' `-----+------'
| | | | |
| | ======================================= | |
========================================================================= Image cache management by aggregate ==========================================================================
| | ======================================= | |
| | | | |
boot | | | | |
---------------------------> | | | |
| | | | |
,----------------------!. |----. | | |
|Get resource request |_\| | _validate_and_build_base_options() | | |
|and generate req_specs ||<---' | | |
`------------------------'| | | | |
| RPC cast: | | | |
| schedule_and_build_instances() | | | |
| --------------------------------------> | | |
| | | | |
| | RPC call: | | |
| | select_destinations() | | |
| | ------------------------> | |
| | | | |
| | | | |
| | <- - - - - - - - - - - - | |
| | | | |
| | | Restful: | |
| | | GET /allocation_candidates?{resources}| |
| | | --------------------------------------> |
| | | | |
| | | | |
| | | <- - - - - - - - - - - - - - - - - - - |
| | | | |
| | | RPC cast: | ,-.
| | | build_and_run_instance() | |X|
| | --------------------------------------------------------------------------------------------->|X|
| | | | |X|
| | | | Restful: |X|
| | | | GET /allocations/{consumer} |X|
| | | | <---------------------------|X|
| | | | |X|
| | | | Restful: |X| ,-------!.
| | | | PUT /allocations/{consumer} |X| |Spawing|_\
| | | | <---------------------------|X| `---------'
| | | | `-'
| | | RPC cast: | |
| | | update_instance_info() |
| | | <--------------------------------------------------------------------
,---+----. ,------+-------. ,------+-------. ,----+----. ,-----+------.
|nova_api| |nova_conductor| |nova_scheduler| |placement| |nova_compute|
获取port_resource_request并构建req_specs;
根据req_specs向placement查询相关的分配信息,这里是qos limit,过滤出目标计算节点;
在目标节点创建实例并向placement占用该部分资源;
4. Nova Policies引入具有scope_type的新默认角色
在Ussuri(21.0.0)版本中引入了具有scope_type功能的新默认角色,这些新更改提高了安全级别和可管理性。在处理具有“读取”和“写入”角色的系统和项目级别令牌的访问权限方面,新策略更加丰富,处理了以下问题:
没有全局项目管理员。该admin_only角色用于全局管理员,该管理员几乎可以对Nova进行任何更改,并查看Nova系统的所有详细信息。该规则适用于具有管理员角色的任何用户,使用哪个项目都没有关系。
没有只读角色。由于多个API倾向于共享用于读取和写入操作的单个策略规则,因此它们没有提供只读访问角色所需的粒度。
角色admin_or_owner没有按照预期工作。大多数具有admin_or_owner角色的API,项目身份验证发生在与Nova中的API不同的组件中,该组件不遵守策略更改。结果导致policy无法覆盖项目内硬编码的策略。
keystone自带admin、member、reader默认角色。此外,keystone支持新的“system scope”概念,可以更轻松地保护部署级资源免受项目或系统级资源的侵害。
在Nova 21.0.0(Ussuri)版本中,Nova Policy实现了scope概念且默认角色使用了keystone提供的admin、member、reader。使用Keystone中的常见角色可以减少重复定义角色的可能性,但是,角色往往由项目或部署实施时来定义。而借助新的默认设置,可以更轻松地了解谁可以跨项目执行操作,减少分歧并提高互操作性。
以下各节说明了Nova中的这些新默认值如何解决上述前两个问题,并以安全可靠的方式将更多功能扩展到最终用户。
Scope
OpenStack Keystone支持在token中的使用不同scope。token作用域代表授权层。策略scope_types表示访问API所需的授权层。
每个策略的scope_type是硬编码的,并且不能通过policy文件覆盖
Nova通过在policy文件中定义scope_type来实现范围的概念。要了解nova每个策略的scope_type,
请参考:https://docs.openstack.org/nova/latest/configuration/policy.html
下面给出各个scopy_type的示例:
system scope
scope_type为system的policies意味着具有system-scoped token的用户才有权限访问该资源。它可以理解为全局角色。默认情况下,所有系统级别操作policies的scope_type都为[system]。
例如:GET /os-hypervisors API
# List all hypervisors.
# GET /os-hypervisors
# Intended scope(s): system
#"os_compute_api:os-hypervisors:list": "rule:system_reader_api"
system and project scope
具有system_type和system-project的策略的策略意味着具有系统范围或项目范围的令牌的用户才有权限访问该资源。默认情况下,所有系统和项目级操作的policies的scope_type都为['system','project']。
例如:POST /servers/{server_id}/action(os-migrateLive)API
# Live migrate a server to a new host without a reboot
# POST /servers/{server_id}/action (os-migrateLive)
# Intended scope(s): system, project
#"os_compute_api:os-migrate-server:migrate_live": "rule:system_admin_api"
这些作用域类型提供了一种区分系统级和项目级访问角色的方法。您可以根据用户范围控制信息。这意味着可以控制任何项目级别角色都无法获取虚拟机监控程序信息。默认情况下,policy scope是禁用的,主要方便运维实施人员将旧的policy进行迁移。可以通过将oslo_policy.enforce_scope配置想设置为True来启用此功能。
Roles
您可以参考该文档以了解Keystone中所有可用的默认设置。
与scope_type功能一起,Nova策略为每个策略定义了新的默认值。
Reader
这提供对系统或项目内资源的只读访问。Nova默认规则:
system_reader_api
Default
role:reader and system_scope:all
system_or_project_reader
Default
(rule:system_reader_api) or (role:reader and project_id:%(project_id)s)
Member
该角色是结合系统管理员执行项目级别的写操作。Nova默认规则:
project_member_api
Default
role:member and project_id:%(project_id)s
system_admin_or_owner
Default
(role:admin and system_scope:all) or (role:member and project_id:%(project_id)s)
Admin
该角色是在系统以及项目级别的操作上执行管理员级别的写操作。Nova默认规则:
system_admin_api
Default
role:admin and system_scope:all
project_admin_api
Default
role:admin and project_id:%(project_id)s
system_admin_or_owner
Default
(role:admin and system_scope:all) or (role:member and project_id:%(project_id)s)
使用这些新的默认值,可以解决以下问题:
向用户提供只读访问权限。制定了更加精细的策略,并默认使用reader role。例如:比如出于安全目的需要让他人审核部署的系统。
以更好的方式自定义策略。例如,能够向项目级别的用户提供访问权限,以对其服务器或带有其令牌的任何其他项目执行实时迁移。
迁移计划
请参考该链接:https://docs.openstack.org/nova/latest/configuration/policy-concepts.html#migration-plan
5. 从卷启动的虚拟机能够使用Rescue操作,允许将稳定的磁盘设备连接到救援实例
相关概念
rescue:
openstack 救援模式是把镜像作为实例的系统盘,把实例的原系统盘作为数据盘,这样可以将数据盘mount到文件系统,对原系统文件进行修改以达到拯救目的。
此前版本boot from volume的实例不支持rescue操作的原因
首先其实早在2012年,就有人提交过一个与U版当前实现相似的patch来解决这个问题(可能不太professional,感兴趣可以对比一下当前代码:https://launchpadlibrarian.net/119948767/nova_libvirt_rescue_bdm.patch),实现方式是向后端驱动(libvirt)传递block_device_mapping,通过bdm获取boot from volume实例的根磁盘信息。而当时否决这一做法的理由是:
rescue操作提供了一种访问无法启动实例的手段,而从卷启动的实例的根磁盘可以直接挂载,通过rescue是没有意义的,所以禁止BFV实例执行rescue
并且提交了一个commit从api层禁止了这样的操作。个人觉得该理由比较牵强且固执,并且对新的有意加入社区的开发人员极不友好。好在终于在U版,这一功能合并了进来,使得rescue操作更加地专业统一。
6. 根据aggregate预缓存image到计算节点
相关概念
Host Aggregates:
Host Aggregates是一种基于任意特征在region中对主机进行划分的机制。可以根据不同的 computes 节点的物理硬件配置将具有相同共性的物理资源规划在同一 Host Aggregates 之下,或者根据用户的具体需求将几个 computes 节点规划在具有相同用途的同一 Host Aggregate 之下,通过这样的划分有利于提高 OpenStack 资源的使用效率。
API介绍:
POST /os-aggregates/{aggregate_id}/images
请求将一组图像预先缓存在引用的聚合内的计算节点上
从microversion 2.81开始提供此API。响应代码:
正常响应码:202
错误响应代码:badRequest(400),unauthorized(401),forbidden(403),itemNotFound(404)
Request
request示例:
{
"cache":
[
{"id": "70a599e0-31e7-49b7-b260-868f441e862b"}
]
}
原理概述
,--------. ,--------------. ,------------.
|nova_api| |nova_conductor| |nova_compute|
`---+----' `------+-------' `-----+------'
| | |
| =======================================
================================== Image cache management by aggregate ==================================
| =======================================
| | |
Prefetch img in | | |
aggregate host | | |
----------------> | |
| | |
|----. | |
| | get_aggregate() | |
|<---' | |
| | |
| RPC cast: | |
| cache_images() | |
| ---------------------> |
| | |
| | | ,---------------------------!.
| | cache_images() | |RPC call: |_\
| | -----------------------> |Create a green-thread pool |
| | | |to cache images for each |
| | | |comput node under each cell |
,---+----. ,------+-------. ,-----+--`-----------------------------'
|nova_api| |nova_conductor| |nova_compute|
`--------' `--------------' `------------'
nova-api根据Restful请求获取aggregate列表;
nova-conductor根据aggregate找到所有的相关计算节点,并获取cell_mapping,以便获取各个cell的context;
以本cell的context向cell内的计算节点发送cache_images的请求;
再有计算节点驱动调用glance client去下载镜像。
7. 计算节点支持多种虚拟GPU类型
此次还对虚拟GPU类型的支持做了优化,此前,指定实例使用何种类型的虚拟GPU需要修改如下配置文件:
[devices]
enabled_vgpu_types = nvidia-35
如果要支持多个GPU类型,则需要为每个设备提供单独的配置部分。例如:
[devices]
enabled_vgpu_types = nvidia-35, nvidia-36
[vgpu_nvidia-35]
device_addresses = 0000:84:00.0,0000:85:00.0
[vgpu_nvidia-36]
device_addresses = 0000:86:00.0
必须在其中定义每种GPU类型支持哪些物理GPU。如果为两种不同类型提供了相同的PCI地址,nova-compute将拒绝启动并在日志中发出特定错误。
8. 支持在创建虚拟机时通过Cyborg来附加加速设备
文章浏览阅读2.2k次。本文采用CenOS 6 32位,JDK1.7进行编译 (1)安装编译库yum install cmake lzo-devel zlib-devel gcc gcc-c++ autoconf automake libtool ncurses-devel openssl-devel libXtst(2)安装mavenwget http://repos.fedorapeople.org/repos/dc_32位linux系统 编译hadoop
文章浏览阅读422次。BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序,本项目旨在更简单的维护我们内部的dns系统。环境:数据库: mysql5.6应用: bind-9.11.2环境: python3.8 , django30x01 安装数据库bash sql 建库语句use mysqlcreate database bind9; -..._使用web管理bind
文章浏览阅读282次。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题。不过,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。====从新生代出发-XX:+UseSerialGC 可互相激活新生代 :Serial + 老年代: Serial Old 都是串行-XX:+UseParNewGC 可互相激活。_自动内存管理
文章浏览阅读529次。自己用原生javascript写的轮播图,分页器按钮Click点击与mouseover鼠标悬浮导航都支持。同时支持移动端触摸操作,自己写得感觉不足之处是图片滚动动画还不够平滑,再改改间隔与偏移量应该可以。函数接受参数应该改成对象更好,还没有改。感觉这次写的轮播图功能比较全面了哈。高手们请别笑话,不足请指正.上源码:先HTML:<!DOCTYPE html><html>&..._轮播图无缝链接带有小圆点且支持移动端触频滑动
文章浏览阅读339次。nginx - fastcgi - php - memcache 协同下的 请求的完整访问过程用户发送http请求报文给nginx服务器nginx会根据文件url和后缀来判断请求如果请求的是静态内容,nginx会将结果直接返回给用户; 如果请求的是动态内容,nginx会将请求交给 fastcgi客户端 ,通过 fastcgi_pass 将这个请求发送给 php-fpmphp-fpm 会将请求交给 wrapperwrapper 收到请求会生成新的线程调用 php动态程序解析服务器如果用
文章浏览阅读566次。一、actor对等调度。二、调度流程源码分析:thread_worker()、struct skynet_context、skynet_context_message_dispatch()、dispatch_message()。三、c语言到lua的调用过程分析。_actor公平调度
文章浏览阅读939次。该音乐播放器是我研究生开学前做出来的,花了我将近一个月的闲余时间,算是有模有样的了。现在算起来,应该有一年多没搞Android,所以现在看回以前的程序已经比较模糊了,整个工程的代码量还是比较庞大的,就不把代码贴出来了,感兴趣的可以自行下载代码。欢迎先体验我的App,来一场听觉与视觉的享受吧!视觉????嗯,你没看错,安装后有惊喜,让你欲罢不能!(貌似有点夸张了)Apk下载地址:ht_登录即可查找最新的android应用、游戏、电影、音乐等精彩内容
文章浏览阅读1.1w次。 弄了一上午,终于把使用NetTcpBinding的双工通讯给弄清楚了,也算是对wcf有所掌握了,为了解决穿透防火墙的问题,所以决定尝试一下WsDualHttpBinding的双工通信,结果问题来了。。。 “无法注册 URL http://+:8735/Service/。另一应用程序已使用 HTTP.SYS 注册了该 URL。” 晕了一种个下午,百_无法注册应用去处理url地址
文章浏览阅读4.5k次,点赞5次,收藏52次。把手里积累了这么久的Python入门资料整理了一下,发现其实,有了这些,python入门真的不难,每天花点时间学,真的不会影响工作。下面一起来看看这些资料吧!可以学习python的地方 Python学习资料全部整理 Python可以做的事情 关于python的一些文章一、可以学习Python的地方1、实验楼:【Python基础+项目实战课程】https://www.lanqiao.cn/courses/13302、《笨办法学 Python》:这本书绝对是最简单的学习 Pyth.._python学习资料
文章浏览阅读1.2k次。yum 设置代理:vim /etc/yum.conf添加形如:proxy = http://user:pass@ip:portrpm 设置代理sudo rpm -Uvh https://xxxxx.rpm --httpproxy ip --httpport portreference: https://www.lightnetics.com/topic/3698/how-do-i-install-an-rpm-package-using-a-http-proxy..._linux 代理 rpm
文章浏览阅读3.1k次。加载一副位图到你的用户界面是很简单的,然而如果你需要马上加载一组更大的图片的话就会复杂的多.在许多情况下(例如有些组件像ListView,GridView以及ViewPager等),出现在屏幕上的图片总量,其中包括可能马上要滚动显示在屏幕上的那些图片,实际上是无限的. 那些通过回收即将移除屏幕的子视图的组件,内存使用得以保留.如果你不长期保持你对象的引用的话,垃圾收集器也会释放你所加载的位图内_android 每秒收到30张图片怎么处理
文章浏览阅读205次。我们公司开发的liveweb播放器是可支持H.264/H.265视频播放的流媒体播放器,性能稳定、播放流畅,可支持的视频流格式有RTSP、RTMP、HLS、FLV、WebRTC等,具备较高的可用性。支持h264、h265、AAC、G711等常见音视频格式。支持协议:RTSP、RTMP、HLS、HTTP-FLV、WebSocket-FLV、GB28181、HTTP-TS、WebSocket-TS、HTTP-fMP4、WebSocket-fMP4、MP4、WebRTC。对外提供HTTP API二次开发接口;_h5直接播放rtsp视频