GitChat · 運維 | 深入瞭解 Azure 雲平臺容器技術服務

GitChat · 運維 | 深入瞭解 Azure 雲平臺容器技術服務

GitChat 作者:趙文婧
原文:深入瞭解 Azure 雲平臺容器技術服務
關注公眾號:GitChat 技術雜談,一本正經的講技術

容器VS虛擬機器

enter image description here

容器和虛擬機器作為虛擬化技術,為我們提供了一個隔離的、獨立的執行環境,但兩者最大的不同之處是容量具有輕量級的優勢,上圖可以看到,每個虛擬機器內部都有完整的作業系統,但一個主機上執行的多個容器是共享Linux核心的,容器和虛擬機器的不同之處可以分為以下幾點:

  • 作業系統:虛擬機器有完整的作業系統,容器共享核心。

  • 體積:虛擬機器包含完整的作業系統,才建立過程中要給其分配一定量的記憶體去支援運轉,所以虛擬機器比容器的體積更大,消耗資源更多。

  • 啟動:在啟動虛擬機器的過程當中要從作業系統去啟動,因此啟動較慢,而容器的啟動時間是秒級的。

enter image description here

Docker是容器技術發展過程的重要變革,其ICON實鯨魚馱著非常多的集裝箱,這些集裝箱即容器,它帶來的主要變革有:提供了一套標準化的流程,可以用這個標準化的藉口去將自己的應用進行映象打包,然後在不同的平臺上部署和執行,Docker的寓意是碼頭工人,而它在我們部署執行的過程中起到的是綠色遷移作用。

若把容器遷移過程想象為以集裝箱為核心的運輸體系,那概念之間可以這樣對應:容器是集裝箱,雲服務提供商是裝載集裝箱的港口,雲服務商提供一些IaaS的服務可以理解為裝載集裝箱的拖船,同時在進行部署執行的過程中有一套標準化的流程,可以將其看做裝運流程。

隨著容器的不斷髮展,可以看到可以看到容器在雲平臺和物理機平臺會形成一個綠色遷移發展,總結了容器的這兩個非常重要特點之後,接下來看一下Azure都提供了哪些容器服務。

enter image description here

Azure提供最重要的容器服務名為:Azure Container Service,首先,對於雲平臺來說,它提供的很重要的資源是Infrastructure,無需購買虛擬機器配置分散式叢集,雲平臺提供了基礎的框架如Azure上提供的虛擬機器,它也會有其自己的Scale Sets,這些虛擬機器會根據需求擴充套件VM的Sets,也會提供一些Availability Sts,幫助實現高可用。

有了基礎設施的架構,即可方便地在雲平臺索取自己的一些計算機資源,在Infrastructure上,Azure Container Service提供了多種不同的編排工具,因為業務所用的容器是跨主機的,此時容器和容器之間需要進行通訊、資料管理、網路管理等,編排工具可以幫助實現跨主機容器應用管理,Azure Container Service提供了三種主流的編排工具:Kuberntes、Swarm、DC/OS,可按需求自行選擇。

眾所周知,Kubernetes內部具有一些非常複雜的資源型別,雖然它提供了很多重要的功能,但在使用時也會非常繁瑣,這裡有一些工具可以幫助更好地使用Kuberentes,如DEIS這家公司的Helm和Draft。

  • Helm相當於軟體包的管理器,類似於Linux上的Apt-Get或Yum,通過Helm可以自動獲取一些名為Helm Chart的軟體包去快速構建部署Kuberentes叢集上的應用。

  • Draft能夠自動識別應用的語言,幫助去寫Dockerfile和Helm Charts以及快速的構建部署引用,同時,Kuberntes是谷歌根據多年的系統經驗做的編排工具,Kuberentes的創始人後來也加入了微軟支援Azure。

之前說到的Infrastructure和以上編排工具都通過Azure的ARM模型進行構建,大家知道AWS有Cloud Formation,阿里雲上有Resource Orchestration,類似於這種模板檔案,Azure上有自己的ARM檔案,可以用一些很簡單的輸入,通過ARM模板在Azure進行部署,除了可以在Azure的Portal上或Azure CLI上去建立Azure Container Service,也可以通過ACS的Engine去建立,使用一些簡單輸入的定義檔案用ACS Engine轉化為ARM模板,從而快速去建立部署,ACS Engine現在是開源在GitHub上的,使用者可以在其中快速更改自己的部署,從而進行一些自定義的容器服務,我們也希望這些開源的程式碼能夠對社群做出貢獻,也幫助我們ACS的服務更快更好地發展。

微服務 容器化

enter image description here

之前瞭解了Azure Container Service提供的一些服務,下面再分享下微服務和容器化如何更好的結合,在叢集部署的情況下,Azure Container Service在哪些方面起到相關作用。

首先,單體的應用。在叢集部署的過程中和容器化的應用在叢集部署的過程中有什麼區別,提到微服務,簡單地說即應用程式有多少獨立的元件,希望它們能夠獨立的進行開發測試以及執行,但假設一些單體的應用向把它部署到叢集上時,為了實現高可用,將它在叢集上的每個節點都進行部署,但對於容器化的應用,可以把這些應用拆分成多個獨立的元件,每個獨立的元件都能放在容器之中,為它提供一個獨立的執行環境,此時,當應用的模組元件放在分散式叢集這些節點上時,即可自動地去根據分散式節點的計算資源調整模組分佈的位置,假如在ACS部署了一個叢集,ACS會幫助做一些負載均衡及網路管理的設定,可以在容器叢集上更好地部署容器化應用。

DevOps

enter image description here

說到DevOps,目前很難給它做一個具體的定義,但其主要目的是在應用開發測試以及執行過程中做一個更好地銜接,使應用更新能夠快速地進行釋出,從而提升提升效率,所以DevOps和容器的特性不謀而合。

通過容器技術可以達到一次編寫部署,在這個基礎上構建敏捷的DevOps開發若把應用構建在雲上,使用Azure上的容器服務,有一些工具可以使用如:Azure Container Registry,可以在它上面構建私有的映象倉庫,其中儲存著Docker格式的映象,此倉庫可以與Azure Container Service提供的編排引擎進行整合,如果想在Kubernetes叢集上進行應用部署,可直接從這個映象倉庫中Push一個映象在上面執行,這個Push下來的過程即可直接寫在Kubernetes相關的部署檔案當中。

映象倉庫是可以和Docker的映象倉庫相容的,所以如果使用的是Docker工具,也可以進行無縫遷移,同時在Azure上使用容器化服務以及一系列持續整合工具鏈包括Visual Studio Visual Studio Team Service以及Visual Studio Code,通過一系列的整合工具鏈即可構建版本程式碼庫,同時進行人員分配的管理排程,達到更好的持續整合、持續交付概念。

Demo:用ACS服務執行應用

enter image description here

接下來會為大家用比較多的時間演示Demo:在ACS上建立一個服務,並執行應用。

第一步:建立ACS的服務

有兩種方式:

  • 在Portal裡面進行建立。

  • 在Azure的CLI裡面進行建立。

首先,這是Azure的Portal,進到裡面建立Azure Container Service,可以自定義服務名稱,因要使用Kubernetes,我定義這樣一個名字,選擇資源組,接下來定義Master節點的屬性,可以看到很多編排工具可以選擇,選擇Kubernetes,重新再來看下,最上面可以選擇三種不同的編排引擎,接下來我們會定義Master節點的使用者名稱,然後用SSH的Key去登入我們的Portal。

將SSH的Key生成完畢後,直接粘進去,下面是在建立服務時需要一個服務主體,之前已經建立好了,使用它的ID和密碼,這裡可以設定Agent節點的數量以及設定VM的Size,我們確認資訊,然後即可建立Kuberentes的叢集了,同樣還有另外一種方法可以進行Azure的CLI裡,用Az Acs Create 這樣的命令來建立自己的叢集,那麼在這裡我們可以指定我們的編排引擎,接著指定我們要將叢集放在哪個資源組裡面。

在Azure平臺裡,其實都是通過資源組去管理服務,比如服務需要什麼樣的計算資源,都會統一放在某個資源組裡,此時,讓不需要這項服務即可刪除整個資源組,然後去刪除這些服務,下面定義節點的VM Size以及SSH Key的這些選項,進入Portal裡看下之前建立好的Kuberntes叢集,可以看到這已經定義了Agent Master這樣一些節點,還包括一些負載均衡以及網路的元件,進到Cluster裡面看下它的組成:一個Agent Pool,VM Size VM Count顯示等,其實只要一些很簡單的輸入,即可快速地在Azure上建立一個ACS服務。

第二步:測試例子應用程式的本地映象部署和執行

接下來將一個WEB的應用部署在叢集中,首先將WEB的應用在本機上進行映象的打包和執行,從這個地址Clone一個應用,確認Dockers是正在執行著的,檢視本機上有哪些Docker映象,可以看到目前還沒有,接下來用Docker Compose這個命令去建立有關應用的所有進項,它會讀取Docker Compose檔案,進到Docker-Compose檔案裡檢視,定義了兩個服務,包括Azure-Vote-Back和Azure-Vote-Front,Redis是資料庫的服務,Azure-Vote-Front是前端的投票應用服務。

在建立的過程中,會Push一些基礎映象擴,包括Nginx這個正在Pull下來的WEB Server映象,還有資料庫的映象,生成應用自身的映象,完畢後,可以看到本地現在有三個映象,此時有兩個容器正在執行,包括資料庫和應用,再來確認下Docker Compose的檔案中所確定的應用,本機和容器之間的埠對映,可以看到,進到本機8080埠可以執行WEB應用,這是一個投票軟體,會在這個WEB上面進行投票,而後資料庫會對這些投票進行記錄,此應用現在已經在機器上執行成功,下面會將這個應用部署到剛才建立的叢集上面。

第三步:建立Azure Registry並將應用映象Push進去

在將應用Push到整合之前,首先需要建立一個Azure上的容器登錄檔,即建立屬於自己的映象倉庫,可以看到映象倉庫已經建立完成,可以使用其中的Login Server和Password進行登入,現在需要獲取此進項倉庫的密碼,成功後在本地登入到映象倉庫中,將之前建立的映象Push到進項倉庫中,在此之前,需要用Docker Tag命令為映象打一個標籤,之後用Docker Images確認,這是為了下次在進行應用更新時的版本控制。

現在把映象Push到剛才建立的映象倉庫中,在Push的過程裡會不斷地顯示Push的階段,成功後進到Azure的CLI中檢視已經Push成功映象的List,此時顯示了剛才大號標籤的映象已經Push到映象倉庫中。

第四步:用Kubectl連線到Kubernetes叢集並在叢集上執行應用

可以看到在這個應用下載的例子中,有一個定義Kubernetes部署的檔案,那麼在這個檔案中定義了不同的Deployment和不同的Service,可以在這個檔案中寫清自己的部署,然後利用此檔案建立Kubernetes的部署。

將這裡使用的映象更換成之前在映象倉庫中Push進去的映象,更換映象倉庫的Loginserver,然後會用Kubectl Create的命令根據剛才所看到的的部署檔案去建立部署和服務。

現在建立了WEB應用的部署和一些Service,接下來即可Get剛才建立的Service,然後同時用Watch引數進行監控,獲得IP後,即可將Watch關掉,進入External的IP裡檢視應用的執行情況。

第五步:為叢集做擴充套件

進入此IP後,即可看到UI介面,部署完應用後,如何給叢集做擴充套件?有兩個方面:包括Kubernetes的單元Pod擴充套件,也包括叢集節點的擴充套件,依次來看一下:

Kubernetes裡面的Pods的情況,現在給Azure-Vote-Front進行擴充套件,用Kubectl Scale的這個命令擴充套件副本數是5個,擴充套件完成後再用Kubectl Get Pods這個命令進行檢視,此時Azure-Vote-Front就變成了需要的5個量,可以在更多的量上去做自己的應用計算資源的應用,接下來看一下剛才部署檔案中它其實是設定了有關請求的CUP的量,M其實指的是一千分之一核這樣的一個單位,請求CPU量為250M現在在500M之內,可以根據CPU的使用率去進行後面的擴充套件。

定義CPU的Pescent是50,即當CPU的使用率超過50%時,可以給它達到10個Azure-Vote-Front Pods的情況,可以通過這樣一個命令來檢視已經設定過的自動擴充套件狀態,除了在Kubernetes的Pods做這樣一個擴充套件,還可以在VM的Count這個層面上去做一個擴充套件,可以設定New-Agent-Count這個數字為4,此時會從剛才的3個Count程式設計4個Count。

第六步:應用更新後的快速釋出

最後一步會為大家分享如何進行應用更新後的快速部署和執行,進到剛才下載下來的應用,進入UI定義檔案,將剛才的Cats和Dogs更改成其他的單詞,讓它可以顯示在UI上,以表示更新。完成後仍之前提過的Count應用重新給應用進行打包映象,成功後此時將應用以一個新的標籤來傳到剛才的Registry裡,顯示剛才的Count結果,定義Count為4,此時程式設計了新的VMcount,相當於在Cluster理有4個可用的VM。

把剛才更新好的應用重新打一個標籤:V2,發現已經定義成功,接下來把打好標籤的映象Push到之前建立好的映象倉庫中,可以看到其實有一些內容已經存在了,這是剛才擴充套件後的情況,對這個更新好的映象進行重新部署,它提示這個映象已經更新成功,重新看到Pods的情況是有一些已經進行更新了,從最右邊的Age來看Pods的存在時間,下面重新Get Service來去檢視這個應用的執行結果,登入到這個響應的IP裡去檢視一下。

可以看到現在選項已經程式設計了White和Black,從進行應用更新到快速在叢集上部署執行,只需要很短的時間即可進行。

今天給大家介紹的內容主要是有關Azure Container Service上面的容器化應用。謝謝大家。


這裡寫圖片描述