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

相关文章

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Prometheus+cpolar如何在手机上也能监控服务器状态?

《Prometheus+cpolar如何在手机上也能监控服务器状态?》本文强调了通过Cpolar这一内网穿透工具,轻松突破Prometheus仅限于局域网访问的限制,实现外网随时随地访问监控数据,教你... 目录前言1.安装prometheus2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符

《sqlserver、mysql、oracle、pgsql、sqlite五大关系数据库的对象名称和转义字符》:本文主要介绍sqlserver、mysql、oracle、pgsql、sqlite五大... 目录一、转义符1.1 oracle1.2 sqlserver1.3 PostgreSQL1.4 SQLi

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave