Alodi:为了保密我开发了一个系统
每天都在愉快的造轮子,这次可以一键创建测试环境
咖啡君维护了几十个不同类型项目,其中有相当一部分项目是对保密性有很高要求的,也就是说下个版本要上线的内容是不能提前泄露的,就像苹果新产品的介绍网站决不允许在产品发布之前流出一样,这种保密内容除了在制度上加以约束外,还需要一些技术手段来保障
本次要介绍的Aloid系统就对保密有着一定的作用,这个系统的主要作用是快速生成临时环境,这个临时环境会有一定的有效期,过期自动清除,当然你也可以手动清除,同时这个环境会有唯一的随机访问地址,只有知道这个随机地址的人才能访问
涉及技术
整个项目基于Django构建,前后端框架代码可以通过这篇文章获取,通过框架代码可以快速构建项目,添加自己需要的功能,需要说明的是框架代码并非这个项目源码
subprocess
编译部署难免要跟系统命令打交道,在调研了几种python执行系统命令的方法后选择了subprocess,subprocess作为os.system和os.popen的替代模块,功能更为强大,且为python自带模块,不需额外安装,使用方便
在需要频繁执行系统命令的情况下,可以写一个类似下边这样的方法封装命令执行和返回输出,使代码简洁易读
import shlex, subprocess
def runCmd(tid, msg, cmd):
try:
p = subprocess.Popen(shlex.split(cmd), stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while p.poll() == None:
out = p.stdout.readline().strip()
if out:
print('---->' + out.decode())
res = ' 失败 ~_~' if p.returncode else ' 完成 ^_^'
print('---->' + msg + res)
return p.returncode
except Exception as e:
print('---->Shell Exec Error:%s' % str(e))
return 999
kubernetes-api
所有环境跑在kubernetes之上,创建或销毁临时环境都需要与kubernetes做交互,我选择了使用kubernetes python sdk来完成
from kubernetes import client, config
class KubeApi:
def __init__(self, namespace='alodi'):
config.load_kube_config("/ops/coffee/kubeconfig.yaml")
self.namespace = namespace
def create_deployment(self, RAND, PROJ, ENVT):
api_instance = client.AppsV1Api()
body = client.V1Deployment(
api_version="apps/v1",
kind="Deployment",
metadata=client.V1ObjectMeta(name=RAND),
spec=client.V1DeploymentSpec(
replicas=1,
selector={'matchLabels': {'app': RAND}},
template=client.V1PodTemplateSpec(
metadata=client.V1ObjectMeta(labels={"app": RAND}),
spec=client.V1PodSpec(
containers=[client.V1Container(
name=RAND,
image="k8s-harbor.blz.netease.com/alodi/" + RAND,
env=[{"name": "ENVT", "value": ENVT}, {"name": "PROJ", "value": PROJ}],
ports=[client.V1ContainerPort(container_port=80)],
)]
)
),
)
)
try:
r = api_instance.create_namespaced_deployment(
namespace=self.namespace, body=body
)
return True, "Deployment created: %s" % r
except Exception as e:
return False, 'Deployment created: ' + str(e)
def delete_deployment(self, RAND):
api_instance = client.AppsV1Api()
body = client.V1DeleteOptions(
propagation_policy='Foreground',
grace_period_seconds=5)
try:
r = api_instance.delete_namespaced_deployment(
namespace=self.namespace,
name=RAND,
body=body
)
return True, "Deployment deleted. %s" % r
except Exception as e:
return False, 'Deployment deleted: ' + str(e)
load_kube_config加载的配置文件为kubernetes主服务器上的~/.kube/config文件,这个文件内包含了集群相关信息,通过这个配置文件可以免认证操作集群修改资源,要妥善保管这个配置文件,当然也可以通过token的方式自己实现认证
另外需要特别注意的是sdk的版本与kubernetes的版本有对应关系,且不同资源的操作对kubernetes的api版本要求也不同,使用时多参考官方文档
介于篇幅原因这里只贴了两个deployment的操作示例,其他更多示例可以单独找我获取
界面展示
整个项目除了用户管理之类的常规页面外,主要有三个页面构成,由这三个页面完成了主要流程的执行和展示
项目管理页:在这个页面内可以新建、编辑和删除项目

同时也可以在项目管理页创建临时环境,这里主要选择使用的数据环境和代码TAG

当填写相关信息点击Build & Deploy按钮后会跳转到任务详情页,这个页面实时展示部署过程的日志输出,右上角有个爬虫的按钮,可以终止部署

部署列表页:可以在部署列表页查看到部署历史记录,当这个环境正在运行时可以点击销毁按钮来销毁项目,清除kubernetes的资源占用
文章未完,全部内容请关注公众号【运维咖啡吧】或个人网站https://ops-coffee.cn查看,运维咖啡吧专注于原创精品内容分享,感谢您的支持

Alodi:为了保密我开发了一个系统的更多相关文章
- 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(一) - 介绍
项目简介 novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离的学习型小说项目,配备详细的项目教程手把手教你从零开始开发上线一个生产级别的 J ...
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...
- 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]
前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...
- 基于ssh框架开发的购物系统的质量属性
根据前面的博客,我们已经大致了解了ssh架构开发整体概念:Struts是一个实现了MVC模式的经典的框架:Hibernate是轻量级Java EE应用的持久层解决方案,以面向对象的方式提供了持久化类到 ...
- php开发客服系统(持久连接+轮询+反向ajax 转载 http://www.tuicool.com/articles/2mU7v2R)
php开发客服系统( 下载源码 ) 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向 ...
- iOS开发——高级技术&系统应用于系统服务
系统应用于系统服务 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的 ...
- 如何快速开发出一个高质量的APP——创业谈
[起] 今早,一个技术群里有人想快速做出一个app,然后询问技术方案,大概是这样, 拿到了200w投资,期望花20w两个月先做出一个app,包括iOS,Android, 先,呵呵,一下, 大概预估了一 ...
- 【读书笔记《Android游戏编程之从零开始》】7.Android 游戏开发常用的系统控件(Dialog)
在Android应用开发中,Dialog(对话框)创建简单且易于管理因而经常用到,对话框默认样式类似创建样式的Activity.首先介绍android.app.AlertDialog下的Builder ...
随机推荐
- C++基础之:扫雷破解
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- netty源码解解析(4.0)-17 ChannelHandler: IdleStateHandler实现
io.netty.handler.timeout.IdleStateHandler功能是监测Channel上read, write或者这两者的空闲状态.当Channel超过了指定的空闲时间时,这个Ha ...
- ABP 配置全局数据过滤器 II
第一篇 那种写法有些复杂, 简单办法是直接注入 切换到 ***.EntityFramework 项目 在Uow 里面创建 ***EfUnitOfWork.cs 类 public class Coope ...
- keras 学习笔记:从头开始构建网络处理 mnist
全文参考 < 基于 python 的深度学习实战> import numpy as np from keras.datasets import mnist from keras.model ...
- 深入剖析PHP7内核源码(一)- PHP架构与生命周期
PHP7 为什么这么快? 全新的zval 更节约的空间,栈上分配内存 zend_string 存储字符串的Hash值,数组查询的时候不需要进行Hash计算 在HashTable桶内直接存数据,减少了内 ...
- 2019牛客暑期多校训练营(第十场)F-Popping Balloons
>传送门< 题意:现在给你n个点 ,让你横着划三条线间距为r 然后竖着划三条线间距同样为r ,求经过最多的点数 思路:比赛看到这题的时候觉得能做,但是一看时间限制是5s,搞得我有不敢去碰了 ...
- 神经网络优化算法:Dropout、梯度消失/爆炸、Adam优化算法,一篇就够了!
1. 训练误差和泛化误差 机器学习模型在训练数据集和测试数据集上的表现.如果你改变过实验中的模型结构或者超参数,你也许发现了:当模型在训练数据集上更准确时,它在测试数据集上却不⼀定更准确.这是为什么呢 ...
- 纯数据结构Java实现(0/11)(开篇)
为嘛要写 本来按照我的风格,其实很不喜欢去写这些细节的东西,因为笔记上直接带过了. 本来按照我的风格,如果要写,那也是直接上来就干,根本不解释这些大纲,参考依据. 本来按照我的风格,不想太显山露水,但 ...
- JavaScript算法实现——排序
在计算机编程中,排序算法是最常用的算法之一,本文介绍了几种常见的排序算法以及它们之间的差异和复杂度. 冒泡排序 冒泡排序应该是最简单的排序算法了,在所有讲解计算机编程和数据结构的课程中,无一例外都会拿 ...
- 只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常
## 统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生. 比较通用的返回值格式如下: ```jav ...