利用VSTS跟Kubernetes整合进行CI/CD
為什么VSTS要搭配Kubernetes?
通常我們在開發(fā)管理軟件項(xiàng)目的時(shí)候都會碰到一個(gè)很頭痛的問題,就是開發(fā)、測試、生產(chǎn)環(huán)境不一致,導(dǎo)致開發(fā)人員和測試人員甚至和運(yùn)維吵架。
因?yàn)槌R姷奈锢憝h(huán)境甚至云環(huán)境中,這些部署環(huán)境都是由運(yùn)維人員提前準(zhǔn)備好的。每次更新代碼版本,都要很小心的在幾個(gè)環(huán)境之前修改不同的參數(shù)配置,一不小心就將生產(chǎn)環(huán)境的數(shù)據(jù)庫連接到了測試庫,或者日志文件的地址寫到了一個(gè)不存在的盤符里等等各種異常情況,有了Kubernetes這樣微服務(wù)編排框架,我們可以通過代碼的形式描述服務(wù)的架構(gòu),描述服務(wù)之間的依賴關(guān)系,做到了 Infrastructure As Code。這樣可以大大減少了開發(fā)運(yùn)維之間在做環(huán)境切換時(shí)帶來的額外成本。
將VSTS的持續(xù)集成能力和持續(xù)發(fā)布能力整合Kubernetes,可以讓項(xiàng)目團(tuán)隊(duì)更容易發(fā)現(xiàn)和改進(jìn)代碼(這時(shí)候的Infrastructure也已經(jīng)是代碼了)的問題,真正將精力放在改進(jìn)用戶體驗(yàn)和改進(jìn)產(chǎn)品品質(zhì)上。
準(zhǔn)備VSTS管理環(huán)境
首先我們需要到www.visualstudio.com下申請好的VSTS賬號,然后在賬號下創(chuàng)建一個(gè)用Git作為代碼管理的項(xiàng)目
創(chuàng)建好項(xiàng)目后我們就可以利用git clone將代碼庫同步到本地開發(fā)服務(wù)器上面來,構(gòu)建開發(fā)人員的workspace
準(zhǔn)備Docker Registry和Kubernetes環(huán)境
2.準(zhǔn)備一個(gè)私有的Docker Registry.因?yàn)槲覀冃枰獙uild 好的代碼放進(jìn)一個(gè)Docker的Images上面然后推送到一個(gè)私有的Registry上。Azure Container Registry無疑是一個(gè)非常好的選擇,因?yàn)榈纫幌挛覀兊拇a需要部署到Azure的Kubernetes群集里,Image所在的地方離部署的地方越近,部署速度當(dāng)然也就越快了。而且Azure Container Registry還支持全球同步,如果你的代碼打算全球多站點(diǎn)發(fā)布的話,Azure Container Registry服務(wù)無疑是最好的選擇。創(chuàng)建Azure Docker Registry可以參考官方文檔:https://docs.microsoft.com/zh-cn/azure/container-registry/?
3.準(zhǔn)備Kubernetes群集,Azure上支持提供了AKS服務(wù),讓我們可以快速搭建出來Kubernetes的群集環(huán)境,減少了運(yùn)維人員管理群集的壓力,搭建方法參考官方文檔:https://docs.microsoft.com/zh-cn/azure/aks/kubernetes-walkthrough-portal?
? 搭建的過程中注意幾個(gè)地方
1.準(zhǔn)備好Service Principle服務(wù)主體APP
2.準(zhǔn)備好linux ssh登錄的Key
安裝好群集后通過 Azure CLI 2.0命令:az aks install-cli 這樣我們就可以自動在你的linux上裝上Kubernetes的kubectl命令行工具了.
要管理Kubernetes的話,需要運(yùn)行下面的命令,在本地生成K8S的管理配置信息
az aks get-credentials --resource-group=myResourceGroup --name=myK8sCluster獲取到的配置內(nèi)容會放在/home/<youraccount>/.kube/config文件里面,這文件里面的內(nèi)容非常重要,等一下VSTS需要這個(gè)信息來跟K8S群集進(jìn)行鏈接的。
我們可以通過kubectl get nodes命令看看群集的狀況
開始配置VSTS的自動化構(gòu)建和自動化發(fā)布
我們再VSTS的項(xiàng)目站點(diǎn)里找到Build and Release的菜單項(xiàng),點(diǎn)擊New的按鈕
選擇NodeJS with Gulp的模板
創(chuàng)建好后,我們先裁剪掉暫時(shí)不需要的Task,然后添加上Docker build Image和push Image的Task
--->
配置Build an image Task:
在這里我們可以將一開始準(zhǔn)備好的Azure Container Registry環(huán)境用上了
配置Push an image Task,Image Name使用BuildId作為鏡像的Tag,這樣后面部署到Kubernetes的時(shí)候就可以指定這個(gè)Tag對Image進(jìn)行更新了。
Build的定義不算太復(fù)雜,定義完之后我們就可以直接觸發(fā)一次Build來檢驗(yàn)一下配置是否成功了。
下圖就是Build成功之后的日志,我圖中我們可以看到Docker push命令將image push到了我們之前建立的Azure注冊Repository里面了
自動化構(gòu)建成功之后,我們可以做自動化的部署了,
創(chuàng)建一個(gè)新的發(fā)布定義
在Environment里點(diǎn)擊一下藍(lán)色字體部分,編輯部署任務(wù)
在配置部署任務(wù)時(shí),選擇Deploy to Kubernetes的任務(wù)類型,并且在Manage這個(gè)藍(lán)色鏈接這里配置Kubernetes的鏈接信息。
在Kubernetes的命令里使用set命令,通過設(shè)置image的更新地址來通知Kubernetes更新部署版本。
命令的格式是:kubectl set image deployment/<deploymentname> <imagename>=<image url>
在VSTS里面,只需要argument里面把后面的部分填上就好
配置Kubernetes的 Service Endpoints信息:
配置好部署任務(wù)后,我們可以嘗試一下手動將前面成功的Build部署到Kubernetes環(huán)境中
至此我們已經(jīng)可以成功將一份代碼部署到了Kubernetes里面去了
部署成功后,可以通過kubectl get pods -w命令監(jiān)控一下Kubernetes對容器進(jìn)行更新替換的過程,從下圖中可以看到Kubernetes創(chuàng)建了一個(gè)新的pod,然后將舊版本的pod進(jìn)行了Terminate.
如果我們需要將Release跟Build自動鏈接起來,可以通過編輯Release定義,選擇圖上的閃電按鈕,將Continuous deployment trigger的按鈕設(shè)置為Enabled即可。
原文地址:https://www.cnblogs.com/wing-ms/p/8177718.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的利用VSTS跟Kubernetes整合进行CI/CD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于百度理解与交互技术实现机器问答
- 下一篇: 揭秘微软6万工程师DevOps成功转型的