OpenStack系列(十七) 云主机的创建与调度过程
1 | 作者:李晓辉 |
实例创建过程
嘿,你知道OpenStack创建虚拟机实例的过程有多复杂吗?我给你讲讲,这就像是一场接力赛,好多组件都得配合起来才能完成任务。
1. 身份验证
首先,你得用你的账号密码(就好比是你的“通行证”)去请求一个身份验证服务。这个服务会检查你的身份,要是没问题,就会给你一个“令牌”(auth token)。后面的操作都得用到这个令牌,就像你去游乐场玩,先买了票,后面每个项目都要用票才能进去。
2. 发起请求
然后,你发起一个启动虚拟机的请求,带着这个令牌去敲计算服务(nova_api)的门。nova_api会把这个请求再转给身份验证服务,让对方再确认一下令牌是不是真的,顺便看看你有哪些权限。
3. 创建实例记录
一旦验证通过,nova_api就开始忙活了。它会在数据库里给这个新虚拟机建一个“档案”,记录下所有启动参数,这样其他组件就能随时查看和更新状态。
4. 寻找合适的计算节点
接下来,nova_api会发一个消息给消息队列,告诉nova_scheduler:“嘿,我这儿有个虚拟机要启动,你帮我找一台合适的计算节点来承载它。”nova_scheduler收到消息后,就开始筛选,看看哪台计算节点的资源(比如CPU、内存、磁盘)能满足这个虚拟机的需求,然后在数据库里更新记录,告诉nova_api它选中的计算节点。
5. 请求启动虚拟机
选好节点后,nova_scheduler又发消息给nova_compute,说:“你去启动这个虚拟机吧。”nova_compute收到指令后,又找nova_conductor帮忙,让对方准备启动虚拟机需要的各种东西。
6. 准备启动
nova_conductor接到任务,去数据库里查了查,知道了这台虚拟机要多少内存、CPU、磁盘配置,然后把新的状态更新到消息队列里。
7. 加载镜像
nova_compute拿到这些信息后,就开始准备虚拟机的镜像。它用请求里给的镜像ID,去镜像服务(glance_api)那儿要镜像的地址。glance_api又得去身份验证服务那儿验证令牌,确认没问题后,就从数据库里找到镜像的元数据,把镜像地址给nova_compute。nova_compute拿到地址后,就从镜像存储里把镜像加载过来。
8. 配置网络
接下来,nova_compute还得给网络服务(neutron_server)发请求,让对方给虚拟机分配和配置网络资源。neutron_server也得去身份验证服务那儿验证令牌,确认权限没问题后,就开始在ovn-nb数据库里读写网络资源的定义,看看有没有现成的网络,要是没有就创建新的端口、连接和网络参数。
9. 网络配置同步
ovn-northd守护进程会把ovn-nb里的逻辑网络配置翻译成ovn-sb数据库里的逻辑数据路径流。ovn-controller在选中的计算节点上运行,它会读取ovn-sb里的配置,更新计算节点在网络中的状态和绑定表。ovn-controller还会连接到ovs-vswitchd,作为一个OpenFlow控制器,动态配置网络流量的OpenFlow规则。
10. 获取网络状态
neutron_server会把从计算节点的libvirt驱动程序那里获取到的L2配置和请求的DHCP地址返回给消息队列。nova_compute会将这个实例的网络状态写入实例数据库条目。
11. 准备存储卷
然后,nova_compute又得去块存储服务(cinder_api)那儿要虚拟机磁盘的卷数据。cinder_api同样要先去身份验证服务那儿验证令牌,确认权限没问题后,就发消息给消息队列,让cinder_scheduler去创建一个指定大小的卷,或者找到一个已经存在的卷的元数据。
12. 分配存储卷
cinder_scheduler收到消息后,就开始创建或查找卷,然后把元数据返回给nova_scheduler。
13. 创建虚拟机
最后,nova_compute根据这些信息生成计算节点驱动程序所需的数据,并使用libvirt在计算节点上创建虚拟机。这个虚拟机就会出现在控制面板上,也能通过列出服务器的命令看到。nova_compute还会把卷信息传递给libvirt。
14. 挂载存储卷
cinder_volume会订阅新实例请求,并检索集群映射。然后,libvirt会在新实例上挂载卷。
15. 查询实例状态
通过身份验证服务,用户可以通过向nova_api服务发送REST API调用,查询实例的状态。nova_api服务会从计算服务数据库中检索当前状态。
总之,这个过程就像是一场接力赛,每个组件都得在正确的时间做正确的事情,才能顺利创建一个虚拟机实例。是不是听起来很有趣?我们来用图说话吧!
调度流程
1. 调度器收到请求
调度器(scheduler)收到一个来自协调器(conductor)的请求。这个请求里包含了虚拟机需要的资源信息,比如要多少CPU、内存、磁盘之类的。
2. 查询可用资源
调度器把资源需求信息发给资源分配服务(placement service)。资源分配服务就像一个“资源管家”,它会在数据库里查找所有能满足这些资源需求的计算节点(compute nodes)。然后,它会给每个符合条件的计算节点生成一个“资源概览”,把关键信息都总结一下,再把这些概览发回给调度器。
3. 筛选和排名
调度器收到这些资源概览后,就开始“挑挑拣拣”了。它会用一系列过滤器(filters)来筛选这些计算节点,看看哪些更合适。比如,它可能会排除那些负载太高的节点,或者那些网络连接不好的节点。筛选完之后,剩下的计算节点会被排个序,排在最前面的那个就是“最佳候选人”。
4. 申请资源
调度器选中排名最高的计算节点后,就会向资源分配服务发起申请,说:“我要用这个节点的资源来启动虚拟机。”但是,有时候会发生意外——如果在申请的过程中,别的请求已经把资源抢走了(比如别的虚拟机先启动了),申请就会失败。这种情况下,调度器就会退而求其次,选择排名第二的计算节点,再试一次。
5. 成功后通知协调器
如果申请成功,调度器就会开心地联系协调器,说:“我已经搞定资源了,你可以开始创建虚拟机了。”协调器收到消息后,就会尝试在选中的计算节点上启动虚拟机。
6. 失败后的处理
如果虚拟机创建失败了(比如因为计算节点出了问题,或者资源不够用了),协调器会确保这些资源不会被“锁定”,也就是说,这些资源还会被释放出来,供其他虚拟机使用。
总结
整个过程就像是在选“最佳员工”来完成任务。调度器先把符合条件的员工(计算节点)找出来,然后根据各种标准筛选和排名,挑出最合适的那个。如果选中的员工没空,就换下一个试试。如果任务失败了,就重新分配资源,确保不浪费。听起来是不是有点像在安排工作?
我们用图示来表示一下吧~
放置服务
其实刚才的调度也好,云主机的创建过程也好,都用到了我们的放置服务,我们来了解一下这个服务
Placement Service 是干啥的?
Placement Service 就像是一个“资源管家”,它的主要任务是帮你找到各种资源,比如计算节点(compute nodes)、存储池(storage pools)或者分配池(allocation pool)。它会跟踪每个资源提供者的资源情况。简单来说,计算节点的资源主要是内存(RAM)和CPU,而存储节点的资源主要是磁盘。
通用资源池(Generic Resource Pools)
在云环境中,资源的种类可多了。计算节点提供的资源包括内存、CPU、PCI设备和临时磁盘(ephemeral disks)。还有一些资源,比如共享存储,是由外部资源池提供的。
Placement Service 的 API 可以用来查询和管理资源提供者、库存(inventories)和分配记录(allocation records)。资源提供者会把资源的使用情况告诉所有需要这些资源的消费者。这些通用资源池解决了资源容量和使用信息不准确的问题。管理员可以通过 API 创建资源提供者,更新容量和使用信息,从而让计算节点知道哪些资源是可以用的。
举个例子,管理员可以创建一个资源提供者聚合(aggregate),把某个机架上的所有 Ceph 存储节点都放进去。然后创建一个资源池来代表 Ceph 存储。通过两条 REST API 请求:第一条创建资源提供者,第二条把资源提供者和聚合关联起来。最后更新资源池的容量,填上共享磁盘的总空间。
定性资源(Qualitative Resources)或特性(Traits)
资源提供者主要管理启动请求时的定量(quantitative)资源,比如内存、CPU 等。它有一堆库存和分配对象来管理这些定量请求。当虚拟机(instance)从资源提供者那里获取资源时,库存就会减少。
但是,资源提供者还得管一些不能被消耗的、定性的(qualitative)资源。比如,用户可能要求 80GB 的磁盘空间,这是定量的;但用户还可能要求这个磁盘必须是 SSD,这就是定性的。
Placement Service 的 REST API 中有一个专门管理定性信息的部分。它有标准特性(standard traits)和自定义特性(custom traits)。标准特性可以在不同的云环境中通用,而且不能修改。
自定义特性则是管理员用来定义一些非标准的定性信息的。这些信息会被资源提供者用来做决策。通过管理资源提供者的特性,Placement Service 可以帮助调度器(scheduler)做出更好的资源分配决策。特性 API 用来存储和查询这些定性资源。
举个例子,管理员可以给一个现有的资源提供者聚合添加一个特性,标记为 SSD 存储。这个标准特性会被计算节点的资源提供者读取。当用户创建一个新的虚拟机,指定必须使用 SSD 磁盘时,调度器会把这个信息发给 Placement Service。Placement Service 会根据聚合返回相关信息给调度器。
总结
Placement Service 就像是一个超级能干的“资源管家”,它不仅管资源的数量,还管资源的“品质”。通过管理资源提供者和特性,它能帮助调度器更好地分配资源,确保每个虚拟机都能找到最适合它的资源。是不是很厉害?
Placement应用场景
在大规模数据中心中,资源的高效利用是至关重要的。Placement Service 在这种场景下发挥了巨大的作用:
1. 资源利用率优化
动态资源分配:Placement Service 可以实时跟踪每个计算节点的资源使用情况。当新的虚拟机请求资源时,调度器可以通过 Placement Service 快速找到最合适的计算节点。例如,在一个拥有数千台服务器的数据中心中,通过 Placement Service 的智能分配,可以确保资源的使用率达到最优,避免某些节点过载而其他节点闲置。
资源池管理:通过创建资源池(如 Ceph 存储池),管理员可以将多个存储节点聚合在一起,统一管理存储资源。Placement Service 会根据资源池的容量和使用情况,动态分配存储资源,提高存储利用率。
2. 多租户环境中的资源隔离
- 在多租户环境中,不同租户的虚拟机需要隔离,以确保资源的安全性和性能。Placement Service 可以通过特性(Traits)来标记不同租户的资源需求。例如,某些租户可能需要高带宽的网络资源,而另一些租户可能需要高性能的 SSD 存储。通过 Placement Service 的特性管理,调度器可以将虚拟机分配到满足这些特定需求的计算节点上,从而实现资源的隔离和优化。
3. 故障恢复和资源重新分配
- 在大规模数据中心中,硬件故障是不可避免的。当某个计算节点发生故障时,Placement Service 可以快速识别受影响的资源,并将这些资源重新分配到其他健康的节点上。例如,如果某个计算节点的 SSD 存储发生故障,Placement Service 可以通过特性管理,将受影响的虚拟机重新分配到其他带有 SSD 的节点上,确保服务的连续性。
4. 资源预留和弹性扩展
- 在某些情况下,管理员可能需要预留一部分资源以应对突发的业务需求。Placement Service 可以通过资源池和特性管理,预留特定的资源(如高性能 CPU 或大容量内存)。当业务需求增加时,这些预留的资源可以快速被分配给新的虚拟机,实现弹性扩展。
总结
Placement Service 就像是一个超级能干的“资源管家”,它不仅管资源的数量,还管资源的“品质”。通过管理资源提供者和特性,它能帮助调度器更好地分配资源,确保每个虚拟机都能找到最适合它的资源。在大规模数据中心中,Placement Service 的这些功能尤为重要,它可以显著提高资源利用率,优化资源分配,确保服务的高可用性和性能。