K8S微服務(wù)部署完之后自動修改RC并重啟微服務(wù)

好久沒更新過簡書了磷杏,今天把這個習(xí)慣拾起來吧。

背景

之前自己在公司做了一個平臺怎虫,可以實現(xiàn)自動部署微服務(wù)到測試環(huán)境,但RC文件的配置還是按照生產(chǎn)環(huán)境來的困介,所以有同事提了個需求,就是自動部署完之后自動修改RC文件并重啟蘸际。

開始實施

在自己完成測試工作之后開始分析座哩、設(shè)計、實施的粮彤,大概花了多半天的時間根穷,大部分時間還是在前期分析上,知道怎么弄了后导坟,代碼還是很好寫出來的屿良。
鑒于自己之前對K8S的操作僅在一些命令行上,以這個操作為例惫周,更改RC:kubectl edit rc xxx-rc尘惧,刪除微服務(wù):kubectl delete pod xxx;這種方式去自動化實現(xiàn)其實是不可行的递递,python可以與后臺進(jìn)行交互喷橙,但自動進(jìn)入到vim里面去操作就似乎是不可實現(xiàn)的。
百度了一堆資料后登舞,發(fā)現(xiàn)了一個切入點:官方API
果然有對應(yīng)的API操作:

# prefix為k8s api的前綴贰逾,各公司的應(yīng)該不盡相同吧
# 獲取指定的RC文件信息(Json格式):
rc_by_name = ['GET', prefix + '/api/v1/namespaces/{namespace}/replicationcontrollers/{name}']  # read the specified ReplicationController
# 替換RC
rc_replace_by_name = ['PUT', prefix + '/api/v1/namespaces/{namespace}/replicationcontrollers/{name}']  # replace the specified ReplicationController
# 獲取所有Pod列表信息
pod_list = ['GET', prefix + '/api/v1/pods']  # list or watch objects of kind Pod
# 刪除指定Pod
pod_delete_by_name = ['DELETE', prefix + '/api/v1/namespaces/{namespace}/pods/{name}']  # delete a Pod

看到這幾個API,使這個修改RC并重啟Pod的大致思路想必大家都知道了菠秒。

  1. 獲取指定RC的信息疙剑;
  2. 根據(jù)RC信息修改部分字段;
  3. 調(diào)用replace rc接口践叠;
  4. 查找所有pod言缤,刪除所有與RC文件想匹配的Pod。

步驟1不用介紹禁灼;
步驟2需要提示下轧简,接口獲取到的RC信息是比較多的,不過大多數(shù)是去改環(huán)境變量匾二,也就是如下部分中的字段:

# resp為獲取到的RC的信息哮独,dict格式
# containers一般為1個拳芙,也有多個的情況
# env_index為環(huán)境變量的索引,獲取到RC信息后看到Json文件就知道什么含義了
resp['spec']['template']['spec']['containers'][0]['env'][env_index]['value']

步驟3中有個小坑皮璧,如果不注意的話會報錯的舟扎,那就是得去除resourceVersion的信息:

resp['metadata'].pop('resourceVersion')

步驟4就不多說了。

光說無碼假把式悴务,整體的執(zhí)行流程見下面的代碼:

import requests

from *** import K8SAPI  # 將K8S API集中寫到單獨的一個python文件中了


class K8sOperations:

    def __init__(self, master_ip, namespace='default'):
        self.master_ip = master_ip
        self.namespace = namespace

    def replace_rc(self, rc, env_index, name, value):
        method, url = K8SAPI.rc_by_name
        url = url.format(MASTER_IP=self.master_ip, namespace=self.namespace, name=rc)
        resp = requests.request(method, url).json()
        resp['metadata'].pop('resourceVersion')
        if resp['spec']['template']['spec']['containers'][0]['env'][env_index]['name'] == name:
            resp['spec']['template']['spec']['containers'][0]['env'][env_index]['value'] = value
            response = requests.put(url=url, json=resp)
            if response.status_code == 200:
                return True
            else:
                return False
        else:
            return 'Index or Name Error'

    def get_pods_via_rc(self, rc):
        method, url = K8SAPI.pod_list
        url = url.format(MASTER_IP=self.master_ip)
        pods = requests.request(method, url).json()['items']
        pod_list = []
        for each in pods:
            if rc in each['metadata']['name']:
                pod_list.append(each['metadata']['name'])
        return pod_list

    def delete_pods(self, pod_list):
        method, url = K8SAPI.pod_delete_by_name
        code_sum = 0
        for each in pod_list:
            url = url.format(MASTER_IP=self.master_ip, namespace=self.namespace, name=each)
            resp = requests.request(method, url)
            code_sum += resp.status_code
        if code_sum == 200*len(pod_list):
            return True
        else:
            return False

    def modify_rc_streamline(self, rc, env_index, name, value):
        result = self.replace_rc(rc, env_index, name, value)
        if not result:
            return result
        elif result is not True:
            return result
        pod_list = self.get_pods_via_rc(rc)
        result = self.delete_pods(pod_list)
        if result:
            return True
        else:
            return 'RC修改完成但重啟Pod異常'

實現(xiàn)功能的代碼如上睹限,至于怎么寫API,各位看官自有各自的一套風(fēng)格讯檐,這兒就不再贅述了羡疗。

成品

確切的說是半成品,將功能完成并可以自由去使用了别洪,但還沒有去做自動部署完后自動執(zhí)行改RC叨恨,做的話也很容易,就是需要調(diào)研一下詳細(xì)的需求挖垛,因為不同的項目組行為不一樣痒钝,可能有的項目組一個RC需要改幾個地方,有的項目組一次性改多個RC痢毒,需要對所有的項目組做調(diào)查送矩。當(dāng)然把所有的可能性都編寫出來最好,但不會用到的可能性不就是無用功嘛哪替。
直接上圖:


完成

后端是Vue.js栋荸,雖不精通,但能造東西凭舶,我覺得作為測試工程師這就夠了蒸其,至少目前夠了。龐大的技術(shù)體系面前库快,哪能樣樣精通摸袁。如果后期有需要,那就學(xué)它丫的

后記

今晚有點失眠义屏。靠汁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市闽铐,隨后出現(xiàn)的幾起案子蝶怔,更是在濱河造成了極大的恐慌,老刑警劉巖兄墅,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踢星,死亡現(xiàn)場離奇詭異,居然都是意外死亡隙咸,警方通過查閱死者的電腦和手機(jī)沐悦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門成洗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人藏否,你說我怎么就攤上這事瓶殃。” “怎么了副签?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵遥椿,是天一觀的道長。 經(jīng)常有香客問我淆储,道長冠场,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任本砰,我火速辦了婚禮碴裙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灌具。我一直安慰自己,他們只是感情好譬巫,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布咖楣。 她就那樣靜靜地躺著,像睡著了一般芦昔。 火紅的嫁衣襯著肌膚如雪诱贿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天咕缎,我揣著相機(jī)與錄音珠十,去河邊找鬼。 笑死凭豪,一個胖子當(dāng)著我的面吹牛焙蹭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫂伞,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼孔厉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帖努?” 一聲冷哼從身側(cè)響起撰豺,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拼余,沒想到半個月后污桦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡匙监,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年凡橱,在試婚紗的時候發(fā)現(xiàn)自己被綠了小作。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡梭纹,死狀恐怖躲惰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情变抽,我是刑警寧澤础拨,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站绍载,受9級特大地震影響诡宗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜击儡,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一塔沃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阳谍,春花似錦蛀柴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至训貌,卻和暖如春制肮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背递沪。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工豺鼻, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人款慨。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓儒飒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親檩奠。 傳聞我的和親對象是個殘疾皇子约素,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容