Alodi:环境创建从未如此简单
一个满足你各种想象的快速方便生成临时环境的系统
在『Alodi:为了保密我开发了一个系统』文章中有讲到我们开发了一个系统用来快速生成临时测试环境,短短三个月已有数百个环境被创建,简化了工作,节省了时间,同时也受到了小伙伴们的肯定,本篇文章介绍一下Alodi的实现原理,以及更新的功能
实现目的
Alodi主要的目的是以最简单快速的方式来创建一个测试环境,同时生成一个随机的临时访问地址提供访问
创建一个环境究竟有多简单呢?就像下边这样:选择项目-->点击“创建环境”-->输入Tag-->点击“Build&Deploy”-->等待创建完成
创建完成之后,可以在部署列表里找到创建环境的任务,在这里可以直接通过域名访问新创建的环境,或进行一些管理,例如创建过程中的日志查看,容器Log查看,进入容器终端排错,绑定新域名,或是销毁环境
创建过程
创建临时环境通过Django的Celery来异步完成,同时通过Django的Channels来建立WebSocket通道实时获取任务日志输出
相同部署发布流程的项目会编写统一的模板,例如JavaWeb项目会编写一个适合所有JavaWeb项目的模板,NodeJS项目会编写一个适合所有NodeJS项目的模板,创建临时环境实际上就是通过Celery执行了一个任务模板
任务模板内定义了这个任务要做的事情,大体上包含以下内容:创建临时目录-->拉代码-->编译-->生成DOCKERFILE-->打包Docker镜像-->上传镜像到私有仓库-->创建Kubernetes资源-->检查Pod状态-->完成
每一次任务都会生成一个全新的环境,一个全新的域名,所以无论有多少个版本多少个用户在并行测试都不会相互影响
临时域名
每一次都生成一个临时的域名提供访问,这样做的初衷是希望自己生成的环境只有自己知道,避免公共域名的传播,在一定程度上实现保密
域名绑定Kubernetes的ingress,可以实现通过域名访问到对应的容器,这里需要思考的一个问题是:需要给每个临时域名创建DNS解析吗?
员工的电脑上都配置了内部DNS,而这个DNS不支持API操作,所以在开始的时候考虑的两种方案
- 用户自己绑定hosts
- 新建DNS,支持API
这两种方案都不是很好,新建DNS还需要用户都修改自己的DNS指向到新DNS,而绑定hosts无疑会增加使用成本,那该如何处理呢?
DNS泛域名解析,利用通配符*
来做次级域名以实现所有的次级域名均指向同一IP地址
在内部DNS上创建一条匹配所有的次级域名的记录,指向到Kubernetes的Ingress服务器,例如
*.ops-coffee.cn -> 192.168.107.143
这样无论生成任何xxx.ops-coffee.cn
的域名都可以请求到Kubernetes的Ingress,然后Ingress转发请求到对应的service,最终到pod,完美的解决了这个问题
域名绑定
解决了域名访问的问题,还面临另外一个问题就是用户有需求绑定生产域名进行测试,因为有一些第三方平台,例如微信分享等是有域名白名单的,只有白名单内的域名可以进行操作,这种情况下生成的临时域名就无法使用了,需要支持绑定生产域名进行测试
Alodi系统内绑定新域名也非常简单,只需要点击“绑定新域名”按钮,填写对应的域名提交就好
绑定新域名实现原理是多添加一个Ingress,与已存在的service相关联,同时会维护一个新绑定域名与Service的关系表,主要目的是在绑定新域名时判断域名是否已经被绑定,因为Ingress绑定的域名不能重复,如果发现有用户绑定已经被绑定过的域名则会提示其与先绑定的用户协商使用
由于可以绑定任意域名,所以没办法添加DNS解析,故这里需要用户自己绑定hosts了
容器操作
毕竟是测试环境,出现问题是难免的,一旦有问题用户就需要拉日志,甚至是登陆系统debug排查
应用内的日志有接入ELK系统,容器的启动日志Alodi系统也提供查看功能,点击“Log”按钮即可查看
Log查看通过调用Kubernetes API的read_namespaced_pod_log
方法来实现,Kubernetes的API比较多,鉴于篇幅不在文章中细说,有整理一份文档:Kubernetes Python API中文使用说明
SSH进入Pod容器也给集成到了Alodi系统中,之前有一篇文章专门介绍:Django实现WebSSH操作Kubernetes Pod,有很多小伙伴按照文章内容实现了集成
销毁环境
Alodi系统希望用户能够快速创建环境,用完销毁环境,不长时间占用资源,所以设计了定期销毁和用户主动销毁策略,定期销毁是会销毁超过n天没有使用的环境,而主动销毁只需要点击“点击销毁”按钮即可
销毁环境会删除创建的临时目录,拉取的代码,生成的文件,以及Kubernetes上的各种资源
这便是Alodi,一个快速创建临时环境的系统
相关文章推荐阅读:
Alodi:环境创建从未如此简单的更多相关文章
- ServiceStack Web Service 创建与调用简单示列
目录 ServiceStack 概念 ServiceStack Web Service 创建与调用简单示列 上篇文章介绍了ServiceStack是什么,本章进入主题,如何快速简单的搭建Service ...
- go语言的安装、环境变量配置及简单使用
go语言的安装.环境变量配置及简单使用 1.安装git并且配置在path中,默认就勾选了 下载地址https://git-scm.com/download/win 2.下载安装visualstudio ...
- 使用Log4net创建日志及简单扩展
如何使用Log4net创建日志及简单扩展 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的 ...
- 《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门
准备工作 1.安装查看 Java 的版本号,推荐使用 Java 8. 安装 Flink 2.在 Mac OS X 上安装 Flink 是非常方便的.推荐通过 homebrew 来安装. brew in ...
- 用python处理excel文件有多轻松?工作从未如此简单
最近需要频繁读写 excel 文件,想通过程序对 excel 文件进行自动化处理,发现使用 python 的 openpyxl 库进行 excel 文件读写实在太方便了,结构清晰,操作简单.本文对 o ...
- 接口测试从未如此简单 - Postman (Chrome插件)
接口测试从未如此简单 - Postman (Chrome插件) 一个非常有力的Http Client工具用来测试Web服务的, 我这里来介绍如何用它测试restful web service 注:转载 ...
- 在VS中手工创建一个最简单的WPF程序
如果不用VS的WPF项目模板,如何手工创建一个WPF程序呢?我们来模仿WPF模板,创建一个最简单的WPF程序. 第一步:文件——新建——项目——空项目,创建一个空项目. 第二步:添加引用,Presen ...
- Singleton模式(Singleton创建类型)c#简单的例子
单(Singleton创建模式)c#简单的例子 当需要生成一个实例,可单发模式 样品可以在短短的球员中产生,玩家和测试.单线程例子,如以下: namespace singletonpattern { ...
- MVVM之旅(1)创建一个最简单的MVVM程序
这是MVVM之旅系列文章的第一篇,许多文章和书喜欢在开篇介绍某种技术的诞生背景和意义,但是我觉得对于程序员来说,一个能直接运行起来的程序或许能够更直观的让他们了解这种技术.在这篇文章里,我将带领大家一 ...
随机推荐
- pytorch lstm crf 代码理解
好久没有写博客了,这一次就将最近看的pytorch 教程中的lstm+crf的一些心得与困惑记录下来. 原文 PyTorch Tutorials 参考了很多其他大神的博客,https://blog.c ...
- Python--day62--编辑出版社功能
1,Django项目主要用到的文件
- webpack学习(五)entry和output的基础配置
1:entry和output就是打包的入口和出口的两个对象.但是如果入口文件就一个的话(应该说只希望打包出一个脚本文件), entry直接跟一个字符串(入口文件路径)就可以了.如:entry : &q ...
- HDU 2454"Degree Sequence of Graph G"(度序列可图性判断)
传送门 参考资料: [1]:图论-度序列可图性判断(Havel-Hakimi定理) •题意 给你 n 个非负整数列,判断这个序列是否为可简单图化的: •知识支持 握手定理:在任何无向图中,所有顶点的度 ...
- PHP mysql扩展整理,操作数据库的实现过程分析
相关文章:PHP mysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 PHPmysqli扩展整理,包括面向过程和面向对象的比较\事务控制\批量执行\预处理 从某种程度上 ...
- Linux 内核sysfs 文件系统符号连接
sysfs 文件系统有通常的树结构, 反映它代表的 kobjects 的层次组织. 但是内核中对象 间的关系常常比那个更加复杂. 例如, 一个 sysfs 子树 (/sys/devices )代表所有 ...
- <Standard Template Library>标准模板库专项复习总结(一)
看了看博客园的申请时间也一年多了...想想自己一年多以来一直处于各种划水状态,现在又要面临ACM的冲击... 还是要抓紧时间赶紧复习一下了- -毕竟校园新生赛还是有奖金的.. 1.栈 先进后出(LIF ...
- blink接收器
blink: [autorun] OPEN="AutoInst.exe" [AskRebootTitle] Dlg1=System Settings Change Dlg2=št ...
- apk混淆打包和反编译(转)
前面有人写过了,我就直接引用了,大家就不乱找了.以后有问题再继续更新. 一.混淆打包.编译 1.Android 代码混淆.http://blog.csdn.net/zjclugger/article/ ...
- POJ 1166 The Clocks [BFS] [位运算]
1.题意:有一组3*3的只有时针的挂钟阵列,每个时钟只有0,3,6,9三种状态:对时针阵列有9种操作,每种操作只对特点的几个时钟拨一次针,即将时针顺时针波动90度,现在试求从初试状态到阵列全部指向0的 ...