每天都在愉快的造輪子,這次可以一鍵創建測試環境
咖啡君維護了幾十個不同類型項目,其中有相當一部分項目是對保密性有很高要求的,也就是說下個版本要上線的內容是不能提前泄露的,就像蘋果新產品的介紹網站決不允許在產品發布之前流出一樣,這種保密內容除了在制度上加以約束外,還需要一些技術手段來保障
本次要介紹的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查看,運維咖啡吧專注於原創精品內容分享,感謝您的支持