一、何為容器編排

Docker平臺以及周邊生態系統包含很多工具來管理容器的生命週期。例如,Docker Command Line Interface(CLI)滿足在單個主機上管理容器的需求,但是面對部署在多個主機上的容器時就無所適從了。為了超越單個容器管理,我們必須轉向編排工具。容器編排工具將生命週期管理能力擴充套件到部署在大量機器叢集上部署的複雜的、多容器工作負載。

容器編排工具為開發人員和基礎設施團隊提供了一個抽象層來處理大規模的容器化部署。容器編排工具提供的特徵在眾多提供者之間有所不同,然而常見的公共特徵包含準備、發現、資源管理、監視和部署。

由於微服務將應用程式分解為不同的微應用程式,許多開發人員會請求更多的伺服器節點進行部署。為了正確地管理微服務,開發者傾向於在每個VM中部署一個微服務,這進一步降低了資源利用率。在許多情況下,這會導致CPU和記憶體的過度分配。

在許多部署中,微服務的高可用性需求迫使工程師新增越來越多的服務例項來進行冗餘。實際上,儘管它提供了所需的高可用性,但這將導致出現一些未充分利用的伺服器例項。一般而言,與單一應用程式部署相比,微服務部署需要更多的基礎設施。由於基礎設施成本的增加,許多組織未能看到微服務的價值。

為了解決上面提到的問題,我們需要一個工具能做到以下幾點:

活動自動化:例如有效地向基礎設施分配容器,這一行為對開發人員和管理員都是透明的。為開發人員提供一個抽象層,以便他們可以在不知道使用哪個機器託管他們的應用程式的情況下,將應用程式部署到資料中心。 對部署設定規則或約束。

提供更高的敏捷性,為開發人員和管理員提供最小的管理開銷和最少的人為互動。 透過最大限度地利用可用資源,有效地構建、部署和管理應用程式。

典型的容器編排工具有助於虛擬化一組機器並將它們作為單個叢集管理。

容器編排工具也有助於將機器上的工作負載或容器移動到消費者透明的位置。很多工具目前既支援基於DOCKER的容器,也支援非容器化二進位制檔案部署,例如獨立的Spring Boot應用程式。這些容器編排工具的基本功能是從應用程式中抽象出實際的伺服器例項。

容器編排關鍵能力概括

叢集管理:將虛擬機器和物理機器的叢集管理為一臺大型機器。這些機器在資源能力方面可能有些差異,但大體上都是以Linux作為作業系統的機器。這些虛擬叢集可以建立在雲上、本地或兩者的混合。

部署:能處理有大量機器的應用程式和容器的自動部署。支援多個版本的應用程式容器,並且還支援跨越大量叢集機器的滾動升級。這些工具還能夠處理故障回滾。

可伸縮性:支援應用例項的自動和手動伸縮,以效能最佳化為主要目標。

健康:它管理叢集、節點和應用程式的健康。可以從叢集中移除異常的機器和應用程式例項。

基礎結構抽象化:開發人員不必擔心機器、容量等問題。完全是容器編排工具來決定如何排程和執行應用程式。這些工具也抽象化機器的細節、能力、使用和位置。對於應用程式所有者來說,它們相當於一個容量幾乎無限的大型機器。

資源最佳化:這些工具以有效的方式在一組可用機器上分配容器工作負載,從而降低成本,透過從簡單的到複雜的演算法可有效地提高利用率。

資源分配:基於應用程式開發人員設定的資源可用性和約束來分配伺服器。資源分配將基於約束、規則、埠要求、應用依賴性、健康等等。

服務可用性:確保服務在叢集中正常執行。在機器故障的情況下,容器編排會自動透過在叢集中的其他機器上重新啟動這些服務來處理故障。

敏捷性:敏捷性工具能夠快速分配工作負載到可用資源,或者在資源需求發生變化時跨機器移動工作量。此外,可以根據業務臨界性、業務優先順序等來設定約束重新調整資源。

隔離:一些工具提供了資源隔離。因此,即使應用程式不是容器化的,也可以實現資源隔離。

二、開啟Kubernetes大門

首先,他是一個全新的基於容器技術的分散式架構領先方案。

Kubernetes(k8s)是Google開源的容器叢集管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署執行、資源排程、服務發現和動態伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。

Kubernetes是一個完備的分散式系統支撐平臺,具有完備的叢集管理能力,多擴多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智慧負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和線上擴容能力、可擴充套件的資源自動排程機制以及多粒度的資源配額管理能力。

同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。

Kubernetes中,Service是分散式叢集架構的核心,一個Service物件擁有如下關鍵特徵:

​ 擁有一個唯一指定的名字

​ 擁有一個虛擬IP(Cluster IP、Service IP、或VIP)和埠號

​ 能夠提供某種遠端服務能力被對映到提供這種服務能力的一組容器應用上

Service的服務程序目前都是基於Socket通訊方式對外提供服務,比如Redis、Memcache、MySQL、Web Server,或者是實現了某個具體業務的一個特定的TCP Server程序,雖然一個Service通常由多個相關的服務程序來提供服務,每個服務程序都有一個獨立的Endpoint(IP+Port)訪問點,但Kubernetes能夠讓我們透過服務連線到指定的Service上。有了Kubernetes內建的透明負載均衡和故障恢復機制,不管後端有多少服務程序,也不管某個服務程序是否會由於發生故障而重新部署到其他機器,都不會影響我們隊服務的正常呼叫,更重要的是這個Service本身一旦建立就不會發生變化,意味著在Kubernetes叢集中,我們不用為了服務的IP地址的變化問題而頭疼了。

容器提供了強大的隔離功能,所以必要把為Service提供服務的這組程序放入容器中進行隔離。為此,Kubernetes設計了Pod物件,將每個服務程序包裝到相對應的Pod中,使其成為Pod中執行的一個容器。為了建立Service與Pod間的關聯管理,Kubernetes給每個Pod貼上一個標籤Label,比如執行MySQL的Pod貼上name=mysql標籤,給執行PHP的Pod貼上name=php標籤,然後給相應的Service定義標籤選擇器Label Selector,這樣就能巧妙的解決了Service於Pod的關聯問題。

在叢集管理方面,Kubernetes將叢集中的機器劃分為一個Master節點和一群工作節點Node,其中,在Master節點執行著叢集管理相關的一組程序kube-apiserver、kube-controller-manager和kube-scheduler,這些程序實現了整個叢集的資源管理、Pod排程、彈性伸縮、安全控制、系統監控和糾錯等管理能力,並且都是全自動完成的。Node作為叢集中的工作節點,執行真正的應用程式,在Node上Kubernetes管理的最小執行單元是Pod。Node上執行著Kubernetes的kubelet、kube-proxy服務程序,這些服務程序負責Pod的建立、啟動、監控、重啟、銷燬以及實現軟體模式的負載均衡器。

在Kubernetes叢集中,它解決了傳統IT系統中服務擴容和升級的兩大難題。你只需為需要擴容的Service關聯的Pod建立一個Replication Controller簡稱(RC),則該Service的擴容及後續的升級等問題將迎刃而解。在一個RC定義檔案中包括以下3個關鍵資訊。 目標Pod的定義 目標Pod需要執行的副本數量(Replicas) 要監控的目標Pod標籤(Label) 在建立好RC後,Kubernetes會透過RC中定義的的Label篩選出對應Pod例項並實時監控其狀態和數量,如果例項數量少於定義的副本數量,則會根據RC中定義的Pod模板來建立一個新的Pod,然後將新Pod排程到合適的Node上啟動執行,知道Pod例項的數量達到預定目標,這個過程完全是自動化。

Kubernetes優勢

容器編排

輕量級

開源

彈性伸縮

負載均衡

三、Kubernetes核心概念

Master

Master主要負責 資源排程,控制副本,和提供統一訪問叢集的入口。

Node

Node是Kubernetes叢集架構中執行Pod的服務節點(亦叫agent或minion)。Node是Kubernetes叢集操作的單元,用來承載被分配Pod的執行,是Pod執行的宿主機,由Master管理,並彙報容器狀態給Master,同時根據Master要求管理容器生命週期。

注:minion 英音 /‘mɪnjən/ 美音 /’mɪnɪən/

n。 奴才;寵臣

adj。 嬌美的,美雅的

Node IP

Node節點的IP地址,是Kubernetes叢集中每個節點的物理網絡卡的IP地址,是真是存在的物理網路,所有屬於這個網路的伺服器之間都能透過這個網路直接通訊;

Pod

Pod直譯是豆莢,可以把容器想像成豆莢裡的豆子,把一個或多個關係緊密的豆子包在一起就是豆莢(一個Pod)。在k8s中我們不會直接操作容器,而是把容器包裝成Pod再進行管理

運行於Node節點上, 若干相關容器的組合。Pod內包含的容器執行在同一宿主機上,使用相同的網路名稱空間、IP地址和埠,能夠透過localhost進行通訊。Pod是k8s進行建立、排程和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。一個Pod可以包含一個容器或者多個相關容器。

Pod 就是 k8s 世界裡的“應用”;而一個應用,可以由多個容器組成。

pause容器

每個Pod中都有一個pause容器,pause容器做為Pod的網路接入點,Pod中其他的容器會使用容器對映模式啟動並接入到這個pause容器。

屬於同一個Pod的所有容器共享網路的namespace。

如果Pod所在的Node宕機,會將這個Node上的所有Pod重新排程到其他節點上;

注: infrastructure 英 [ˈɪnfrəstrʌktʃə(r)] 基礎設施; 基礎建設;

Pod Volume

Docker Volume對應Kubernetes中的Pod Volume;

資料卷,掛載宿主機檔案、目錄或者外部儲存到Pod中,為應用服務提供儲存,也可以Pod中容器之間共享資料。

資源限制

每個Pod可以設定限額的計算機資源有CPU和Memory

Event

是一個事件記錄,記錄了事件最早產生的時間、最後重複時間、重複次數、發起者、型別,以及導致此事件的原因等資訊。Event通常關聯到具體資源物件上,是排查故障的重要參考資訊

Pod IP

Pod的IP地址,是Docker Engine根據docker0網橋的IP地址段進行分配的,通常是一個虛擬的二層網路,位於不同Node上的Pod能夠彼此通訊,需要透過Pod IP所在的虛擬二層網路進行通訊,而真實的TCP流量則是透過Node IP所在的物理網絡卡流出的;

Namespace

名稱空間將資源物件邏輯上分配到不同Namespace,可以是不同的專案、使用者等區分管理,並設定控制策略,從而實現多租戶。名稱空間也稱為虛擬叢集。

Replica Set

確保任何給定時間指定的Pod副本數量,並提供宣告式更新等功能。

Deployment

Deployment是一個更高層次的API物件,它管理ReplicaSets和Pod,並提供宣告式更新等功能。官方建議使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,這就意味著可能永遠不需要直接操作ReplicaSet物件,因此Deployment將會是使用最頻繁的資源物件。

RC-Replication Controller

Replication Controller用來管理Pod的副本,保證叢集中存在指定數量的Pod副本。叢集中副本的數量大於指定數量,則會停止指定數量之外的多餘pod數量,反之,則會啟動少於指定數量個數的容器,保證數量不變。Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。

部署和升級Pod,宣告某種Pod的副本數量在任意時刻都符合某個預期值;

• Pod期待的副本數;

• 用於篩選目標Pod的Label Selector;

• 當Pod副本數量小於預期數量的時候,用於建立新Pod的Pod模板(template);

Service

Service定義了Pod的邏輯集合和訪問該集合的策略,是真實服務的抽象。Service提供了一個統一的服務訪問入口以及服務代理和發現機制,使用者不需要了解後臺Pod是如何執行。

一個service定義了訪問pod的方式,就像單個固定的IP地址和與其相對應的DNS名之間的關係。

Service其實就是我們經常提起的微服務架構中的一個“微服務”,透過分析、識別並建模系統中的所有服務為微服務——Kubernetes Service,最終我們的系統由多個提供不同業務能力而又彼此獨立的微服務單元所組成,服務之間透過TCP/IP進行通訊,從而形成了我們強大而又靈活的彈性網路,擁有了強大的分散式能力、彈性擴充套件能力、容錯能力;

每個Pod都提供了一個獨立的Endpoint(Pod IP+ContainerPort)以被客戶端訪問,多個Pod副本組成了一個叢集來提供服務,一般的做法是部署一個負載均衡器來訪問它們,為這組Pod開啟一個對外的服務埠如8000,並且將這些Pod的Endpoint列表加入8000埠的轉發列表中,客戶端可以透過負載均衡器的對外IP地址+服務埠來訪問此服務。執行在Node上的kube-proxy其實就是一個智慧的軟體負載均衡器,它負責把對Service的請求轉發到後端的某個Pod例項上,並且在內部實現服務的負載均衡與會話保持機制。Service不是共用一個負載均衡器的IP地址,而是每個Servcie分配一個全域性唯一的虛擬IP地址,這個虛擬IP被稱為Cluster IP。

Cluster IP

Service的IP地址,特性:

僅僅作用於Kubernetes Servcie這個物件,並由Kubernetes管理和分配IP地址;

無法被Ping,因為沒有一個“實體網路物件”來響應;

只能結合Service Port組成一個具體的通訊埠;

Node IP網、Pod IP網、Cluster IP網之間的通訊,採用的是Kubernetes自己設計的一種程式設計方式的特殊的路由規則,與IP路由有很大的不同

Label

Kubernetes中的任意API物件都是透過Label進行標識,Label的實質是一系列的K/V鍵值對。Label是Replication Controller和Service執行的基礎,二者透過Label來進行關聯Node上執行的Pod。

一個label是一個被附加到資源上的鍵/值對,譬如附加到一個Pod上,為它傳遞一個使用者自定的並且可識別的屬性。Label還可以被應用來組織和選擇子網中的資源

selector是一個透過匹配labels來定義資源之間關係得表示式,例如為一個負載均衡的service指定所目標Pod

Label可以附加到各種資源物件上,一個資源物件可以定義任意數量的Label。給某個資源定義一個Label,相當於給他打一個標籤,隨後可以透過Label Selector(標籤選擇器)查詢和篩選擁有某些Label的資源物件。我們可以透過給指定的資源物件捆綁一個或多個Label來實現多維度的資源分組管理功能,以便於靈活、方便的進行資源分配、排程、配置、部署等管理工作;

Endpoint

IP+Port

標識服務程序的訪問點;

StatefulSet

StatefuleSet主要用來部署有狀態應用,能夠保證 Pod 的每個副本在整個生命週期中名稱是不變的。而其他 Controller 不提供這個功能,當某個 Pod 發生故障需要刪除並重新啟動時,Pod 的名稱會發生變化。同時 StatefuleSet 會保證副本按照固定的順序啟動、更新或者刪除。

StatefulSet適合永續性的應用程式,有唯一的網路識別符號(IP),持久儲存,有序的部署、擴充套件、刪除和滾動更新。

注:Node、Pod、Replication Controller和Service等都可以看作是一種“資源物件”,幾乎所有的資源物件都可以透過Kubernetes提供的kubectl工具執行增、刪、改、查等操作並將其儲存在etcd中持久化儲存。

四、Kubernetes架構和元件

1、K8S架構

【大強哥-k8s從入門到放棄01】Kubernetes容器編排入門

2、K8s元件

Kubernetes Master

叢集控制節點,負責整個叢集的管理和控制,基本上Kubernetes所有的控制命令都是發給它,它來負責具體的執行過程,我們後面所有執行的命令基本都是在Master節點上執行的;

包含如下元件:

1。Kubernetes API Server

作為Kubernetes系統的入口,其封裝了核心物件的增刪改查操作,以RESTful API介面方式提供給外部客戶和內部元件呼叫。維護的REST物件持久化到Etcd中儲存。

2。Kubernetes Scheduler

為新建立的Pod進行節點(node)選擇(即分配機器),負責叢集的資源排程。元件抽離,可以方便替換成其他排程器。

3。Kubernetes Controller

負責執行各種控制器,目前已經提供了很多控制器來保證Kubernetes的正常執行。

Replication Controller

管理維護Replication Controller,關聯Replication Controller和Pod,保證Replication Controller定義的副本數量與實際執行Pod數量一致。

Deployment Controller

管理維護Deployment,關聯Deployment和Replication Controller,保證執行指定數量的Pod。當Deployment更新時,控制實現Replication Controller和Pod的更新。

Node Controller

管理維護Node,定期檢查Node的健康狀態,標識出(失效|未失效)的Node節點。

Namespace Controller

管理維護Namespace,定期清理無效的Namespace,包括Namesapce下的API物件,比如Pod、Service等。

Service Controller

管理維護Service,提供負載以及服務代理。

EndPoints Controller

管理維護Endpoints,關聯Service和Pod,建立Endpoints為Service的後端,當Pod發生變化時,實時更新Endpoints。

Service Account Controller

管理維護Service Account,為每個Namespace建立預設的Service Account,同時為Service Account建立Service Account Secret。

Persistent Volume Controller

管理維護Persistent Volume和Persistent Volume Claim,為新的Persistent Volume Claim分配Persistent Volume進行繫結,為釋放的Persistent Volume執行清理回收。

Daemon Set Controller

管理維護Daemon Set,負責建立Daemon Pod,保證指定的Node上正常的執行Daemon Pod。

Job Controller

管理維護Job,為Jod建立一次性任務Pod,保證完成Job指定完成的任務數目

Pod Autoscaler Controller

實現Pod的自動伸縮,定時獲取監控資料,進行策略匹配,當滿足條件時執行Pod的伸縮動作。

Kubernetes Node

除了Master,Kubernetes叢集中的其他機器被稱為Node節點,Node節點才是Kubernetes叢集中的工作負載節點,每個Node都會被Master分配一些工作負載(Docker容器),當某個Node宕機,其上的工作負載會被Master自動轉移到其他節點上去;

包含如下元件:

1。Kubelet

負責管控容器,Kubelet會從Kubernetes API Server接收Pod的建立請求,啟動和停止容器,監控容器執行狀態並彙報給Kubernetes API Server。

2。Kubernetes Proxy

負責為Pod建立代理服務,Kubernetes Proxy會從Kubernetes API Server獲取所有的Service資訊,並根據Service的資訊建立代理服務,實現Service到Pod的請求路由和轉發,從而實現Kubernetes層級的虛擬轉發網路。

3。Docker Engine(docker),Docker引擎,負責本機的容器建立和管理工作;

資料庫元件

etcd資料庫,可以部署到master上,也可以獨立部署

是分散式鍵值儲存系統。用於儲存叢集狀態資料,比如Pod、Service等物件資訊。

五、最後附上K8S常用的映象倉庫地址

daocloud的docker映象庫:

http://

daocloud。io/library

docker-hub的k8s映象庫:

http://

registry。cn-hangzhou。aliyuncs。com

/google_containers

aliyun的k8s映象庫:

http://

registry。cn-hangzhou。aliyuncs。com

/google-containers

aliyun的docker映象庫web頁面:

https://

cr。console。aliyun。com/c

n-hangzhou/images

google的映象庫web頁面:

https://

console。cloud。google。com

/gcr/images/google-containers?project=google-containers