最近在开发一个基于Vmware ESXi大规模部署虚拟Rack的工具。应用场景为,有若干不同厂家,不同配置的物理服务器,每台服务器都已经安装ESXi. 物理机器的eth0都连接在Admin网络中, eth1连到Control网络。Control网络中有一个DHCP server提供DHCP服务。 虚拟Rack包含基于Vmware 虚拟机开发的三类虚拟机:1) 提供计算功能的vCompute 节点(计算节点又分为多类),2) 提供特殊组网功能的vSwitch节点,3)提供电源管理的vPDU节点。 vRACk各类节点数量由用户指定, Deploy工具根据用户提供的信息,计算没一个vRack需要消耗的物理资源,已经总的资源。然后自动查询用户提供的物理服务器资源,计算每台服务器实际剩余资源。然后根据每台服务器实际剩余资源,以及每个vRACK需要资源,自动选择部署哪个vRACK到哪台物理服务器,并需要考虑负载均衡。最后,在完成部署后,还需要根据每个vRACK,vSwitch, cPDU, vCompute比例,自动登录到vSwitch配置vSwitch端口到vCompute的映射,以及vPDU端口到vCompute的映射。最后返回给用户vRACK的Top结构,和一些必须的配置信息。所有VM都部署在Control网络中,自动从DHCP server获取IP, Deploy工具要配置vSwitch和vPDU,必须可以访问Control网络。同时,用户只能在Admin网络中向Deploy工具提交配置文件,和获取部署结果。
用了一个礼拜完成了原型开发。考虑到后期可能可能需要进一步的功能扩展,以及应用到不同的环境(如KVM,或deploy基于Docker开发的 image)。最近在考虑做一次重构,重新考虑代码结构层次,各种资源的抽象,以及各对象之间的关系。先研究一下目前比较流行的大规模部署,配置管理工具的设计思想,以做参考。Puppet做为目前最流行的配置管理工具,自然成了第一个学习对象。
Puppet是一个开源的自动管理配置工具。Puppet是一个跨平台的集中管理系统,能运行在目前主流的的Unix,Linux以及Windows系统中。Puppet使用自身描述语言,或者Ruby DSL(domain-specific language)描述系统资源已经资源状态。资源信息,状态信息称为“Puppet manifests”。
Puppet架构基于C/S 模型,服务器端保存所有客服端节点的配置信息(manifests)。Manifests中的内容可以直接应用于系统,也可以被编译为catalog并通过client-server paradigm(使用REST API)分发到目标系统。Client又成为Agent,负责收集系统信息,根据Server提供配置信息执行配置,并将最终状态返回给Server。
Catalog是一个指定节点的需要被管理配置的状态信息的描述文档,同时它还包含所有需要被管理的资源信息,以及各种资源间的依赖关系。
Puppet Agent 一般作为后台进程运行在被管理节点上。默认Agent每隔30s会向Server发送facts并请求catalog. 一旦Agent收到catalog, agent就会检查catalog的资源,状态描述,如果它发现有resource状态与描述的状态不符,则执行对该resource的相应配置以使其最终收敛到期望状态。
Agent由Puppet,Facter,Hiera三个主要部分组成。
Facter 是Puppet的一个跨平台的配置库。它负责收集节点上的facts并report给Master.
HIera是一个配置数据的键/值(key/value)查询工具。
Puppet, 执行Agent的其他所有功能。
系统中可以有一个或多个Puppet master应用。通常情况下一个Puppet master作为一个Rack application被一个Web server管理。Master控制所有的配置信息,并确保每一个Agent只请求它自己的catalog。
PuppetDB是Puppet的数据库,它管理所有平台生成的数据和检索。目前只支持Catalog和Facts的存储。DB仍在开发中,将来会扩展支持更多数据。
如上图所示,Puppet工作流程为:
1)Agent通过facter收集客户端facts信息,并将facts信息定时发送给Master并请求catalog。
2) Master收到客户端请求后,判断客户端是谁,它要做什么。并根据分类选择属于这个客户端的manifests,打包,编译为catalog分发到客户端。
3) Agent对Catalog进行验证,并执行配置。将执行过程信息和结果写入日志。
4) 配置完成后,客户端最终状态应收敛到manifests定义的状态,Agent收集最终状态,将结果和执行数据返回给Master。
Master和Agent详细交互过程如下图所示:
5, 参考资料