集群即服务—Senlin

Overview

Senlin is a clustering service for OpenStack clouds. It creates and operates clusters of homogeneous objects exposed by other OpenStack services. The goal is to make orchestration of collections of similar objects easier.

Senlin interacts with other OpenStack services so that clusters of resources exposed by those services can be created and operated. These interactions are mostly done through the via profile plugins. Each profile type implementation enable Senlin to create, update, delete a specific type of resources.

A Cluster can be associated with different Policy objects that can be checked/enforced at varying enforcement levels. Through service APIs, a user can dynamically add Node to and remove node from a cluster, attach and detach policies, such as creation policy, deletion policy, load-balancing policy, scaling policy, health policy etc. Through integration with other OpenStack projects, users will be enabled to manage deployments and orchestrations large-scale resource pools much easier.

Senlin is designed to be capable of managing different types of objects. An object’s lifecycle is managed using Profile Type implementations, which are plugins that can be dynamically loaded by the service engine.

Architecture

The following picture depicts the high-level system architecture of the Senlin service:

Senlin-architecture.png

The main components in the picture are:

  • The senlinclient component provides the command line interface (CLI) for users to interact with the Senlin service;
  • The senlin-api service provides the RESTful APIs for the senlinclient component or other services;
  • The senlin-engine service sits behind the senlin-api service and operates on the clusters/nodes, using profiles and policies that are loaded as plugins.


一、Senlin是什么

Senlin,名字来自中文“森林”的汉语拼音,该项目由滕启明博士创立并担任PTL,目标是为OpenStack云提供集群服务(Cluster as a Service)。

二、为什么要做Senlin

Senlin项目创立的初衷是为了进一步优化解决OpenStack云中的资源池管理问题。在OpenStack云中存在大量池化的资源,比如VM、Container等。这些资源池存在一些共性的管理需求:成员可管理、规模可弹性伸缩、成员间负载均衡、被管对象和策略可定制等等。

OpenStack社区之前对此给出的方案是Heat。Heat项目参考AWS的CloudFormation,是OpenStack的编排器(Orchestrator),负责管理整个云架构、服务和应用的生命周期。

Heat基于模板文件(YAML template)实现了一种通过简单定义和配置就能实现的自动化的云部署。用户只需要在模板文件中定义所需的各种资源并指定相互之间的依赖关系,Heat会自动分析并按照依赖顺序调用相关的组件API来创建资源并构建运行环境。


Heat目前主要的功能就是一个编排器,无法扩展到支持其他服务,自动扩展(AutoScaling)的能力也很有限,也不具备HA和负载均衡的能力。因此,考虑引入Senlin来解决这些问题。

三、Senlin怎么实现

Senlin定义了一套集群管理的框架。

把OpenStack中同类对象的集合称为集群(Cluster)。集群由节点(node)组成。同一集群内的每个节点都是用相同的Profile创建出来的。注意,这里的节点和集群都是抽象对象(Object),具体是什么可通过插件(Plugins)进行定制和扩展。比如,早期的Senlin版本中,node只支持Nova Server(即Nova创建的VM)和Heat Stack(即通过Heat部署的包含计算存储和网络的一系列资源)。今年新增加对docker的支持,即node可以是一个Container。后续可能还会增加对裸机的管理,基于Ironic来实现。

除Profile可扩展外,对集群和节点进行管理的策略(Policy)也支持扩展(同样基于Plugins机制)。目前Senlin项目中已经支持的策略主要包括:部署(包括region级和zone级)、删除、扩容、负载均衡、健康管理等。具体如下图所示:


3.1 Senlin项目组成


Senlin软件最核心的部分是图中的senlin-engine,负责按照对应的policy和profile完成集群的成员管理、状态恢复、负载均衡等事情。

Engine类似一个服务端,对外开放了RESTful接口,可通过Senlin自带的命令行client或web界面进行管理和维护。目前,新版本中的senlinclient已集成到OpenStack统一的client中,使用openstack cluster –help可看到所有已支持的集群相关命令。

对应到github上,senlin由三个子项目组成:

Senlin:包含上图中的api和engine,https://git.openstack.org/cgit/openstack/senlin;

Senlinclient:http://git.openstack.org/cgit/openstack/python-senlinclient;

Dashboard:http://git.openstack.org/cgit/openstack/senlin-dashboard/

3.2 Senlin软件架构


Senlin软件的架构设计如上图5所示,和一棵“树”的形象暗合。顶部的“树冠”是policy,是集群软件对外功能的呈现,支持定制与扩展。底部的profile和driver则类似“树根”,根据具体node的类型,封装其操作接口,以支撑增删改查状态恢复之类的集群功能。中间的“树干”是engine,负责解析RPC请求,根据profile驱动具体的driver完成集群的创建,根据policy完成集群管理功能。

Senlin软件实现了一个集群管理框架,预留了很多可扩展的地方。理论上,所有同类的对象都可以用一个相应的profile来封装成node供Senlin管理,只要提供对应的driver即可。而具体的管理policy也可以根据应用需求方便的进行扩充和完善,早期只实现了部署和自动扩容相关策略,后面LB和健康管理也陆续被加入进来。另外,上图中的receiver也是个扩展点,receiver在创建时可设置对应的action,以webhook类型的receiver为例,平时守护在某URL上,一旦从该URL收到相关信号就会自动执行预设好的动作。这就为Senlin挂接其他监控服务提供了机制。

四、Senlin能用在哪里

从Senlin社区和几个Core参加各地峰会的资料来看,以下几个是Senlin的典型应用场景:

1、在虚机部署和自动扩容方面替代Heat

Senlin有针对性的实现了跨可用Zone的部署、跨Region的部署、指定节点删除、手动扩容等功能,这些应该是当时的Heat所不具备的。

2、在Magnum中用来管理容器

Senlin增加对Container的支持后在Magnum中就有了用武之地。东京峰会上腾对此有专题演讲:《Exploring Magnum and Senlin Integration for AutoScaling containers》。

3、在Sahara中管理Handoop集群。

4、基于Ironic实现物理机的部署与管理。



参考:http://www.sohu.com/a/128344530_468741

概述

Openstack是一个复杂的管理系统,主要围绕虚机(裸机、容器)管理了计算、存储、网络等资源,让每一台虚拟机都可部署、可操作、可监控。

如何使可部署、可操控、可监控演变为更容易、更流畅、更可靠是云上最大的挑战之一。因此,需要有一个组件去统一支撑这一系列复杂的工作,能够把整个云的:AS (AutoScaling) + HA (High-Availability) + LB (Load-Balancing)等功能流畅地运作起来 ,openstack集群项目senlin因此而诞生。

本文属于科普文档,主要介绍下senlin 是什么,能干什么。一些地方理解可能存在偏差。后面,我们还会从设计的角度来讲一讲senlin。

初识senlin

senlin安装

参考网址:https://docs.openstack.org/developer/senlin/install.html

你只需要做下面的操作即可完成包含了senlin组件的 devstack环境的安装:

1下载 DevStack

2拷贝原始local.conf

3配置devstack的local.conf

在刚刚下载的devstack目录下配置local.conf文件

可选的, 如果你希望senlin的对外API服务运行在Apache服务下,你可以配置 SENLIN_USE_MOD_WSGI=True 在 local.conf 文件。

4运行openstack开发环境安装

$ ./stack.sh

注:环境安装能否顺利安装成功取决与你的网络和你机器其他源(openstack、pip、apt等源)的配置情况,本文不详细说明了。

5验证你的安装

1、命令行验证senlin安装情况

如果能看到下面的信息说明你已经安装成功,senlin可以正常工作。

2、查看dashboard安装情况

界面上dashboard里Cluster部分即使senlin界面相关的操作。说明:调试环境web如果安装遇到问题没有也没关系,一般可以使用命令行替代。


Senlin客户端命令

1senlin命令

和nova使用nova开头的命令类似,senlin的客户端命令使用senlin开头。看个senlin显示集群列表命令示例:

说明:在执行客户端命令前,记得要配置下鉴权。比如到devstack目录下执行:

`source openrc admin admin `

2迁移到`openstack cluster`命令

目前,随着openstack功能的不断完善,系统越来越庞大,openstack技术委员会设计把相关功能都独立了出来,让每个组件去完成自己专注的功能和服务。比如glance独立出来专门做镜像管理,ironic独立出来专门做裸机管理等。

openstack组件的命令也跟随这一变化,各组件命令已逐步统一到openstack命令,把openstack命令功能形成一个完整的体系:比如`openstack server`对应虚机操作, `openstack volume`对应存储操作,`openstack network `对应网络管理。

本文要介绍的senlin是openstack的集群组件,对应`openstack cluster `命令。在你刚刚安装好的环境上,可以使用:openstack --help|grep '^ cluster'查看当前openstack版本所支持的集群命令情况。


最简单的demo

1创建一个profile

首先我们看一个最简单的profile模板,你可以在这儿得到这个模板:

https://github.com/openstack/senlin/blob/master/examples/profiles/nova_server/cirros_basic.yaml,并保存为.yaml格式。

这个模板假设了你已经有下面三个条件:

1)你已经创建了一个nova keypair,命名为oskey,下面命令可以帮助你实现。

2)你已经有一个neutron网络,名字为private。devstack安装后默认有这个网络,`neutron net-list`可以显示环境网络的情况。

3)你已经有一个glance镜像,名字为 cirros-0.3.5-x86_64-disk。devstack安装后默认有这个网络。`glance image-list`可以显示环境镜像的情况。

都准备好了,开始创建demo profile:

2创建你的第一个集群

执行下面的命令后我们就创建了一个集群,并给集群赋予了一个默认的profile。

$ senlin cluster-create -p myserver mycluster1

创建时你可以给集群传入以下参数

查看集群列表

$ senlin cluster-list

查看指定集群

$ senlin cluster-show mycluster1

3创建一个节点

先用nova list查看环境虚机的情况

$ nova list

使用指定的profile创建一个节点

$ senlin node-create -p myserver mynode1

查看节点列表,这儿会触发创建虚机,所以可以等一会再查看创建情况。

$ senlin node-list

查看指定节点

$ senlin node-show mynode1

再用nova list查看下虚机的情况,此时你会看到nova list会多出一个虚机。

$ nova list

4节点加入集群

把mynode1加入mycluster1集群管理

注:集群里的节点可以是不同profile,对nova.server来说,也就是说可以是不通配置的虚机。这点如果要使用HA、LB等功能时会体会到。

5节点离开集群

说明:默认的,节点离开集群后节点还是存在的。

6伸缩集群

在mycluster1集群内弹出一个节点

$ senlin cluster-scale-out mycluster1

在mycluster1集群内弹掉一个节点

$ senlin cluster-scale-in mycluster1

说明:demo的镜像比较小,一般的环境资源下都能成功。

7Resize集群

假设你的集群mycluster1下已有2个节点,执行下面动作后会变成5个节点,对应的虚机也会增加,当然如果环境资源不足,有些节点的状态将不是ACTIVE状态。

$ senlin cluster-resize -c 5 mycluster1

下面来说说senlin的设计思路

集群服务的设计思路

作为一个集群服务应该具备以下能力,senlin遵循下面的思路进行设计:

● 集群管理能力

具备集群成员管理;调度管理;动作依赖处理;锁处理等能力。

● HA

集群和成员的高可用。比如如果是虚机集群,针对虚机进行HA。

● 自动伸缩

云上的关键特性, pay-as-you-go

● 负载均衡

根据策略进行负载迁移,确保安全运行。

● 灵活的

集群可满足用户的各种定制需求,即设计要开放式。

● 可扩展

方便的增加资源类型和集群策略

Senlin设计框架和概念

我们通过下面2张图来了解下senlin的一些基本概念:


图2 senlin代码框架


图3 senlin集群框架


profile类型和profile

profile类型指senlin可以支持的profile种类,一个profile里定义了哪些域是该profile类型所需要或可选的。一个profile也可以理解为是用户定义的一类节点。

目前支持的profile类型包括os.nova.server(这儿的os是openstack的缩写); os.heat.stack; container.docker;开发中的包括ironic profile,工作流profile等。对应的用来管理虚机集群、heat集群、容器集群、裸机集群等。

使用对应的profile类型构建的模板文件可以创建定制的profile,然后创建对应定制模板的节点。

你可以使用下面的命令查看当前版本支持的profile类型:

然后使用查到的名字去显示对应的profile模板应该如何填写,比如

openstack cluster profile type show os.heat.stack-1.0


drivers

dirvers部分主要是针对openstack各组件、container等的驱动支持,用于支撑profile类型内属性实现,对普通用户来讲,可以不用关心。已支持的驱动包括:openstacksdk、nova、neutron、glance、lbaas、mistral、zaqar、keystone、heat、ceilmeter、container等。

对于openstack内的资源,senlin设计之初就和python-openstacksdk项目一起合作,力争把资源扩展和版本兼容问题大大简化。比如pike版本计划的裸机集群功能,senlin已经在openstacksdk里把ironic相关实现完成,后续在senlin组件内继续开发即可。

顺便提下senlin项目的PTL腾启明同时是senlin、heat、python-openstacksdk、zun等项目的core member。


集群

一个集群是一组逻辑对象,每个逻辑对象在senlin内部被称作为节点。Senlin提供了一个开放的集群框架,你可以同时创建管理多种类型(虚机、heat栈、裸机、容器等)的集群。一个集群内的节点可以是不同profile配置,但应该是相同profile类型。


节点

节点概念是指被senlin服务管理的逻辑目标(虚机、heat栈、容器、裸机等)。节点可以是孤立的或者同时归属于一个或多个集群。一个节点对应了一个profile配置。


policy类型和policy

策略类型是senlin可以支持的策略的种类。策略是根据策略类型定制的模板构建出的具体策略。

策略可以是在集群动作执行之前或之后进行执行,也可以是对集群或节点的一些定时的动作。

在创建一个策略对象时,通常需要指定若干重要的属性。每个具体的策略类型可能针对一些常用的属性设置了默认取值。所有内置策略类型,都有一个与之相关联的优先级取值(数值越小优先级越高),目前支持的内置策略如下:

这里的优先级分配主要考虑两个因素:其一,内置策略都是可选的,任何一个策略理论上都应该能够独立工作;其二,用户应该可以选择在同一集群上同时使用两种甚至两种以上策略。所以,策略的设计一方面要考虑自身的完整性,另一方面要考虑与其它策略组合在一起的各种可能性。

策略类型是可以给用户扩展的,扩展方法参考链接:

https://docs.openstack.org/developer/senlin/developer/policy_type.html

已支持的策略类型可以使用下面命令查看

openstack cluster policy type list

具体的策略类型模板可以使用下来命令查看,比如

openstack cluster policy type show senlin.policy.health-1.0

策略新手指南可以查看这里:

https://docs.openstack.org/developer/senlin/tutorial/policies.html


集群policy 绑定

一个policy对象可以同时被关联到多个集群;一个集群同时也可以有多个策略。

一个policy对象被绑定到一个集群后,你仍然可以使能或关闭或者更新策略的一些属性。


Receiver

Receiver用来提供senlin响应外部告警或事件的机制,然后senlin内部相关的action动作将会被创建并被调度执行。

Receiver已经支持的类型包括webhook和openstack里的zaqar组件提供的消息队列。

Webhook新手示例:

https://docs.openstack.org/developer/senlin/tutorial/receivers.html

zaqar相关的使用方法可以参考这里:

https://docs.openstack.org/developer/senlin/user/receivers.html


Action

动作主要是对集群或节点执行的操作。动作的调度是一个复杂的处理过程,每个动作被异步调度管理,动作之间会存在依赖关系处理,并且在动作执行过程中需要逻辑上的锁设计去控制集群和节点。

除了一些检索或者显示目标列表的那些API命令是同步调用,大部分的senlin API设计为异步调度。

动作也可以由用户来定义添加。


Events

Events是用来记录senlin执行过程中生成的事件,分为5个等级。对这些事件senlin提供了事件派发机制供用户采集。目前提供了两种内置派发机制:database和message。

事件派发采用plug-ins方式设计,你可以开发你自己的派发机制。参考文档如下:

https://docs.openstack.org/developer/senlin/developer/event_dispatcher.html

senlin工作架构

senlin可以支持管理虚机、heat栈、docker等集群同时在一个系统里一起工作,裸机集群管理正在开发中。

一般来说我们假设你已经使用senlin去创建对应的节点和对应的集群,然后你就可以使用 senlin去管理这些集群后续的生命周期。

可能有一种情况,你想使用senlin构建集群并管理集群的生命周期,但最初版本商用时没有使用senlin来部署这些物理上的节点(比如虚机),也没关系,senlin的收养功能正在讨论开发中。

https://blueprints.launchpad.net/senlin/+spec/senlin-adopt-function

前面我们了解了senlin的框架和基本概念后,下面我们结合下图来看看senlin的工作架构,到底是如何实现:“节点部署+AS (AutoScaling) + HA (High-Availability) + LB (Load-Balancing) +操作”等all in one。


4 senlin工作架构


节点、集群部署

如图所示,我们从profile开始作为起点,首先创建一个或多个profile,然后就可以用这些profile直接去部署节点。可以部署虚机、heat stack、容器、裸机等节点类型。然后可以随意的组合加入或离开集群。

特别的,对于虚机部署,可以在os.nova.profile里支持管理节点绑定等特性。

https://docs.openstack.org/developer/senlin/scenarios/affinity.html


弹性伸缩

同样,我们从profile构建出集群后就可以去伸缩集群内的节点。Senlin提供了丰富的设施集合去构建自动伸缩方案:

1集群伸缩基础命令

CLUSTER_SCALE_OUT和CLUSTER_SCALE_IN 是简单的命令形式去伸缩集群。CLUSTER_RESIZE操作,提供命令则了更多的集群改变的操控细节。

这些操作在进行时可以带策略或者不带策略去执行。

2伸缩时可绑定的Policies

目前伸缩时可以同时绑定的策略包括:

The senlin.policy.scaling policy can be applied to fine tune the cluster scaling operations.

The senlin.policy.deletion policy can be attached to a cluster to control how nodes are removed from a cluster.

The senlin.policy.affinity policy can be used to control how node affinity or anti-affinity can be enforced.

The senlin.policy.region_placement can be applied to scale a cluster across multiple regions.

The senlin.policy.zone_placement can be enforced to achieve a cross-availability-zone node distribution.

前面说说过策略是有优先级的,以Scaling策略和Deletion策略为例。前者主要负责决定在参数缺失或者最终扩缩节点个数待定时判定需要增加或减少的节点个数;后者主要关注在集群规模被缩小时,具体选择哪些节点从集群中移除。当两种策略都被应用到同一集群时,对集群的收缩操作首先要评估需要移除的节点个数,其次才是具体的节点选择问题。因此,Scaling策略的优先级高于Deletion策略的优先级。

3receiver

接收器提供了一个你可以从外部发送信号或外部监控软件产生告警的通道,之后伸缩操作可以被自动执行。具体的receiver的概念在senlin概念部分已经介绍。

LB

参考链接:https://docs.openstack.org/developer/senlin/user/policy_types/load_balancing.html

HA

Openstack里HA是个很大的话题,包括控制节点的HA,一般使用专业HA软件进行控制节点上openstack服务本身的HA。而对于控制面、虚机以及计算节点的HA一直没有好的解决方案。

Senlin作为集群管理。首先,需要对集群及集群内节点的健康状况进行管理,其次如果是控制平面或者网络等发生了故障,senlin也应该通过receiver等机制进行得到需要执行的动作并做相应的动作执行(比如REBOOTREBUILD等),自动恢复故障。

你可以绑定其他策略的同时绑定健康策略到集群之后。

健康策略可以定时:轮询执行策略检查集群及节点,如果发现故障,根据策略里的动作进行恢复。

也可以有监听,比如监听os.nova.server的CREATEDELETE等事件,heat.stack的删除事件等。

目前基本功能已经支持,还在做的进一步优化:

1)允许用户指定多个后续动作,供健康引擎进行逐一尝试。

2)动作应该有工作流控制,参见下面BP。

https://blueprints.launchpad.net/senlin/+spec/workflow-recover

3)进一步的,引入大数据分析,根据大数据提供的信息结合配置的监控策略的决策出应该执行什么动作,自动进行恢复。


操作集群

在Newton版本中,Senlin允许用户批量汇总某个集群中各个节点的特定属性,形成一个属性列表。这一操作在senlin引擎中执行时首先会根据需要调用模板类型所提供的get_details()方法以获得物理资源的深层次属性信息,然后针对所获得的属性结构数据执行JSON路径匹配,将结果汇总到JSON列表中返回给用户。一种常见的使用场景是用户需要获得某集群中全部虚拟机节点经由DHCP服务所分配到的IP地址。

在Ocata版本中,Senlin进一步扩充了每种模版类型的可用操作集合。用户可以通过命令查看每种模版类型所特有的操作(如reboot操作之于Nova虚机)及其所需参数,也可以通过命令在集群的全部(或部分)节点内部批量执行这样的操作。


场景示例

这边举几个简单示例:

Autoscaling using Ceilometer/Aodh

使用哪种外部数据源是可选的,这儿举个Ceilometer/Aodh的例子

https://docs.openstack.org/developer/senlin/scenarios/autoscaling_ceilometer.html


Autoscaling with Heat

个人理解,Senlin和heat的层次可以有3种关系,在一套云环境中可以在多个地方同时使用下面不同的层次。

1、senlin位于heat下面:heat的资源类型中包括senlin的profile、cluster、node、policy等资源,可以用heat去编排,然后用senlin去做集群管理。

2、senlin位于heat上面:通过senlin去管理heat栈,管理heat栈集群。

3、senlin和heat同层,senlin管理虚机集群,容器集群,裸机集群等。上一节的示例就是这种模型。

本节我们看看senlin位于heat下面的用法,这种模型下,senlin会让heat模板简单无嵌套,并且前面提到的senlin工作架构的一系列事情可以轻松的完成:

https://docs.openstack.org/developer/senlin/scenarios/autoscaling_heat.html


虚机和容器集群统一管理示例

1自动伸缩

该示例中,一个虚机集群里弹出一个虚机并在虚机上弹出一个容器,容器归属于某个容器集群。

弹出的虚机和容器都在senlin的后续生命周期管理内。

2自动健康管理

该示例通过自动伸缩后某个状态下,内部或外部监测到虚机VM3出现了故障,自动弹出一个新的VM4,同时某容器集群也会被检测到健康问题,自动在VM4上生成新的容器。故障自动恢复。

3控制平面健康监测恢复

Senlin在控制平面管理里作为动作执行和管理者,管理集群和节点的监控状态。

当虚机、容器都是OK,但是控制平面出现了网络,存储等故障时,通过专业监控软件发送消息给senlin,senlin进行动作执行故障恢复。

其他场景

其他一些场景,后续再深入介绍:

1、Tacker+senlin

2、Magnum+senlin

3、Ks8+senlin


猜你喜欢

转载自blog.csdn.net/u011956172/article/details/79881990
今日推荐