ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(三
在上文ASP.NET Core應用程序容器化、持續(xù)集成與Kubernetes集群部署(二)中,我介紹了如何使用Azure DevOps為ASP.NET Core應用程序案例:tasklist搭建持續(xù)集成環(huán)境。在持續(xù)集成的過程中,Azure DevOps的Build Pipeline會下載tasklist的源代碼,使用Docker容器環(huán)境進行項目構建,將構建的容器鏡像推送到Docker Hub,并將源代碼庫中的yml文件復制到構建生成目錄(Build Artifacts),以備持續(xù)部署時使用。今天,我打算介紹一下基于Azure Kubernetes Service和Azure DevOps的部署過程,本章節(jié)結束后,你可以看到我們的tasklist已在Kubernetes集群中運行。
強烈建議在閱讀本文前,先對上兩篇文章做一個大致的了解,然后閱讀tasklist源碼庫,因為tasklist源碼庫展示的是一個完整的案例。
好吧,既然介紹Kubernetes部署,就離不開這兩個概念:Kubernetes與Azure Kubernetes Service。Kubernetes(k8s)是Google開源的容器編排集群系統(tǒng),可以讓一個或一組容器運行在集群環(huán)境,從而使基于容器的應用程序獲得可伸縮與高可用的特性。Kubernetes使用Go語言實現,它有一個實驗性的版本,叫Minikube。Minikube是一個只包含一個節(jié)點的Kubernetes集群,可以在Windows、Linux等多平臺中部署Minikube,部署過程也相對簡單,因此,如果是用于學習或者一些簡單的實驗,可以選擇Minikube。在Kubernetes集群運行起來后,就可以使用Kubectl命令行客戶端對集群進行管理。
如果是自己部署生產級別的Kubernetes集群的話,配置過程會相對比較復雜,此外,由于Kubernetes是Google的項目,有很多配置部署的腳本以及二進制文件都是使用Google的CDN進行分發(fā),國內是無法訪問這些資源的,所以,我還是建議大家使用托管的Kubernetes服務,比如Azure的Azure Kubernetes Service(AKS),這樣可以省去繁雜的配置過程,而且還可以根據自己的需要來決定Kubernetes集群的體量,非常方便。
Azure Container Service為容器化的應用程序的運行提供了容器集群環(huán)境,它支持三種不同的容器編排器(container orchestrator):Docker Swarm、基于DC/OS的Marathon服務,以及大家熟知的Kubernetes,也就是今天我打算介紹的Azure Kubernetes Service。大家如果有興趣的話,也不妨了解一下Docker Swarm和DC/OS Marathon。
據我所知,目前Azure中國區(qū)版沒有官方的AKS服務,網上也有一些資料,幫助讀者在Azure中國區(qū)版中部署Kubernetes集群,但是過程也相對比較繁雜。在這里,我會使用Azure國際版進行介紹。
首先,登錄Azure國際版,點擊Create a resource按鈕,在新建資源的列表中輸入Kubernetes進行搜索,在搜索結果中點擊Kubernetes Service選項:
在Create Kubernetes Cluster頁面中,進入Basics標簽頁,然后填寫以下信息:
Subscription:選擇你的Azure訂閱
Resource Group:為Kubernetes集群選擇一個Azure的資源組(Resource Group),之后為Kubernetes創(chuàng)建的所有資源都會被劃入該資源組中,便于管理。你也可以點擊Create new按鈕新建一個資源組
Kubernetes cluster name:新創(chuàng)建的Kubernetes集群的名稱
Region:創(chuàng)建資源所屬的Region
Kubernetes version:Kubernetes的版本,選擇默認的即可
DNS name prefix:所創(chuàng)建集群的DNS名稱前綴
Node size:集群中每個節(jié)點的虛擬機配置,可以根據自己的實際情況進行選擇,當然,配置越高費用也越高。這里我只選擇Standard B2s,一個月40美金的樣子
Node count:集群中的節(jié)點個數,為了演示,我選擇2個節(jié)點,于是,Node size * Node count,費用大概一個月80美金的樣子
為了演示tasklist項目的K8S部署,我選擇了如下的配置:
在這個頁面中還可以選擇針對認證、網絡、監(jiān)控等方面的高級設置,我就不一一介紹了,官方網站的文檔中都有詳細說明。現在直接點擊Review + create按鈕,在Azure完成了對配置信息的校驗之后,就可以點擊Create按鈕創(chuàng)建集群了。
創(chuàng)建成功后,就可以在Azure的站點中找到剛剛創(chuàng)建好的Kubernetes集群了。在集群的管理頁面上,點擊View Kubernetes dashboard鏈接,此時會打開一個邊窗,列出連接Kubernetes集群的操作步驟。接下來,按照步驟一步步地安裝kubectl命令行,并通過Azure的命令行打開Kubernetes的儀表盤。
首先確保已經安裝Azure命令行工具(Azure CLI)2.0.27或以上版本,有關Azure CLI的安裝,可以參考:https://docs.microsoft.com/zh-cn/cli/azure/install-azure-cli?view=azure-cli-latest
使用以下命令安裝kubectl命令行工具:
Kubectl工具安裝完成之后,可以將kubectl的路徑添加到PATH環(huán)境變量中,方便今后使用。然后,執(zhí)行下面的命令,以下載集群的登錄連接憑證:
1 | az aks get-credentials --resource-group <resource_group> --name <k8s_cluster_name> |
此處<resource_group>表示在創(chuàng)建Kubernetes集群時指定的資源組名稱,<k8s_cluster_name>則是創(chuàng)建集群時指定的Kubernetes集群名稱
執(zhí)行以下命令,即可打開Kubernetes集群的儀表盤(Dashboard),其中參數如上所述:
1 | az aks browse --resource-group<resource_group> --name <k8s_cluster_name> |
在完成上述步驟之后,可以看到Dashboard被正常打開:
目前除了kubernetes服務之外,沒有部署任何其它的組件。除了使用Dashboard,我們也可以使用kubectl命令行工具,比如,通過以下命令查看已經部署的服務:
接下來,讓我們一起看看如何將由Azure DevOps構建好的tasklist應用程序容器部署到這個Kubernetes集群中。
在前一篇文章中,我們已經將構建生成的容器鏡像推送到Docker Hub中,并將用于部署的yml文件復制到了構建輸出目錄。簡便起見,我已經將yml文件保存到了代碼庫中,在tasklist的代碼庫中,目前有三個yml文件:docker-compose.pki.yml,docker-compose.yml以及k8s.deployment.yml。前兩個文件都是用于構建或者運行容器的(docker-compose.pki.yml文件是我私人使用的,這里可以忽略),只有k8s.deployment.yml才是真正用來實現部署的。接下來,我們將使用這個k8s.deployment.yml,將tasklist容器部署到Kubernetes集群中。
Compose?Kompose?
在Kubernetes上部署容器應用,需要使用YAML格式的配置文件,然后使用kubectl apply命令實現部署。通過閱讀官方網站的文檔,你會發(fā)現其實編寫這些YAML文件還是有一定工作量的。對于tasklist案例,我使用Google官方的Kompose命令行工具,它可以很方便地將Docker Compose文件轉為Kubernetes的部署文件。官方的解釋就是:Kubernetes + Compose = Kompose。不過可惜的是,Kompose的網站在國內是打不開的,不過可以通過Kompose的代碼庫來了解這個工具。tasklist所使用的k8s.deployment.yml文件,正是通過Kompose生成的,不過我也基于自己的需要進行了一些簡單的定制。
在Azure Pipeline中創(chuàng)建部署任務
打開Azure DevOps管理界面,選擇我們在上一講中創(chuàng)建的tasklist-demo項目,然后,在Pipelines下選擇Releases,然后點擊New pipeline按鈕,新建一個Release Pipeline。
然后,在Select a template頁面,選擇Deploy to a Kubernetes cluster模板,點擊Apply按鈕使用該模板:
在Stage的配置中,填入Stage的名稱:
回到All pipelines的配置界面,首先為我們的部署任務起個名字,然后,點擊Add an artifact選項,將之前持續(xù)集成的輸出結果文件,也就是用于k8s部署的YAML文件作為Release Pipeline的輸入,添加到Artifacts中。在Add an artifact界面中,我們選擇Build類型,表示要使用構建的輸出結果,然后,Source選擇Build Pipeline的名稱,也就是tasklist-demo,其它選項可以默認。當然,你也可以根據自己項目的需求對這些默認的設置進行更改,不過,在此也就不多介紹了。一切設置好之后,點擊Add按鈕,將Artifact加入Release Pipeline。
之后,點擊創(chuàng)建好的K8S Deployment stage,在Agent job列表中,選擇kubectl apply,表示我們需要更改一個Kubernetes的集群,然后,在右邊的Deploy to Kubernetes界面中,進行如下設置:
Display name:當前任務的名稱,隨便起一個有意義的名字就行了
Kubernetes service connection:選擇所需部署的k8s集群的連接信息。目前我們沒有可用的連接,所以需要創(chuàng)建一個。點擊New按鈕即可創(chuàng)建:
回到Deploy to Kubernetes頁面,此時Kubernetes service connection會自動選中剛剛所創(chuàng)建的Kubernetes連接
勾選Use Configuration file復選框,在Configuration file文本框右邊點擊省略號按鈕:
在Select a file or folder對話框中,選擇k8s.deployment.yml。還記得上面我們選擇Build作為Artifact的類型嗎?這個k8s.deployment.yml就是從那邊復制過來的:
對于其它的配置選項,我們暫且使用默認值,然后點擊Save按鈕,保存我們的Release Pipeline設置
觸發(fā)部署事件
在成功創(chuàng)建了Azure Kubernetes集群,并在Azure DevOps Pipeline中創(chuàng)建了Release Pipeline之后,就可以嘗試將我們的tasklist應用部署到AKS了。回到Pipelines\Releases界面,選擇剛剛新建的Pipeline,然后點擊Release下拉菜單,選擇Create a release選項:
在Create a new release頁面中,指定所需部署的編譯版本,然后填入一些描述信息后,點擊Create按鈕,即可手工觸發(fā)部署。
成功部署之后,會在Release Pipeline的K8S Deployment stage上顯示出狀態(tài):
點擊Logs按鈕,可以查看詳細的部署信息。事實上,通過編輯K8S Deployment stage的設置,還可以選擇部署執(zhí)行的觸發(fā)條件,比如,是僅通過手工觸發(fā),還是在每次release之后觸發(fā),還可以設置觸發(fā)時間以及通過Pull Request創(chuàng)建觸發(fā)等,限于文章篇幅,這里就不多介紹了。對這部分有需求的讀者請根據自己的實際情況自行設置。
現在回到命令行,通過kubectl get po命令,可以看到,我們的容器已經正常運行:
通過kubectl get svc命令,可以看到我們已經部署在Kubernetes集群中的服務:
在上面的服務列表中可以看到,tasklist-web服務的類型是LoadBalancer,也就是這個服務會有一個公網可訪問的IP地址。這個IP地址就是104.211.50.78。現在打開瀏覽器,直接訪問這個IP地址,可以看到,我們的tasklist已經成功運行在Azure Kubernetes集群中:
還可以使用下面的命令對tasklist的ASP.NET Core應用程序(也就是后端)進行伸縮:
然后看看執(zhí)行后有多少個Pods在運行:
本文是有關ASP.NET Core應用程序容器化以及Azure DevOps持續(xù)集成、持續(xù)部署和Azure Kubernetes Service部署相關內容介紹的最后一篇文章。在這個系列中,我們首先介紹了ASP.NET Core應用程序容器化所需注意的要點,然后介紹了基于容器開發(fā)與部署的CI/CD流程,之后包含了有關在Azure DevOps中創(chuàng)建持續(xù)集成和持續(xù)部署任務的內容,然后是在Azure Kubernetes集群中部署我們的應用程序。相關內容還是比較多的,因此,也無法在這個系列文章中一一介紹完。對于這方面技術感興趣的讀者,我仍然推薦閱讀tasklist的源代碼庫,因為它是一個完整的案例,它涵蓋了一個ASP.NET Core應用程序容器化之路的各個方面。在今后的文章中,我還會對DevOps以及代碼庫分支策略等內容進行介紹,歡迎廣大讀者閱讀討論。
原文地址:http://sunnycoding.cn/2018/10/26/dockerize-aspnetcore-cicd-with-azure-devops-and-kubernetes-part3/
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(三的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IdentityServer4-前后端分
- 下一篇: ASP.NET Core开源Web应用程