【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

一个实例解析 PaaS 平台 LAIN 的 9 大杀手级功能

  • 2020-02-11
  • 本文字数:3036 字

    阅读完需:约 10 分钟

一个实例解析PaaS平台LAIN的9大杀手级功能

一、基于 Docker 的 PaaS 平台 LAIN

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


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


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


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


具体来说,lain.yaml 主要做了如下四件事:


1、应用名称的确定,体现一个应用的边界


2、应用的基础技术栈,即编译和运行的镜像


3、构建过程(如何编译)


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


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


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


1、SDN 网络安全隔离


  • 使用 calico 项目构建 SDN 网络

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

  • 应用间网络默认隔离

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


2、应用权限的控制


  • sso 单点登录,统一认证

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


接下来,我们以一个最简单的 web 服务为例,来说明 LAIN 的工作原理。

二、通过实例看 LAIN 的 9 大功能

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


1558336463014000125.png


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


1558336476586082813.png


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


1、动态扩容缩容


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


2、volumes


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


3、cloud_volumes


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


4、logs


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


5、secret_files


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


6、web 类型的 Proc


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

  • watcher 会自动刷新 nginx 配置

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


7、虚 IP


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


  • Proc 可以注册一个或多个虚 IP,应用可以通过虚 IP 对外服务,比如 webrouter 可以用虚 IP 机制去除 nginx 的单点

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


8、Filters


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


9、容器的监控和报警


利用自己开发的 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 节点的加入删除,应用容器的手动迁移,节点的维护模式等等,基本上满足了从日常运维到灾难恢复的方方面面。


本文转载自宜信技术学院网站。


原文链接:http://college.creditease.cn/detail/248


2020-02-11 17:46654

评论

发布
暂无评论
发现更多内容

模块五作业

HZ

架构实战营 #架构实战营

GitHub上14个屌炸天的Java进阶教程、面试真题项目,建议收藏

爱好编程进阶

Java 程序员 后端开发

全链路压测(十一):聊聊稳定性预案

老张

性能测试 全链路压测

架构实战营总结

晨亮

「架构实战营」

集成 ShenYu 网关实现 Dubbo 泛化调用

码农大熊

盘古开发框架 Dubbo网关 泛化调用 ShenYu网关

面向对象的系统分析

奔向架构师

信息系统 5月月更

在线HTML文本提取URL链接工具

入门小站

工具

ftp命令解决文件的上传和下载

爱好编程进阶

Java 程序员 后端开发

抖音严打虚假宣传滋补膳食内容广告主:必须严格监管信息流广告

石头IT视角

python使用 pywin32 模块操作 excel,Python 操作 excel 系列之五

梦想橡皮擦

5月月更

机器学习:真正的底层是什么?

海拥(haiyong.site)

5月月更

java内存模型之happenbefore原则

急需上岸的小谢

5月月更

Github已标星80

爱好编程进阶

Java 程序员 后端开发

模块五:作业

本人法海

「架构实战营」

Nacos源码系列—服务端那些事儿

牧小农

源码 nacos

八、高可用之故障隔离

穿过生命散发芬芳

5月月更 高可用设计

模块5 作业

KennyQ

百万级电商秒杀架构设计

晨亮

「架构实战营」

Nginx 的日志

HoneyMoose

GitHub持续霸榜!2021年Java核心知识:面试突击版

爱好编程进阶

Java 程序员 后端开发

2021 企业架构(EA)状态调查报告

涛哥 数字产品和业务架构

企业架构

【愚公系列】2022年05月 二十三种设计模式(八)-组合模式(Composite Pattern)

愚公搬代码

5月月更

复杂任务中,流程的解耦设计

架构 事件驱动 任务管理 异步设计

linux之man命令

入门小站

JAVA为什么需要泛型?

源字节1号

软件开发 后端开发 小程序开发

ElasticSearch入门(三)Logstash实现MySQL数据同步至ElasticSearch

爱好编程进阶

Java 程序员 后端开发

python之pythonic

AIWeker

Python 人工智能 5月月更

如何开发LAXCUS分布式应用软件(一):前言

LAXCUS分布式操作系统

集群 并行计算 分布式操作系统 分布式应用软件

C语言_语句与位运算练习

DS小龙哥

5月月更

赫卡忒的眼眸:微光手机“夜视仪”是怎样炼成的?

脑极体

【建议收藏】Mysql知识干货(mysql八股文)汇总

利志分享

面试 面试题 MySQL 数据库 面试问题 MySQL InnoDB

一个实例解析PaaS平台LAIN的9大杀手级功能_技术管理_王超一_InfoQ精选文章