
8月19日的數(shù)人云線下Meetup,微軟中國有限公司創(chuàng)新技術(shù)合作事業(yè)部技術(shù)顧問趙文婧,從容器、虛擬機、微服務(wù)等方面為大家分享了Azure云平臺容器技術(shù)服務(wù),以下是本次分享的實錄。
容器VS虛擬機

容器和虛擬機作為虛擬化技術(shù),為我們提供了一個隔離的、獨立的運行環(huán)境,但兩者最大的不同之處是容量具有輕量級的優(yōu)勢,上圖可以看到,每個虛擬機內(nèi)部都有完整的操作系統(tǒng),但一個主機上運行的多個容器是共享Linux內(nèi)核的,容器和虛擬機的不同之處可以分為以下幾點:
- 操作系統(tǒng):虛擬機有完整的操作系統(tǒng),容器共享內(nèi)核。
- 體積:虛擬機包含完整的操作系統(tǒng),才創(chuàng)建過程中要給其分配一定量的內(nèi)存去支持運轉(zhuǎn),所以虛擬機比容器的體積更大,消耗資源更多。
- 啟動:在啟動虛擬機的過程當中要從操作系統(tǒng)去啟動,因此啟動較慢,而容器的啟動時間是秒級的。

Docker是容器技術(shù)發(fā)展過程的重要變革,其ICON實鯨魚馱著非常多的集裝箱,這些集裝箱即容器,它帶來的主要變革有:提供了一套標準化的流程,可以用這個標準化的借口去將自己的應(yīng)用進行鏡像打包,然后在不同的平臺上部署和運行,Docker的寓意是碼頭工人,而它在我們部署運行的過程中起到的是綠色遷移作用。
若把容器遷移過程想象為以集裝箱為核心的運輸體系,那概念之間可以這樣對應(yīng):容器是集裝箱,云服務(wù)提供商是裝載集裝箱的港口,云服務(wù)商提供一些IaaS的服務(wù)可以理解為裝載集裝箱的拖船,同時在進行部署運行的過程中有一套標準化的流程,可以將其看做裝運流程。
隨著容器的不斷發(fā)展,可以看到可以看到容器在云平臺和物理機平臺會形成一個綠色遷移發(fā)展,總結(jié)了容器的這兩個非常重要特點之后,接下來看一下Azure都提供了哪些容器服務(wù)。
Azure Container Service

Azure提供最重要的容器服務(wù)名為:Azure Container Service,首先,對于云平臺來說,它提供的很重要的資源是Infrastructure,無需購買虛擬機配置分布式集群,云平臺提供了基礎(chǔ)的框架如Azure上提供的虛擬機,它也會有其自己的Scale Sets,這些虛擬機會根據(jù)需求擴展VM的Sets,也會提供一些Availability Sts,幫助實現(xiàn)高可用。
有了基礎(chǔ)設(shè)施的架構(gòu),即可方便地在云平臺索取自己的一些計算機資源,在Infrastructure上,Azure Container Service提供了多種不同的編排工具,因為業(yè)務(wù)所用的容器是跨主機的,此時容器和容器之間需要進行通信、數(shù)據(jù)管理、網(wǎng)絡(luò)管理等,編排工具可以幫助實現(xiàn)跨主機容器應(yīng)用管理,Azure Container Service提供了三種主流的編排工具:Kuberntes、Swarm、DC/OS,可按需求自行選擇。
眾所周知,Kubernetes內(nèi)部具有一些非常復(fù)雜的資源類型,雖然它提供了很多重要的功能,但在使用時也會非常繁瑣,這里有一些工具可以幫助更好地使用Kuberentes,如DEIS這家公司的Helm和Draft。
Helm相當于軟件包的管理器,類似于Linux上的Apt-Get或Yum,通過Helm可以自動獲取一些名為Helm Chart的軟件包去快速構(gòu)建部署Kuberentes集群上的應(yīng)用。
Draft能夠自動識別應(yīng)用的語言,幫助去寫Dockerfile和Helm Charts以及快速的構(gòu)建部署引用,同時,Kuberntes是谷歌根據(jù)多年的系統(tǒng)經(jīng)驗做的編排工具,Kuberentes的創(chuàng)始人后來也加入了微軟支持Azure。
之前說到的Infrastructure和以上編排工具都通過Azure的ARM模型進行構(gòu)建,大家知道AWS有Cloud Formation,阿里云上有Resource Orchestration,類似于這種模板文件,Azure上有自己的ARM文件,可以用一些很簡單的輸入,通過ARM模板在Azure進行部署,除了可以在Azure的Portal上或Azure CLI上去創(chuàng)建Azure Container Service,也可以通過ACS的Engine去創(chuàng)建,使用一些簡單輸入的定義文件用ACS Engine轉(zhuǎn)化為ARM模板,從而快速去創(chuàng)建部署,ACS Engine現(xiàn)在是開源在GitHub上的,用戶可以在其中快速更改自己的部署,從而進行一些自定義的容器服務(wù),我們也希望這些開源的代碼能夠?qū)ι鐓^(qū)做出貢獻,也幫助我們ACS的服務(wù)更快更好地發(fā)展。
微服務(wù)+容器化

之前了解了Azure Container Service提供的一些服務(wù),下面再分享下微服務(wù)和容器化如何更好的結(jié)合,在集群部署的情況下,Azure Container Service在哪些方面起到相關(guān)作用。
首先,單體的應(yīng)用。在集群部署的過程中和容器化的應(yīng)用在集群部署的過程中有什么區(qū)別,提到微服務(wù),簡單地說即應(yīng)用程序有多少獨立的組件,希望它們能夠獨立的進行開發(fā)測試以及運行,但假設(shè)一些單體的應(yīng)用向把它部署到集群上時,為了實現(xiàn)高可用,將它在集群上的每個節(jié)點都進行部署,但對于容器化的應(yīng)用,可以把這些應(yīng)用拆分成多個獨立的組件,每個獨立的組件都能放在容器之中,為它提供一個獨立的運行環(huán)境,此時,當應(yīng)用的模塊組件放在分布式集群這些節(jié)點上時,即可自動地去根據(jù)分布式節(jié)點的計算資源調(diào)整模塊分布的位置,假如在ACS部署了一個集群,ACS會幫助做一些負載均衡及網(wǎng)絡(luò)管理的設(shè)置,可以在容器集群上更好地部署容器化應(yīng)用。
DevOps

說到DevOps,目前很難給它做一個具體的定義,但其主要目的是在應(yīng)用開發(fā)測試以及運行過程中做一個更好地銜接,使應(yīng)用更新能夠快速地進行發(fā)布,從而提升提升效率,所以DevOps和容器的特性不謀而合。
通過容器技術(shù)可以達到一次編寫部署,在這個基礎(chǔ)上構(gòu)建敏捷的DevOps開發(fā)若把應(yīng)用構(gòu)建在云上,使用Azure上的容器服務(wù),有一些工具可以使用如:Azure Container Registry,可以在它上面構(gòu)建私有的鏡像倉庫,其中存儲著Docker格式的鏡像,此倉庫可以與Azure Container Service提供的編排引擎進行集成,如果想在Kubernetes集群上進行應(yīng)用部署,可直接從這個鏡像倉庫中Push一個鏡像在上面運行,這個Push下來的過程即可直接寫在Kubernetes相關(guān)的部署文件當中。
鏡像倉庫是可以和Docker的鏡像倉庫兼容的,所以如果使用的是Docker工具,也可以進行無縫遷移,同時在Azure上使用容器化服務(wù)以及一系列持續(xù)集成工具鏈包括Visual Studio Visual Studio Team Service以及Visual Studio Code,通過一系列的集成工具鏈即可構(gòu)建版本代碼庫,同時進行人員分配的管理調(diào)度,達到更好的持續(xù)集成、持續(xù)交付概念。
Demo:用ACS服務(wù)運行應(yīng)用

接下來會為大家用比較多的時間演示Demo:在ACS上創(chuàng)建一個服務(wù),并運行應(yīng)用。
第一步:創(chuàng)建ACS的服務(wù)
有兩種方式:1、在Portal里面進行創(chuàng)建,2、在Azure的CLI里面進行創(chuàng)建。首先,這是Azure的Portal,進到里面創(chuàng)建Azure Container Service,可以自定義服務(wù)名稱,因要使用Kubernetes,我定義這樣一個名字,選擇資源組,接下來定義Master節(jié)點的屬性,可以看到很多編排工具可以選擇,選擇Kubernetes,重新再來看下,最上面可以選擇三種不同的編排引擎,接下來我們會定義Master節(jié)點的用戶名,然后用SSH的Key去登錄我們的Portal。
將SSH的Key生成完畢后,直接粘進去,下面是在創(chuàng)建服務(wù)時需要一個服務(wù)主體,之前已經(jīng)創(chuàng)建好了,使用它的ID和密碼,這里可以設(shè)置Agent節(jié)點的數(shù)量以及設(shè)置VM的Size,我們確認信息,然后即可創(chuàng)建Kuberentes的集群了,同樣還有另外一種方法可以進行Azure的CLI里,用Az Acs Create 這樣的命令來創(chuàng)建自己的集群,那么在這里我們可以指定我們的編排引擎,接著指定我們要將集群放在哪個資源組里面。
在Azure平臺里,其實都是通過資源組去管理服務(wù),比如服務(wù)需要什么樣的計算資源,都會統(tǒng)一放在某個資源組里,此時,讓不需要這項服務(wù)即可刪除整個資源組,然后去刪除這些服務(wù),下面定義節(jié)點的VM Size以及SSH Key的這些選項,進入Portal里看下之前創(chuàng)建好的Kuberntes集群,可以看到這已經(jīng)定義了Agent Master這樣一些節(jié)點,還包括一些負載均衡以及網(wǎng)絡(luò)的組件,進到Cluster里面看下它的組成:一個Agent Pool,VM Size VM Count顯示等,其實只要一些很簡單的輸入,即可快速地在Azure上創(chuàng)建一個ACS服務(wù)。
第二步:測試例子應(yīng)用程序的本地鏡像部署和運行
接下來將一個WEB的應(yīng)用部署在集群中,首先將WEB的應(yīng)用在本機上進行鏡像的打包和運行,從這個地址Clone一個應(yīng)用,確認Dockers是正在運行著的,查看本機上有哪些Docker鏡像,可以看到目前還沒有,接下來用Docker Compose這個命令去創(chuàng)建有關(guān)應(yīng)用的所有進項,它會讀取Docker Compose文件,進到Docker-Compose文件里查看,定義了兩個服務(wù),包括Azure-Vote-Back和Azure-Vote-Front,Redis是數(shù)據(jù)庫的服務(wù),Azure-Vote-Front是前端的投票應(yīng)用服務(wù)。
在創(chuàng)建的過程中,會Push一些基礎(chǔ)鏡像擴,包括Nginx這個正在Pull下來的WEB Server鏡像,還有數(shù)據(jù)庫的鏡像,生成應(yīng)用自身的鏡像,完畢后,可以看到本地現(xiàn)在有三個鏡像,此時有兩個容器正在運行,包括數(shù)據(jù)庫和應(yīng)用,再來確認下Docker Compose的文件中所確定的應(yīng)用,本機和容器之間的端口映射,可以看到,進到本機8080端口可以運行WEB應(yīng)用,這是一個投票軟件,會在這個WEB上面進行投票,而后數(shù)據(jù)庫會對這些投票進行記錄,此應(yīng)用現(xiàn)在已經(jīng)在機器上運行成功,下面會將這個應(yīng)用部署到剛才創(chuàng)建的集群上面。
第三步:創(chuàng)建Azure Registry并將應(yīng)用鏡像Push進去
在將應(yīng)用Push到集成之前,首先需要創(chuàng)建一個Azure上的容器注冊表,即創(chuàng)建屬于自己的鏡像倉庫,可以看到鏡像倉庫已經(jīng)創(chuàng)建完成,可以使用其中的Login Server和Password進行登錄,現(xiàn)在需要獲取此進項倉庫的密碼,成功后在本地登錄到鏡像倉庫中,將之前創(chuàng)建的鏡像Push到進項倉庫中,在此之前,需要用Docker Tag命令為鏡像打一個標簽,之后用Docker Images確認,這是為了下次在進行應(yīng)用更新時的版本控制。
現(xiàn)在把鏡像Push到剛才創(chuàng)建的鏡像倉庫中,在Push的過程里會不斷地顯示Push的階段,成功后進到Azure的CLI中查看已經(jīng)Push成功鏡像的List,此時顯示了剛才大號標簽的鏡像已經(jīng)Push到鏡像倉庫中。
第四步:用Kubectl連接到Kubernetes集群并在集群上運行應(yīng)用
可以看到在這個應(yīng)用下載的例子中,有一個定義Kubernetes部署的文件,那么在這個文件中定義了不同的Deployment和不同的Service,可以在這個文件中寫清自己的部署,然后利用此文件創(chuàng)建Kubernetes的部署。
將這里使用的鏡像更換成之前在鏡像倉庫中Push進去的鏡像,更換鏡像倉庫的Loginserver,然后會用Kubectl Create的命令根據(jù)剛才所看到的的部署文件去創(chuàng)建部署和服務(wù)。
現(xiàn)在創(chuàng)建了WEB應(yīng)用的部署和一些Service,接下來即可Get剛才創(chuàng)建的Service,然后同時用Watch參數(shù)進行監(jiān)控,獲得IP后,即可將Watch關(guān)掉,進入External的IP里查看應(yīng)用的運行情況。
第五步:為集群做擴展
進入此IP后,即可看到UI界面,部署完應(yīng)用后,如何給集群做擴展?有兩個方面:包括Kubernetes的單元Pod擴展,也包括集群節(jié)點的擴展,依次來看一下:
Kubernetes里面的Pods的情況,現(xiàn)在給Azure-Vote-Front進行擴展,用Kubectl Scale的這個命令擴展副本數(shù)是5個,擴展完成后再用Kubectl Get Pods這個命令進行查看,此時Azure-Vote-Front就變成了需要的5個量,可以在更多的量上去做自己的應(yīng)用計算資源的應(yīng)用,接下來看一下剛才部署文件中它其實是設(shè)置了有關(guān)請求的CUP的量,M其實指的是一千分之一核這樣的一個單位,請求CPU量為250M現(xiàn)在在500M之內(nèi),可以根據(jù)CPU的使用率去進行后面的擴展。
定義CPU的Pescent是50,即當CPU的使用率超過50%時,可以給它達到10個Azure-Vote-Front Pods的情況,可以通過這樣一個命令來查看已經(jīng)設(shè)置過的自動擴展狀態(tài),除了在Kubernetes的Pods做這樣一個擴展,還可以在VM的Count這個層面上去做一個擴展,可以設(shè)置New-Agent-Count這個數(shù)字為4,此時會從剛才的3個Count編程4個Count。
第六步:應(yīng)用更新后的快速發(fā)布
最后一步會為大家分享如何進行應(yīng)用更新后的快速部署和運行,進到剛才下載下來的應(yīng)用,進入UI定義文件,將剛才的Cats和Dogs更改成其他的單詞,讓它可以顯示在UI上,以表示更新。完成后仍之前提過的Count應(yīng)用重新給應(yīng)用進行打包鏡像,成功后此時將應(yīng)用以一個新的標簽來傳到剛才的Registry里,顯示剛才的Count結(jié)果,定義Count為4,此時編程了新的VMcount,相當于在Cluster理有4個可用的VM。
把剛才更新好的應(yīng)用重新打一個標簽:V2,發(fā)現(xiàn)已經(jīng)定義成功,接下來把打好標簽的鏡像Push到之前創(chuàng)建好的鏡像倉庫中,可以看到其實有一些內(nèi)容已經(jīng)存在了,這是剛才擴展后的情況,對這個更新好的鏡像進行重新部署,它提示這個鏡像已經(jīng)更新成功,重新看到Pods的情況是有一些已經(jīng)進行更新了,從最右邊的Age來看Pods的存在時間,下面重新Get Service來去查看這個應(yīng)用的運行結(jié)果,登錄到這個響應(yīng)的IP里去查看一下。
可以看到現(xiàn)在選項已經(jīng)編程了White和Black,從進行應(yīng)用更新到快速在集群上部署運行,只需要很短的時間即可進行。
今天給大家介紹的內(nèi)容主要是有關(guān)Azure Container Service上面的容器化應(yīng)用。謝謝大家。