OpenStack集群组件—senlin

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客户端命令

1

senlin命令

和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的镜像比较小,一般的环境资源下都能成功。

7

Resize集群

假设你的集群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策略的优先级。

3

receiver

接收器提供了一个你可以从外部发送信号或外部监控软件产生告警的通道,之后伸缩操作可以被自动执行。具体的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值