本篇文章咱們將會探討Kubernetes的總體架構。node
Kubernetes起源自Google內部系統Borg,它是容器應用集羣部署和管理的系統。Kubernetes核心功能是爲了減輕物理機或者虛擬機集羣編排、網絡以及存儲等的管理負擔,使開發者只須要關注應用的業務邏輯。經過Kubernetes開發者能夠自定義工做流甚至自動化的任務流。git
Kubernetes擁有全面的集羣管理能力,主要包括:多級的受權機制、多租戶應用、透明的服務註冊和發現機制、內置的負載均衡、錯誤發現和自修復能力、服務升級回滾和自動擴容等。Kubernetes擁有完善的管理工具,主要包括:部署、部署測試、集羣的運行和資源狀態的監控等。github
Borg是Google內部大規模集羣管理系統,主要工做是對Google內部服務的調度和管理。Borg的主要目標是將開發者從硬件資源管理中解放出來,將精力集中在業務邏輯上、最大化多數據中心的資源利用。docker
以下如所示:Borg系統主要由如下組件構成:BorgMaster、BorgLet、Borgcfg和Scheduler。數據庫
Kubernetes中的Pod、Service、Label以及一個Pod一個IP地址等的設計依託於Borg,所以總體上看,Kubernetes與Borg的架構很是類似。服務器
Kubernetes中提供靈活和鬆耦合的機制用於服務發現,像大多數分佈式集羣平臺,Kubernetes集羣中至少包含一個主節點和多個工做節點。網絡
主節點負責暴露應用程序的API、調度deployments和管理整個集羣。每一個工做節點都運行着容器運行時,(如Docker或者rkt)經過代理與主節點通訊。架構
工做節點同時運行着其它組件,如:日誌、監控、服務發現和其它可選組件。工做節點是Kubernetes集羣中真正運行應用的地方。工做節點能夠是雲服務商提供的虛擬機或者是運行着的服務器。負載均衡
Pod是一個或多個容器的集合並扮演着Kuberntes集羣中最核心的管理單元,Pod同時也充當着容器共享的上下文和資源的邏輯邊界。Pod的分組機制彌補了容器化與虛擬化的差別從而實如今Pod中執行多個子進程。在運行時,Pod能夠經過建立replica sets實現集羣的擴容,同時Replica set保證集羣內須要的Pod數量與真正運行的Pod數量的一致。框架
Replica sets聲明須要掛起Pod的數量和監控預約的Pod中有效的數量。單個Pod或者Replica Set能夠經過Service向內部或外部用戶暴露服務,Service經過篩選知足條件的Pod實現服務發現。Pod經過定義鍵值對的Label,Service經過Seletor篩選合法的Pod。任何新Pod打上知足Seletor篩選器的Label後將會自動被Service服務發現。這種設計架構提供了靈活、鬆耦合的服務發現機制。
Kubernetes中的資源對象(如:Pods、Replica setsje和Service)提交到master節點後,Master節點根據Pod的需求和資源的可用性將Pod調度到適當的工做節點上。工做節點從鏡像倉庫中拉取鏡像,而後在本地運行時環境中拉起容器。
etcd是CoreOS開源的、分佈式、鍵值對數據庫,它是集羣全部組件單一數據源(SSOT)的保障。Master節點查詢etcd獲取工做節點、Pods和容器狀態的各類參數。
Kubernetes主要由如下組件構成:
除了以上核心內容,接下來咱們將討論
在容器化的架構中,編排層須要實現對容器的部署、擴容和管理。
開發者能夠經過購買業界雲服務商提供的IaaP和IaaS服務實現容器編排。根據業務分佈式容器管理架構的需求,開發者能夠在雲服務商那裏選擇具有適當編排難度的服務。
你知道簡單的node.js架構嗎?若是你的程序只須要或者與下面類似的架構(不多的進程、一個或者兩個數據庫、一個負載均衡器、一個客戶端和一個宿主機),docker內置的[編排工具就能夠知足你的需求。
若是你的技術架構比上圖複雜不少,我以爲Amazon ECS或者Kubenrnets更適合你的需求,接下來咱們在談談K8s。
依託於Kubernets主從的設計架構,系統能夠提供高效、水平擴容的分佈式系統。網絡特性促進大量組件間的高效通訊。
下面是Kubernetes中的核心組件:
下圖經過虛擬的邊界描述Kubernetes組件各自的做用範圍:
Kubernetes爲區分用戶和資源提供許多特性:
Labels、Selector和namespces在Kubernetes中實現靈活動態的配置能力發揮着相當重要的做用。須要明確一點相同namespace下的兩個控制器的標籤篩選器不能重合,否則會引起衝突。
Kubernetes的設計是以分佈式框架的基礎,它在構建和管理其它微服務以及分佈式框架等方便表現的很是出色。深刻探討Kubernetes提供服務的詳細信息不在本書探討的範圍內,下圖是展現Kubernete上各組件間相互做用的更高級視圖。
當咱們研究Kubernetes如何處理容器網路時請記住上圖的中的信息流。
容器間的網絡問題是容器編排中最嚴苛的挑戰之一,在這一部分咱們將會探討Docker處理容器連通的網絡策略,這種策略是如何限制容器編排的規模以及Kubernetes是如何在上實現容器網絡連通的基礎上實現快速優雅的擴容。
默認狀況下Docker容器使用host-private網絡。爲了實現容器間網絡連通,Docker所在的宿主機提供默認名爲docker0的虛擬網橋,宿主機並會爲網橋上的容器預留足夠的空間。容器和網橋是如何鏈接的?Docker爲每一個容器分配一個虛擬網絡設備(veth),經過網絡地址轉換(NAT)將虛擬網橋的地址與容器的地址映射到一塊兒。NAT方法是經過修改網絡包的IP頭信息將一個IP地址映射爲其它的IP地址。
這種方案對自動化運維的挑戰
首先這種經過網橋實現容器網絡的連通須要容器在同一臺宿主機或連接在相同的網橋上。這對於容器網絡量有限,限制集羣數量的狀況下是能夠知足的,可是對多宿主機的集羣就會形成網絡故障。另外徹底依靠NAT實現網絡的連通也會形成性能故障。
Kubernetes的網絡方案比Docker默認的網絡方案更加高效且更易擴容。爲了實現這個目的,Kubernetes的網絡實現必須知足如下需求。
當知足這些條件後,在多個團隊和開發人員之間協調移植變得更加容易。諸如Flannel、WeaveNet、Calico均可以實現Kubernetes容器網路的連通。
文章翻譯自Kubernetes architecture Quick Introduction,行文時略有刪減