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 ...
随机推荐
- Kafka基本知识入门(一)
1. 基础知识 有关RabbitMQ,RocketMQ,Kafka的区别这个网上很多,了解一下区别性能,分清什么场景使用.分布式环境下的消息中间件Kafka做的比较不错,在分布式环境下使用频繁,我也不 ...
- Selenium+Java - 结合sikuliX操作Flash网页
前言 前天被一个Flash的轮播图,给玩坏了,无法操作,后来请教了下crazy总拿到思路,今天实践了下,果然可以了,非常感谢! 模拟场景 打开百度地图 切换城市到北京 使用测距工具 测量 奥林匹克森林 ...
- 如何删除GIT仓库中的敏感信息
如何删除GIT仓库中的敏感信息 正常Git仓库中应该尽量不包含数据库连接/AWS帐号/巨大二进制文件,否则一旦泄漏到Github,这些非常敏感信息会影响客户的信息安全已经公司的信誉.公司可能其它还有相 ...
- 带图标和多行显示的ListBox
源码https://www.codeproject.com/Articles/15464/Extending-the-ListBox-to-show-more-complex-items 定义控件 u ...
- python骚操作---Print函数用法
---恢复内容开始--- python骚操作---Print函数用法 在 Python 中,print 可以打印所有变量数据,包括自定义类型. 在 3.x 中是个内置函数,并且拥有更丰富的功能. 参数 ...
- 章节十六、3-TestNG方法和类注解
一.Test Suite(测试套件) 我们通常认为一个testcase就是一个测试方法,但是会有很多的testcase,所以我们不可能把所有的testcase放到同一个测试类中,假如需要测试的页面有1 ...
- 如果有人问你 Dubbo 中注册中心工作原理,就把这篇文章给他
注册中心作用 开篇首先想思考一个问题,没有注册中心 Dubbo 还能玩下去吗? 当然可以,只要知道服务提供者地址相关信息,消费者配置之后就可以调用.如果只有几个服务,这么玩当然没问题.但是生产服务动辄 ...
- 什么是CWS、WBS、OBS
今天公司进行CMMI资质审核,审核人提到了WBS,以前对这些名词没有太过于注意,后经过审核人的审核对这个名词有了一个大致的了解,并结合项目经验和网上的一些资料,编此文档.不为别人,主要怕自己忘记了. ...
- DC6-靶机渗透
靶场下载链接: Download: http://www.five86.com/downloads/DC-6.zip Download (Mirror): https://download.vulnh ...
- 卷积神经网络cnn的实现
卷积神经网络 代码:https://github.com/TimVerion/cat 卷积层 卷积层:通过在原始图像上平移来提取特征,每一个特征就是一个特征映射 原理:基于人脑的图片识别过程,我们可以 ...