集群即服务—Senlin

Posted 翟海飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集群即服务—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:

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可以支持的策略的种类。策略是根据策略类型定制的模板构建出的具体策略。

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

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

以上是关于集群即服务—Senlin的主要内容,如果未能解决你的问题,请参考以下文章

应用服务器集群的伸缩性设计

大型网站技术架构--网站的伸缩性架构(转)

18 应用服务器集群的伸缩性设计

18 应用服务器集群的伸缩性设计

18 应用服务器集群的伸缩性设计

软件架构设计学习总结(12):大型网站技术架构网站的伸缩性架构