每天都在愉快的造轮子,这次可以一键创建测试环境

咖啡君维护了几十个不同类型项目,其中有相当一部分项目是对保密性有很高要求的,也就是说下个版本要上线的内容是不能提前泄露的,就像苹果新产品的介绍网站决不允许在产品发布之前流出一样,这种保密内容除了在制度上加以约束外,还需要一些技术手段来保障

本次要介绍的Aloid系统就对保密有着一定的作用,这个系统的主要作用是快速生成临时环境,这个临时环境会有一定的有效期,过期自动清除,当然你也可以手动清除,同时这个环境会有唯一的随机访问地址,只有知道这个随机地址的人才能访问

涉及技术

整个项目基于Django构建,前后端框架代码可以通过这篇文章获取,通过框架代码可以快速构建项目,添加自己需要的功能,需要说明的是框架代码并非这个项目源码

subprocess

编译部署难免要跟系统命令打交道,在调研了几种python执行系统命令的方法后选择了subprocess,subprocess作为os.systemos.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查看,运维咖啡吧专注于原创精品内容分享,感谢您的支持

最新文章

  1. JQuery上传插件Uploadify使用详解
  2. 【leedcode】 Median of Two Sorted Arrays
  3. 上下箭头选中 选项事件 JS
  4. python基础编程
  5. Linux 设备驱动程序 proc seq
  6. VC++ operate excel
  7. Android学习笔记之使用百度地图实现地图控制
  8. JUC回顾之-可重入的互斥锁ReentrantLock
  9. 用Google Analytics跟踪JavaScript Errors (译)
  10. esp和ebp详解
  11. 通过点击取消按钮关闭dialog窗口
  12. css3 旋转效果加上双面显示效果
  13. onethink 系统函数中 生成随机加密key
  14. ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
  15. javascript判断设备类型-手机(mobile)、安卓(android)、电脑(pc)、其他(ipad/iPod/Windows)等
  16. mysql if对数据进行处理 having对数据进行查询 thinkphp中的exp支持更复杂的where查询
  17. Vim 默认开启行号、语法显示等设置
  18. VS2012启用angularjs智能提示Intelligence(转)
  19. Spring Boot 2.x (八):日志框架的使用
  20. Android Material Design控件使用(三)——CardView 卡片布局和SnackBar使用

热门文章

  1. nodeJs跨域设置(express,koa2,eggJs)
  2. Java——类型信息
  3. ASP.NET Core on K8S深入学习(3-2)DaemonSet与Job
  4. Codeforces 343D Water Tree
  5. spark源码阅读---Utils.getCallSite
  6. python骚操作---Print函数用法
  7. 自然语言处理(NLP)的一般处理流程!
  8. Protocol, Delegate
  9. 求平方根算法 Heron’s algorithm
  10. css3弹性盒子 flex布局