Alodi:爲了保密我開發了一個系統

天天都在愉快的造輪子,此次能夠一鍵建立測試環境python

咖啡君維護了幾十個不一樣類型項目,其中有至關一部分項目是對保密性有很高要求的,也就是說下個版本要上線的內容是不能提早泄露的,就像蘋果新產品的介紹網站決不容許在產品發佈以前流出同樣,這種保密內容除了在制度上加以約束外,還須要一些技術手段來保障後端

本次要介紹的Aloid系統就對保密有着必定的做用,這個系統的主要做用是快速生成臨時環境,這個臨時環境會有必定的有效期,過時自動清除,固然你也能夠手動清除,同時這個環境會有惟一的隨機訪問地址,只有知道這個隨機地址的人才能訪問api

涉及技術

整個項目基於Django構建,先後端框架代碼能夠經過這篇文章獲取,經過框架代碼能夠快速構建項目,添加本身須要的功能,須要說明的是框架代碼並不是這個項目源碼bash

subprocess

編譯部署不免要跟系統命令打交道,在調研了幾種python執行系統命令的方法後選擇了subprocess,subprocess做爲os.systemos.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-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的資源佔用

寫在最後

  1. 咱們寫了不少項目,也造了不少輪子,目的都是爲了讓咱們的工做更輕鬆,達到「一杯咖啡、輕鬆運維」的願景
  2. 項目代碼暫不開源,但項目裏邊用到的技術大都有專門的文章介紹,文章都附帶有代碼,有些甚至提供有Demo,徹底能夠快速搞定本身的需求
  3. 若是有任何問題歡迎與我聯繫,一塊兒溝通交流,共同成長,期待加我好友~

掃碼關注公衆號查看更多實用文章

相關文章推薦閱讀:

相關文章
相關標籤/搜索