第二十七期 啟迪雲解決方案架構師 費海強

Docker容器改變了人們對開發、部署和維護軟體的思考方式,利用現代作業系統的本機隔離功能,容器支援類似於虛擬機器的關注點分離,但是與基於虛擬機器監控程式的虛擬機器相比,它的開銷要小得多,部署的靈活性也要大得多。

容器非常輕巧靈活,它們產生了新的應用程式架構,新方法是將構成應用程式的不同服務打包到單獨的容器中,並在物理或虛擬機器群集中部署這些容器。這就需要容器編排 - 一種自動化基於容器的應用程式的部署,管理,擴充套件,網路和可用性的工具。

Kubernetes,這個源自Google的開源專案可以自動化大規模部署和管理多容器應用程式的過程,雖然Kubernetes主要使用Docker,但它也適用於符合容器影象格式和執行時的Open Container Initiative(OCI)標準的任何容器系統。而且由於Kubernetes是開源的,對其使用方式的限制相對較少,任何想要執行容器的人都可以自由使用它。

一、Kubernetes

VS

Docker

Kubernetes不會取代Docker,但會增加它的功能,但是,Kubernetes 確實取代了Docker中出現的一些更高級別的技術。

其中一種技術是Docker Swarm,一個與Docker捆綁在一起的編排器,它仍然可以使用Swarm而不是Kubernetes,但Docker公司已經選擇讓Kubernetes成為Docker社群和Docker Enterprise版本的一部分。

並不是說Kubernetes是Swarm的直接替代品。Kubernetes比Swarm複雜得多,需要更多的工作才能部署,但同樣,這項工作旨在從長遠來看提供巨大的回報- 一個更易於管理,更具彈性的應用程式基礎架構。對於開發工作和較小的容器叢集,Docker Swarm提供了一個更簡單的選擇。

二、Kubernetes 集裝箱管理

高階語言(如Python或C#)為使用者提供抽象和庫,以便他們可以專注於完成手頭的任務,而不是陷入記憶體管理的細節。

Kubernetes與容器編排的工作方式相同,它為管理容器組提供了高階抽象,允許Kubernetes使用者專注於他們期待的應用程式執行方式,而不是擔心具體的實現細節。他們需要的行為與提供它們的元件分離。

Kubernetes旨在自動化和簡化許多容器管理任務,它具備如下的關鍵功能:

Kubernetes部署了多容器應用程式

許多應用程式不僅存在於一個容器中,它們是由一堆容器構建,可能是一個數據庫,或是Web前端,也許是一個快取伺服器。微服務也是以這種方式構建的,通常為每個服務、Web協議和API繪製單獨的資料庫,以將服務聯絡在一起。雖然將應用程式作為微服務來構建有長期的優勢,但它帶來了許多短期的繁重工作。

Kubernetes減少了實現此類應用程式所需的工作量,你告訴Kubernetes如何從一組容器中組成一個應用程式,Kubernetes處理將它們推出,保持它們執行並保持元件彼此同步的細節。

Kubernetes擴充套件了容器化應用程式

應用程式需要能夠上下調整以滿足需求,平衡傳入負載,並更好地利用物理資源。Kubernetes具備做所有這些事情的條件,並以自動化,不干涉的方式進行。

Kubernetes推出新版本的應用程式,無需停機

基於容器的應用程式開發工作流程的部分吸引力在於實現持續整合和交付,Kubernetes具有允許對新版本的容器映像進行優雅更新的機制,包括在出現問題時進行回滾。

Kubernetes提供網路,服務發現和儲存

Kubernetes處理許多其他基於容器的應用程式的複雜細節,讓容器相互通訊,處理服務發現以及為來自各種提供商(例如,亞馬遜的EBS)的容器提供持久儲存都透過Kubernetes及其API進行處理。

Kubernetes提供監視,日誌記錄和除錯

眾所周知,容器是不透明的。Kubernetes提供用於獲取有關容器和容器組狀態的實時資訊的服務,以及有關群集中開發人員操作的詳細資訊。

Kubernetes允許進行非破壞性自定義

Kubernetes叢集可能需要調整其目標環境,但一些調整會使未來的升級變得困難。Kubernetes的本機功能之一,自定義資源定義,允許開發人員擴充套件和自定義Kubernetes的API,而不會破壞與Kubernetes庫存的相容性。

Kubernetes在任何環境中運營

Kubernetes與特定的雲環境或技術無關,它可以在任何支援容器的地方執行,這意味著公共雲,私有堆疊,虛擬和物理硬體以及單個開發人員的膝上型電腦都是Kubernetes可以玩的地方。Kubernetes叢集也可以執行上述任何組合。這甚至包括Windows和Linux系統的混合。

三、Kubernetes 如何運作

Kubernetes的架構利用了各種概念和抽象,其中一些是現有的,熟悉的概念的變體,但其他一些是Kubernetes特有的。

Kubernetes叢集

最高級別的Kubernetes抽象(cluster)是指執行Kubernetes(本身是叢集應用程式)的一組機器及其管理的容器,一個Kubernetes叢集必須有一個master,即命令和控制叢集中所有其他Kubernetes機器的系統。一個高可用性的Kubernetes叢集在多臺機器上覆制master的設施,但一次只有一個主控形狀執行作業排程程式和控制器管理器。

Kubernetes節點和pods

每個叢集都包含Kubernetes節點,節點可以是物理機器或虛擬機器,同樣,這個想法是抽象的:無論應用程式執行在什麼地方,Kubernetes都會處理在那個底層上的部署。還可以確保某些容器僅在虛擬機器上執行或僅在裸金屬上執行。

節點執行pods,這是可以建立或管理的最基本的Kubernetes物件,每個pod表示Kubernetes中應用程式或執行程序的單個例項,由一個或多個容器組成。Kubernetes開始、停止並將pod中的所有容器作為一個組複製。pods讓使用者關注應用程式,而不是容器本身。有關如何配置Kubernetes的詳細資訊,從pods的狀態開始,儲存在一個分散式鍵值儲存Etcd中。

根據需要在節點上建立和銷燬pods,以符合使用者在pod定義中指定的所需狀態。Kubernetes提供了一個稱為控制器的抽象概念,用於處理如何旋轉、展開和旋轉pods的物流。控制器有幾種不同的風格,這取決於所管理的應用程式的型別。例如,最近引入的“StatefulSet”控制器用於處理需要持久狀態的應用程式。另一種控制器,部署,用於向上或向下擴充套件應用程式,將應用程式更新為新版本,或者在出現問題時將應用程式回滾到已知的良好版本。

Kubernetes服務

因為pods根據需要生存和死亡,我們需要一個不同的抽象來處理應用程式生命週期。應用程式應該是一個持久化實體,即使執行構成應用程式的容器的pod本身不是持久的。為此,Kubernetes提供了一種稱為服務的抽象。

服務描述瞭如何透過網路訪問給定的pod組(或其他Kubernetes物件),正如Kubernetes文件所說,構成應用程式後端的pod可能會發生變化,但前端不應該知道或跟蹤它。服務使這成為可能。

Kubernetes內部的一些內容使圖片更加完美,該排程包裹了工作量,以使他們在整個資源平衡和使部署滿足應用程式定義的要求節點。所述控制器管理器保證了系統的應用程式,工作負載,狀態等-匹配ETCD的配置設定定義的期望的狀態。

重要的是要記住,容器使用的低階機制(如Docker本身)都不會被Kubernetes 取代。相反,為了保持應用程式大規模執行,Kubernetes提供了一組更大的抽象來使用它們。