天天都在愉快的造輪子,此次能夠一鍵建立測試環境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的資源佔用
相關文章推薦閱讀: