天天都在愉快的造轮子,此次能够一键建立测试环境python
咖啡君维护了几十个不一样类型项目,其中有至关一部分项目是对保密性有很高要求的,也就是说下个版本要上线的内容是不能提早泄露的,就像苹果新产品的介绍网站决不容许在产品发布以前流出同样,这种保密内容除了在制度上加以约束外,还须要一些技术手段来保障后端
本次要介绍的Aloid系统就对保密有着必定的做用,这个系统的主要做用是快速生成临时环境,这个临时环境会有必定的有效期,过时自动清除,固然你也能够手动清除,同时这个环境会有惟一的随机访问地址,只有知道这个随机地址的人才能访问api
整个项目基于Django构建,先后端框架代码能够经过这篇文章获取,经过框架代码能够快速构建项目,添加本身须要的功能,须要说明的是框架代码并不是这个项目源码bash
编译部署不免要跟系统命令打交道,在调研了几种python执行系统命令的方法后选择了subprocess
,subprocess做为os.system
和os.popen
的替代模块,功能更为强大,且为python自带模块,不需额外安装,使用方便服务器
在须要频繁执行系统命令的状况下,能够写一个相似下边这样的方法封装命令执行和返回输出,使代码简洁易读app
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之上,建立或销毁临时环境都须要与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的资源占用
相关文章推荐阅读: