OpenStack 集群组件—Senlin

概述

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

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

Senlin 是什么

Senlin,名字来自中文“森林”的汉语拼音,该项目由滕启明博士创立并担任 PTL,Senlin 是专为管理其他 OpenStack 服务中同类对象而设计的集群服务(Cluster as a Service)。它的特点在于拥有一个开放的框架,开发者能够为指定类型的对象提供插件以实现托管,以及在特定集群运行时想执行的策略。简而言之,它们能够为编程/管理 OpenStack 云提供一个阵列数据类型。

为什么要做 Senlin

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

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

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

0d77c12444f78b7e9d96fdda0611f583

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 级)、删除、扩容、负载均衡、健康管理等。如下图所示:29257bca87061ee1d7f62a38c7062b0a

Profile 是 Senlin 服务的基础配置,Profile 文件用来定义资源,cluster 或者 node 在创建的时候从 Profile 进行创建,解析 Profile 后 Senlin 调用 OpenStack 相关服务创建资源实例,并在 Senlin 服务中进行管理。

伸缩能力的通过两种方式提供:

  1. 直接调用 Cluster 的相关伸缩接口,包括以下几种:

  2. 用 Receiver 对象接收伸缩请求

Receiver 创建成功后会生成 alarm url 地址,此地址即是出发 Rluster 做操作的请求链接。所以此地址是私有的,像密码一样不可公开。

alarm url 地址可以在创建 aodh 告警的时候设置为 alarm 的 alarm_actions 操作列表,一旦 alarm 触发告警,会自动向 alarm_actions 发送请求,达到自动伸缩的能力。

Senlin 项目组成

Senlin-architecture

整个 Senlin 架构简单清晰,外部通信使用 REST API,内部使用 RPC,senlin-engine 是 Senlin 中最核心的处理进程,所有的核心逻辑都在 senlin-engine 进行处理,负责按照对应的 policy 和 Profile 完成集群的成员管理、状态恢复、负载均衡等事情。

Senlin-api 对外提供 OpenStack 原生的 REST API,接收用户请求,将请求通过 RPC 发送给 senlin-engine 处理,并将处理结果返回给 API 调用者,senlinclient 或者其他服务可以调用 API 来对集群进行管理和维护。

Senlin-dashboard 是 horizon 的一个 UI 插件,用户可以通过界面创建 Profile,Policy,集群等资源。

目前,新版本中的 senlinclient 已集成到 OpenStack 统一的 client 中,使用 openstack cluster –help 可看到所有已支持的集群相关命令。

对应到 git 上,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/

Senlin 软件架构

2234f5413c2b85a90a79dd605c2bfcbc

Senlin 软件的架构设计如上图所示,和一棵“树”的形象暗合。顶部的“树冠”是 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-object

  • Cluster

集群是同类对象(比如 Node)的集合,集群中包含 0 个或多个 Node,这些 Node 会和 Policy 相关联。Cluster 支持伸缩,会根据关联的 Profile 进行伸缩。

  • Node

Node 是 Senlin 服务中的一个逻辑对象,Node 通常代表 OpenStack 中一个资源,比如一台虚拟机,一个云硬盘。Node 可以并最多属于某一个 Cluster,也可以是不属于任何一个集群(orphaned node)单独存在的 Node,但同一集群中的 Node 必须关联相同类型的 Profile。

  • Profile

a768fdc4cecf71227e535a32671f1d9c

2e41e98e4e02fdf8274ed3f4cae92252

创建 Node 的时候我们需要选择 Profile,Profile 定义了资源的一些属性。我们创建 Node 的时候会调用 OpenStack 相关服务来创建 OpenStack 资源。可以认为 Profile 是创建 Node 的模版,与 Heat 模板文件一样, 支持 nova, heat, 容器。

  • Policy

在 Senlin 中,Policy 绑定在 Cluster 对象上,是 Action 在执行时的约束条件。用户可以给集群绑定 policy,针对一个集群可以配置不同的策略,这些策略可以来管理集群中的资源,根据这些策略可以实现集群的自动扩展,负载均衡,高可用等功能。

5f12e5c9910d9e096be8b84799ad73c2

  • Receiver

接收告警请求,按照 Action 自动执行 Cluster 相关操作,对外提供一个 url 地址, 执行 Post url 地址能够改变集群中的节点数。

  • Actions

Cluster 和 Node 可执行的操作。

Senlin 能用在哪里

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

  1. 自动扩容

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

  2. 负载均衡

    根据负载均衡 policy,可以实现 lb member 的自动增加或者减少。

  3. 虚拟机 HA

    虚拟机 HA 是一个企业级的功能,Senlin 会检测 Node(虚拟机)的状态,当这个节点宕机时,会启用相关的 recovery 策略。

  4. 在 Magnum 中用来管理容器

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

  5. 在 Sahara 中管理 Handoop 集群

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

Senlin 相关功能

  • Senlin AutoScaling

Heat 的设计是基于 AWS 的,不够通用,目前我们认为 Heat 的作用更多的在于基于模版的资源管理,它的重点不在于 AutoScaling、HA,而是作为一个引擎来帮其他服务或者开发者做资源管理的工作。而 Selin 项目本身就是针对集群与 AutoScaling 设计的。

| 名称 | 支持类型 | | —— | ———————————————————— | | Heat | 支持通过 Ceilometer Alarm 的方式触发 webhook 提供 autoscaling 自动伸缩, 支持创建 Loadbance 负载均衡 | | Senlin | 支持 Receiver 对外提供 url, 上层可根据需要如:根据时间、根据特定情况、根据 alarm 警告触发 url,实现 autoscaling 自动伸缩, 支持创建 Loadbance 负载均衡 |

Senlin AutoScaling 架构

  • Senlin 集群实现基本步骤

    1. Senlin 通过 profile 构建集群
    2. 为集群添加策略(策略中定义添加/删除 节点数)
    3. 创建 Receiver 提供 webhook 地址 url
    4. 根据需要触发 webhook url 实现策略定义(触发 webhook url 的包括 ceilometer alarm、上层时间计划、特定需要)
  • Senlin 集群节点扩展与删除

Senlin 中提供了对集群中的节点扩展与删除操作,添加与删除的节点满足集群中的最大与最小值, 支持在集群中创建节点,同样支持将 Senlin 创建的节点添加到集群中。

  • Senlin 集群定义节点数

Senlin 在创建集群时支持指定创建集群中的节点数,当最小为 0 时,支持创建一个空集群,后期根据需要为集群中添加节点。

  • Senlin 集群策略支持

Senlin 集群支持自定义策略,策略类型包括删除(可根据需要删除集群中的指定节点)、Scaling 策略(提供自动伸缩策略)、Loadbance 策略(支持集群提供负载均衡)、健康检测策略(根据健康检测结果,替换掉集群中出现故障的节点)。

  • Selin 跨区域支持

Senlin 支持节点跨区域管理(nova zone 的概念)。

  • Senlin 支持事件记录

Senlin 根据集群中触发的事件,记录事件的时间与触发的条件。

  • Senlin 支持集群 Resize 操作

Senlin Resize 允许修改集群中的最大、最小、期望、添加节点数。

Senlin 部署条件

  • Senlin 发布第一个版本为 mitaka 版本, 安装时需要的认证必须为 keystone v3 版本
  • Senlin 的 loadbance 策略支持的 loadbance 必须为单独服务,必须配置单独的 endpoint
  • Senlin 不提供 alarm 警告创建, 上层使用时根据需要创建 alarm,创建的 alarm 绑定 cluster id,webhook 执行动作为 senlin 中的 receiver 提供的 alarm_url 链接
  • Senlin 要实现根据时间,根据特定计划触发 receiver 中的 alarm_url 链接需要上层配置计划,配置触发 alarm_url 链接
  • Senlin 在使用中需要 openstacksdk 支持, openstacksdk 实现了各个组件组件的调用

参考链接