宜信开源|一个实例解析PaaS平台LAIN的9大杀手级功能

1、基于Docker的PaaS平台LAIN

在金融的场景下,LAIN 是为解放各个团队和业务线的生产力而设计的一个云平台。LAIN 正式上线已经大约两年,基本已经成熟,为宜信大数据创新中心各个团队提供了统一的测试和生产环境,简化了服务的部署与上线流程,也下降了运维人员对系统管理的复杂度。nginx

LAIN 规范了一个应用的开发、测试、上线工做流,提供了为应用作的容器编排、权限控制、SDN、流量管理、监控报警、备份、日志等 devops 问题的总体解决方案。(扩展阅读:宜信开源|详解PaaS平台LAIN的功能和架构)git

在 LAIN 上,应用是一个基本的概念,某个应用的开发者只须要定义一个 lain.yaml 便可定义应用的编译和运行方式,对应用代码侵入性很低。LAIN 基于容器技术,面向多样化的技术栈,而且自然隔离系统和应用的依赖。github

当 LAIN 用户建立一个应用(服务)时,能够到 LAIN 上注册该应用,当前的用户自动成为了该应用的维护者,拥有了进一步操做该应用的权限。构建应用的环境须要 docker 和 lain 命令行工具,为了方便,咱们建立了一个 vagrant box 即 lain-box. 在构建应用时,除了工程代码外,还须要一个 Docker 镜像做为基础镜像,即编译的环境。若是是二进制的工程,如 golang,则能够在运行时换掉一个底,不然会使用 build 镜像为 release 镜像。准备好镜像和编译/运行的脚本后,就能够编辑 lain.yaml 了。golang

具体来讲,lain.yaml 主要作了以下四件事:web

一、应用名称的肯定,体现一个应用的边界docker

二、应用的基础技术栈,即编译和运行的镜像数据库

三、构建过程(如何编译)安全

四、微服务拆分及服务内部配置(如何运行、运维)网络

关于第4点,LAIN 上有一个 Proc 的概念,即每一个应用都有一个或多个 Proc,Proc 在应用内有惟一的名字和类型,Proc 在底层对应于一组容器,一个应用之间的各个 Proc 的各个容器的网络是互通的,因此应用就是能够互相信任的几个 Proc,对外表现为现实中的某项功能。Proc 的类型是 LAIN 内置的,worker 类型是最简单的类型,LAIN 处理其它的 Proc 类型会作一些额外的事情。架构

在应用的层面上,LAIN 除了用 lain.yaml 将一个应用的依赖和行为固化外,还有如下几大亮点:

一、SDN 网络安全隔离

  • 使用 calico 项目构建 SDN 网络

  • 高效率的应用内网络互通

  • 应用间网络默认隔离

  • 显式声明应用间的服务互访

二、应用权限的控制

  • sso 单点登陆,统一认证

  • 利用 sso 的组管理,console 进行应用维护者的权限管理,包括 registry 的镜像的权限和应用维护的权限

接下来,咱们以一个最简单的 web 服务为例,来讲明 LAIN 的工做原理。

2、经过实例看LAIN 的9大功能

首先,用 go 写一个简单的 web 服务,hello.go

下一步,编辑 lain.yaml 文件:

能够看出,lain.yaml 定义了如何编译,发布,测试一个应用。注意到 hello 应用只有一个 Proc,web 是 web.web 的简写形式,即 Proc 类型和名字都是 web. 对于每个 Proc,LAIN 提供了几个杀手级功能:

一、动态扩容缩容

能够在 lain.yaml 中定义一个 Proc 的实例数量,即 num_instances,能够定义每一个实例所用的内存,也能够在命令行或 console 的 UI 上动态对实例个数以及所用内存大小进行调整。动态扩容缩容会自动注入一些 swarm 的 filters,保证同一个 Proc 的实例调度到不一样的节点上。

二、volumes

即 docker 的 volume,若是配置了该字段,每个实例都对应拥有一个节点上的文件目录。虽然大部分状况下,加入 volume 意味着加入了状态,不利于 HA,但有些特殊状况好比数据库容器化时,volume 仍是必须的。LAIN 的 volume 的精彩之处是能够配置一个备份策略,lain 有一个组件能够支持自定义备份,在备份过程先后还能够自定义脚本,这些自定义脚本什么时候运行的配置类同 crontab 的调度策略,至关于能够在容器里定义一些 cron job。

三、cloud_volumes

因为某些数据须要高可用,另外 Proc 中不一样的实例可能须要共享一个 volume,LAIN 集成了分布式文件系统,比方说 ceph 和 MooseFS,cloud_volume 比普通的 volume 多一种使用方式,即全部的 instance 共享同一个分布式文件系统目录。

四、logs

本质上仍是 docker volume,可是定义在 logs 字段下目录包含的文件会被 lain 的日志收集系统收集,效果等同于输出到标准输入输出。这样咱们能够统一管理、查询全部应用的日志。

五、secret_files

考虑到一次编译要在不一样集群(如测试、生产集群)上运行,那必然会致使一个问题,就是如何加载某些配置,如数据库用户名和密码,将这些配置写入代码仓库会带来明显的安全问题,也不方便自动集成和不一样集群上的部署,LAIN 经过内置的 lvault 组件实现了代码与配置的分离,每个 LAIN 集群都有一个自带的配置中心 lvault,加密存储着全部该集群应用的配置文件。只有应用管理者有权限管理应用的配置文件。这样,用户将不一样集群的配置分别写到对应的 lvault 中,便可用将同一个镜像推送到不一样的集群中并部署运行。

六、web 类型的 Proc

  • 相关 nginx 配置的自动化:web 类型的 Proc 的流量会由一个基于 nginx 的组件 webrouter 作负载均衡,对于不一样的 Proc,集群有默认的 mount point,也能够自定义新的 mount point,即 servername 或 baseurl; 也能够定义 health check 等诸多实践上必须的功能。

  • watcher 会自动刷新 nginx 配置

  • 日志系统会自动收集 nginx 日志

七、虚IP

虚 IP 是为了保证某个 Proc 的高可用而设计的一套机制。

  • Proc 能够注册一个或多个虚 IP,应用能够经过虚 IP 对外服务,好比 webrouter 能够用虚 IP 机制去除 nginx 的单点

  • networkd 动态维护虚 IP:在 etcd 配置虚 ip 后,各个节点的 networkd 会获得通知,若是对应的 Proc 的实例调度到本节点上,则 networkd 会激活该节点配置 vip 和 iptables 规则,保证流量能够到达实例容器。若是一个 Proc 注册了多个虚 IP,networkd 会尽可能将不一样的虚 IP 分配到不一样的节点上,因为容器是默认分散到不一样的节点上的,因此这样能够保证很严格的高可用。

八、Filters

LAIN 支持 swarm 的 constraint 和 affinity 等容器调度的参数,使得容器的调度更加合理,比方说默认同一个 Proc 的容器尽可能调度到不一样的节点上,最新的 LAIN 还支持用户自定义 Proc 的 label 以及 Filters。

九、容器的监控和报警

利用本身开发的 collectd 插件,监控容器的基本运行时数据,集成了 Carbon,Whisper,Graphite-Web,Grafana,icinga2 等开源组件,团队开发了 hedwig,hagrid 两个组件,提供了一整套监控报警系统。

对集群而言,一个应用的部署大体通过这么几个阶段:

1)console 经过 lain-sdk 对 lain.yaml 进行解析,为应用建立 network,建立 calico profile, 建立 sso 的应用维护者组.

2)console 调用 deployd 的接口,deployd 完成容器的编排,也提供了应用在线扩容缩容等 API,进行自动维持和灾难恢复,并将一些重要的数据写入 etcd 中

3)lainlet 监听 etcd,networkd 和 webrouter 里的 watcher 经过 lainlet 拿到集群的最新配置,来完成虚 IP 的自动漂移和 nginx 配置的自动更新等。

总之,LAIN 在最开始的设计中较多地考虑了安全性,包括了 SDN 网络和应用权限的管理,秘密文件配置系统;在实现中,考虑到了多种技术栈的支持和容器化带来的优点,提供了包括备份、日志、监控报警等一揽子解决方案,可以让应用使用者方便地开发各类特性的应用,提升了生产力;最后,对于 LAIN 集群维护者,LAIN 提供了不少运维工具,包括 LAIN 节点的加入删除,应用容器的手动迁移,节点的维护模式等等,基本上知足了从平常运维到灾难恢复的方方面面。

GitHub地址https://github.com/laincloud

白皮书https://laincloud.gitbooks.io/white-paper/content/

原文发布于“高可用架构”

做者:宜信大数据创新中心LAIN团队 王超一

相关文章
相关标签/搜索