前兩篇講到了服務如何適配容器化我們在服務里做的一系列改造,服務可以很優雅的適配容器化環境了,但是有一個前提是服務得容器化,也就是說如何打包成鏡像。自己手動構建推送鏡像可不可以?當然可以,不過老話說得好,一個月幾百塊,你玩兒什命啊。你天天手動,手不累么?肩膀不酸嗎?身體受得了嗎?別再自己用手了,通過Gitlab CI來解放你的手,用你的手去做些更快樂的事情。
首先聊聊我們面對的問題
針對上述幾個問題,我們構建出了一個場景
開發同學開發完成后先在開發環境里測試完成后自動部署至測試環境,測試同學進行多輪測試后標記可發布的服務版本,同時可能存在同一個服務根據不同的需求在多分支上的開發和測試問題。而生產環境部署時只能選擇測試確認的服務版本進行發布上線,并且對于服務的資源配置要提供參考。線上運行過程中遇見的問題能追溯到發布版本和代碼版本。
結合問題、場景、容器化技術我們得出了以下的結論:
為什么我們選擇用gitlab ci?網上一搜索就有很多在講優勢劣勢,這里說說我們看中的幾個原因:
1.輕量:內置在Gitlab平臺中,和代碼管理天然融合一體,而且上線的服務只用記錄commit號在后續回溯代碼時很方便
2.易于配置:配置使用YAML文件進行定義,具有直觀的語法。這使得構建、測試和部署流程可以以代碼的方式進行管理,易于維護和版本控制
3.擴展性強:如果標準任務不足以滿足特定需求,可以無需侵入gitlab本身的代碼,就能定制構建和部署流程
總結下來,gitlab提供的ci從我們的角度看,夠輕量,夠簡單,擴展性強。尤其是擴展性強這一點,這點讓我們臉都笑開花了,可以低成本實現我們的想法,滿足我們的想象力。
先看看整體流程
圖片
整套流程涵蓋了開發階段、線上運行階段,首先開發階段下,運維同學只需要在開發測試的k8s集群中為不同團隊創建ns并做資源限制,后續的部署更新都是基于研發同學的代碼提交觸發,研發人員可在提交代碼后通過gitlab pipeline查看ci構建、部署結果。開發環境中健康檢查通過,研發測試沒有問題后將該迭代版本的代碼合并到對應的測試分支部署至測試ns交由測試人員進行測試,整體測試完成后標記服務鏡像正式版本號。而后在平臺上進行發布操作。后續運行過程中遇見的問題通過服務鏡像號可以追溯到對應代碼,修復后重復上述過程
首先定義namespace名稱困難不困難?困難,而且不只是這個名字困難,涉及到命名的時候都困難,方法名、變量名,尤其是變量名,當然如果說都是用i,j 這些來作為變量名也算的話那就不困難,但是別人看到了。。怕是要被刀。。
所以namespace是基于gitlab組和分支規范較為方便,分支規范每家不一樣沒有對錯之分,把握的原則只是分支與環境對應就好。舉一個例子,分支命名dev作為開發分支前綴,test作為測試分支前綴,master作為主分支,gitlab上有兩個組 team1,team2(team2和team1一樣的邏輯圖中就不多畫了)
圖片
這樣做了之后,可以通過在ci中解析分支命名就可以在對應的namespace下創建有分支后綴的服務名了
通過k8s提供的resourcequotas限制每個namespace的資源上限,通過監控集群資源池和namespace的資源用量,來調整集群的整體資源池,如果使用的公有云還可以通過k8s提供的CA(Cluster Autoscaler)進行伸縮
在CI構建打包的時候,在gitlab runner中可以通過獲取環境變量的方式來獲取本次提交的commit值并自動添加到鏡像版本號中,這樣在后續通過鏡像版本號便能追溯到對應的代碼版本。
這是因為ns是一個邏輯概念,是為了考慮k8s集群出現災難性故障時,可以方便我們快速在一個新的k8s集群中迅速重建所有服務。同時也讓一次CI部署多套集群成為可能。
從圖中可知總共分成了4個大塊,可以根據自己的需求去實現。
本文鏈接:http://www.tebozhan.com/showinfo-26-5758-0.html摸魚心法——CI成就夢想
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 錯誤處理策略:Java開發者的MySQL數據庫故障解決方案
下一篇: 每個前端開發者都應知道的14個實用網站