在金融的场景下,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 的工做原理。
首先,用 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团队 王超一