写点什么

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

2020 年 2 月 11 日

一个实例解析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 年 2 月 11 日 17:46299

评论

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

Pandas实战案例-冷空气活动寒潮级别分类

小小明

图解 | 原来这就是 IO 多路复用

云流

Java 程序员 架构 面试

关于 JavaScript 闭包

程序员海军

JavaScript 前端 闭包

将word试卷匹配转换为结构化表格

小小明

Python word

KeyChrone-K8使用体验

ITCamel

AI技术在小程序生态质量保障方向的落地实践

百度Geek说

小程序 AI

批量从Word中提取图片

小小明

Python

APK反编译

行者AI

编译

Hello World !!!

潮湿了我押韵的心情

高并发下的Redis分布式锁

java_wxid

Java redis 高并发 分布式锁 setnx

单线程、多线程和协程的爬虫性能对比

小小明

Python 爬虫

MySQL锁等待与死锁问题分析

Simon

MySQL 死锁

layui使用templet格式化表格数据

使用VUE和Element 创建一个dialog对话框组件的详细过程

尔嵘

CloudQuery v1.3.5 上线!

CloudQuery社区

数据库 oracle 运维 开发工具 dba

互联网大厂100道Android面试题助你冲关金三银四!附小技巧

欢喜学安卓

android 程序员 面试 移动开发

AI技术在小程序生态质量保障方向的落地实践

百度开发者中心

百度智能小程序

程序员:如何写出斗帝级简历?

Java架构师迁哥

用户需求差异化需要更专业的云管理平台 | 演讲实录

BoCloud博云

云计算 多云管理

剖析Android开发未来的出路在哪里,终局之战

欢喜学安卓

android 程序员 面试 移动开发

Android内存泄漏检测之LeakCanary2.0(Kotlin版)的实现原理

vivo互联网技术

android kotlin 内存泄漏

Java岗位阿里+字节+滴滴+美团+腾讯+百度+京东12万字面试题总结

Java架构追梦

Java 阿里巴巴 架构 腾讯 面试

太厉害了!阿里面试官告诉我的“面试通过要点”,让我成功面进阿里

互联网架构师小马

Java 面试 找工作 应届生

Python实现excel公式格式化工具

小小明

Python Excel

HashMap加载因子为什么是0.75?

java_wxid

Java 面试 hashmap HashMap底层原理 加载因子

产品经理训练营 - 作业六

胡小湖

vue+element中引入百度地图

尔嵘

Vue Element 百度地图

MySQL四大属性(特性) 底层实现原理

java_wxid

Java MySQL 数据库 面试 底层实现原理

iOS 面试策略之简历的准备到面试流程

iOSer

ios 面试

nginx配置日志为json格式,nginx按照天实现日志分割,nginx配置负载均衡

Ng

最火前端Web组态软件(可视化)

尔嵘

前端 可视化数据分析搭建 web组态 托拉拽组态

开源中间件技术学习路线

开源中间件技术学习路线

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