OpenStack之Provisioning Blocks管理复杂对象的状态

2023-12-19 10:18

本文主要是介绍OpenStack之Provisioning Blocks管理复杂对象的状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们使用对象的STATUS字段表示资源是否可用,如果设置为ACTIVE,外部系统认为可以安全的使用此资源。如果仅有一个实体负责配置(provisioning)给定的对象,很容易知道合适将status设置为ACTIVE。当实体完成配置(provisioning),我们就更新STATUS到ACTIVE。尽管如此,在Neutron内部由许多资源需要在可用之前由多个异步的实体进行配置(provisioning),所以管理status到ACTIVE状态的转变变得更加复杂。为处理此情况,Neutron增加了 provisioning_blocks 模块用于跟踪正在配置(provisioning)资源的实体。

ML2模块中的主要示例是:L2 agents 和 DHCP agents。当port被创建并绑定到主机时,它处于DOWN状态。L2 agent需要为port建立流flows,安全组规则等,DHCP agent需要建立port的IP和MAC地址的预留绑定。在转到ACTIVE之前,两个agent必须完成他们的工作,或者port的使用者(如 Nova)可能尝试使用此port,而得不到连通性。为解决此问题,provisioning_blocks模块用来跟踪每个agent的配置(provisioning)状态,对象的status只有在两个agent完成时才会更新。

High Level View

要使用provisioning_blocks模块,即当对象的status转换为ACTIVE之前,需要另外的实体完成工作,必须添加配置(provisioning)组件。通过为每个实体调用方法add_provisioning_component来实现。当每个实体完成配置(provisioning)对象后,provisioning_complete被调用移除配置(provisioning)块。

当最后一个配置块被移除后,provisioning_blocks模块将触发回调通知,其中包含对象资源类型的对象ID,事件为PROVISIONING_COMPLETE。此事件的订阅者现在可更新对象的status到ACTIVE状态,或者执行其它需要的动作。

通常的状态转变过程如下:

  1. 请求创建对象
  2. Neutron服务器逻辑决定哪些实体需要去配置(provision)此对象,并为此对象的所需实体添加配置(provisioning)组件
  3. 发送通知到实体,以便它们开始工作.
  4. 对象返回给API调用者,status为DOWN(或 BUILD)状态.
  5. 每个实体在完成对象配置(provisioning)之后通知服务器。Neutron服务器为每个完成的实体调用provisioning_complete
  6. 当为最后一个实体调用了provisioning_complete之后,provisioning_blocks模块将发出表示对象以及配置(provisioning)完成的事件。
  7. 服务器上的此事件订阅者将更新对象的status到ACTIVE状态,表示它已经配置完成

关于更精确的示例,参见以下章节.

ML2, L2 agents, 和 DHCP agents

ML2使用provisioning_blocks模块防止在L2 agent和DHCP agent完成port连接工作之前,将port的status转换到ACTIVE状态。

当port创建或更新,以下步骤注册DHCP agent的配置(provisioning)块:

  1. 从port的fixed_ips字段抽取出来 subnet_ids,之后ML2检查DHCP是否在其中的subnet上启用。
  2. 查找承载网络的DHCP agent配置以确保至少有一个足够新的可报告其完成了port预留。
  3. 以上的两个条件有一个失败的话,DHCP agent的配置(provisioning)块将不会添加,并且任何现存的阻塞此port的DHCP agent将被清除,以保证port不会阻塞在等待一个不会发生的事件。
  4. 如果以上的条件成立,port的配置(provisioning)块被添加在“DHCP”实体下。

当port创建或更新,以下步骤注册L2 agent的配置(provisioning)块:

  1. 如果port没有绑定,不做任何事,因为我们还不知道是否会涉及到L2 agent,所以必须等待绑定端口的更新.
  2. 一旦port绑定,基于agent的mechanism驱动将检查绑定主机上是否存在agent,VNIC类型是否属于mechanism驱动,port的配置(provisioning)块被添加在“L2 agent”实体下.

一旦DHCP agent完成预留的建立,它通过带有port ID的RPC API调用dhcp_ready_on_ports。DHCP RPC处理器接收到,调用配置(provisioning)模块中的“provisioning_complete”,带有port ID,并且“DHCP”实体去删除配置(provisioning)块。

一旦L2 agent完成预留的建立,它通过RPC API调用正常的update_device_list(如,update_device_up)。RPC回调处理器带有port ID调用“provisioning_complete”,“L2 agent”实体删除配置(provisioning)块。

当"provisioning_complete"调用删除最后一个记录后,provisioning_blocks模块发出回调PROVISIONING_COMPLETE事件,与port ID一起。ML2中订阅此事件的方法调用update_port_status设置port的状态到ACTIVE

此时正常的通知发向Nova,以允许VM继续运行。

在DHCP或者L2 agent 进入关闭状态的事件中,port将不转换到ACTIVE状态(如L2 agent关闭)。agent必须考虑这种情况,通知服务器在启动过程中进行了所有配置之后连线已经完成。这保证了创建于离线的agent(agents崩溃或重启)的port最终可变为ACTIVE。

考虑到服务器不稳定,有关端口连线的通知必须使用RPC调用,以便agent从服务器获得确认,它必须一直重试,直到端口被删除或成功。

如果ML2驱动程序快速将绑定端口置于ACTIVE状态(例如,在调用update_port_postcommit的后端之后),此修补程序不会对这个过程产生任何影响。

这篇关于OpenStack之Provisioning Blocks管理复杂对象的状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511821

相关文章

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea