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

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

本次要介绍的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查看,运维咖啡吧专注于原创精品内容分享,感谢您的支持

Alodi:为了保密我开发了一个系统的更多相关文章

  1. 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(一) - 介绍

    项目简介 novel 是一套基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离的学习型小说项目,配备详细的项目教程手把手教你从零开始开发上线一个生产级别的 J ...

  2. 用SignalR 2.0开发客服系统[系列2:实现聊天室]

    前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...

  3. 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 真的很感谢大家的支持,今天发表系列3 ...

  4. 用SignalR 2.0开发客服系统[系列4:负载均衡的情况下使用SignalR]

    前言 交流群:195866844 目录: 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 用SignalR 2.0开发客服系统[系列2:实现聊天室] 用SignalR 2.0开发客服系统 ...

  5. 基于ssh框架开发的购物系统的质量属性

    根据前面的博客,我们已经大致了解了ssh架构开发整体概念:Struts是一个实现了MVC模式的经典的框架:Hibernate是轻量级Java EE应用的持久层解决方案,以面向对象的方式提供了持久化类到 ...

  6. php开发客服系统(持久连接+轮询+反向ajax 转载 http://www.tuicool.com/articles/2mU7v2R)

    php开发客服系统( 下载源码 ) 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向 ...

  7. iOS开发——高级技术&系统应用于系统服务

    系统应用于系统服务 系统应用 在开发某些应用时可能希望能够调用iOS系统内置的电话.短信.邮件.浏览器应用,此时你可以直接使用UIApplication的OpenURL:方法指定特定的协议来打开不同的 ...

  8. 如何快速开发出一个高质量的APP——创业谈

    [起] 今早,一个技术群里有人想快速做出一个app,然后询问技术方案,大概是这样, 拿到了200w投资,期望花20w两个月先做出一个app,包括iOS,Android, 先,呵呵,一下, 大概预估了一 ...

  9. 【读书笔记《Android游戏编程之从零开始》】7.Android 游戏开发常用的系统控件(Dialog)

    在Android应用开发中,Dialog(对话框)创建简单且易于管理因而经常用到,对话框默认样式类似创建样式的Activity.首先介绍android.app.AlertDialog下的Builder ...

随机推荐

  1. Spring入门(七):Spring Profile使用讲解

    1. 使用场景 在日常的开发工作中,我们经常需要将程序部署到不同的环境,比如Dev开发环境,QA测试环境,Prod生产环境,这些环境下的一些配置肯定是不一样的,比如数据库配置,Redis配置,Rabb ...

  2. tk.mybatis扩展通用接口

    一.tk.mybatis已经为我们封装好了许多拆箱即用的通用mapper,但在实际的项目开发中想必不少小伙伴在数据库设计中都会采用逻辑删除这种方案,再去使用通用的mapper接口就不行了.这时候就需要 ...

  3. 强烈推荐优秀的Vue UI组件库

    Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基于Vue的UI组件框架开发,并投入正 ...

  4. 使用PowerShell 测试DNS

    运行环境:Windows Server 2012 R2 获取服务器DNS命令,下面的仅获取一个dns (nslookup sql.ciras.com)[1].split(':')[1].trim() ...

  5. numba,让python速度提升百倍

    python由于它动态解释性语言的特性,跑起代码来相比java.c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显. 办法永远比困难多,numba就是解决py ...

  6. SpringBoot中快速实现邮箱发送

    前言 在许多企业级项目中,需要用到邮件发送的功能,如: 注册用户时需要邮箱发送验证 用户生日时发送邮件通知祝贺 发送邮件给用户等 创建工程导入依赖 <!-- 邮箱发送依赖 --> < ...

  7. 十分钟搞懂Lombok使用与原理

    1 简介 Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它.Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的 ...

  8. 一篇文章让你马上入门Hibernate

    在前面我们学完了Struts2,接下来我们就要去学习第二个框架Hibernate. 那什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对 ...

  9. k好数(动态规划)

    问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...

  10. Linux系统启动流程(重要!)

    Linux系统启动流程   从上至下为: BIOS  MBR:Boot Code 执行引导程序-GRUB(操作系统) 加载内核 执行init run level 1.BIOS(Basic Input ...