一个满足你各种想象的快速方便生成临时环境的系统
在『Alodi: 为了保密我开发了一个系统』 https://ops-coffee.cn/s/Nxh7mwPJPlbL3R9MdlkO_A 文章中有讲到我们开发了一个系统用来快速生成临时测试环境, 短短三个月已有数百个环境被创建, 简化了工作, 节省了时间, 同时也受到了小伙伴们的肯定, 本篇文章介绍一下 Alodi 的实现原理, 以及更新的功能
实现目的
Alodi 主要的目的是以最简单快速的方式来创建一个测试环境, 同时生成一个随机的临时访问地址提供访问
创建一个环境究竟有多简单呢? 就像下边这样: 选择项目 --> 点击 "创建环境"--> 输入 Tag--> 点击 "Build&Deploy"--> 等待创建完成
创建完成之后, 可以在部署列表里找到创建环境的任务, 在这里可以直接通过域名访问新创建的环境, 或进行一些管理, 例如创建过程中的日志查看, 容器 Log 查看, 进入容器终端排错, 绑定新域名, 或是销毁环境
创建过程
创建临时环境通过 Django 的 Celery https://ops-coffee.cn/s/lXrp3igYo9W2UuE5Gauysg 来异步完成, 同时通过 Django 的 Channels https://ops-coffee.cn/s/r5SpyTjRl0jJeAuYE4Q_-Q 来建立 webSocket 通道实时获取任务日志输出
相同部署发布流程的项目会编写统一的模板, 例如 JavaWeb 项目会编写一个适合所有 JavaWeb 项目的模板, Node.JS 项目会编写一个适合所有 Node.JS 项目的模板, 创建临时环境实际上就是通过 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 https://ops-coffee.cn/s/FHDyvHsh-oO1cn7AXk_4WA , 有很多小伙伴按照文章内容实现了集成
销毁环境
Alodi 系统希望用户能够快速创建环境, 用完销毁环境, 不长时间占用资源, 所以设计了定期销毁和用户主动销毁策略, 定期销毁是会销毁超过 n 天没有使用的环境, 而主动销毁只需要点击 "点击销毁" 按钮即可
销毁环境会删除创建的临时目录, 拉取的代码, 生成的文件, 以及 Kubernetes 上的各种资源
这便是 Alodi, 一个快速创建临时环境的系统
来源: https://www.cnblogs.com/37Y37/p/12190404.html