Kubernetes是容器集群管理系統,是一個開源的平台,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。使用
Kubernetes可以:
自動化容器的部署和復制
隨時擴展或收縮容器規模
將容器組織成組,並且提供容器間的負載均衡
節省資源,優化硬件資源的使用
提供容器彈性,如果容器失效就替換它,等等...
Kubernetes特點
便攜性:支持公有雲、私有雲、混合雲、多重雲(multi-cloud)
可擴展:模塊化、插件化、可組合、可掛載
自修復:自動部署,自動重啟,自動復制,自動伸縮擴展
Kubernetes特性
Kubernetes是一種用於在一組主機上運行和協同容器化應用程序的系統,旨在提供可預測性、可擴展性與高可用的性的方法來完全管理容器化應用程序和服務的生命周期的平台。
它具有以下幾個重要的特性:
自動裝箱:構建於容器之上,基於資源依賴及其他約束自動完成容器部署且不影響其可用性,並通過調度機制混合關鍵型應用和非關鍵型應用的工作負載於同一節點以提升資源利用率。
自我修復:支持容器故障后自動重啟、節點故障候重行調度容器,以及其他可用節點、健康狀態檢查失敗后關閉容器並重新創建等自我修復機制。
水平擴展:支持通過簡單命令或UI手動水平擴展,以及基於CPU等資源負載率的自動水平擴展機制。
服務器發現和負載均衡:Kubernetes通過其附加組件之一的KubeDNS(或CoreDNS)為系統內置了服務發現功能,它會為每個Service配置DNS名稱,並允許集群內的客戶端直接使用此名稱發出訪問請求,而Service則通過iptables或ipvs內建了負載均衡機制。
自動發布和回滾:Kubernetes支持“灰度”更新應用程序或其配置信息,它會監控更新過程中應用程序的健康狀態,以確保它不會在同一時刻殺掉所有的實例,而此過程中一旦有故障發生,就會立即自動執行回滾操作。
秘鑰和配置管理:Kubernetes允許存儲和管理敏感信息,例如密碼,Oauth令牌和ssh秘鑰。可以部署和更新密碼和應用程序配置,而無需重建容器,也不會再堆棧配置中暴露機密。
存儲編排:Kubernetes支持Pod對象按需自動掛載不同類型的存儲系統,這包括節點本地存儲、公有雲服務商的雲存儲(如AWS和GCP等),以及網絡存儲系統(例如,NFS、ISCSI、GlusterFS、Ceph、Cinder和Flocker等)
批量處理執行:除了服務型應用,Kubernetes還支持批處理作業及CI(持續集成),如果需要,一樣可以實現容器故障后修復。
Kubernetes概述和術語
Kubernetes使用共享網絡將多個物理機或虛擬機匯集到一個集群中,在各服務器之間進行通信,該集群是配置Kubernetes的所有組件、功能和工作負載的物理平台。集群中一台服務器(或高可用部署中的一組服務器)用作Master,負責管理整個集群,余下的其他機器用作Worker Node,它們是使用本地和外部資源接收和運行工作負載的服務器。集群中的這些主機可以是物理服務器,也可以是虛擬機(包括IaaS雲端的VPS)

Master
Master是集群的網關和中樞,負責諸如為用戶和客戶端暴露API、跟蹤其它服務器的健康狀態、以最優方式調度工作負載,以及編排其他組件之間的通信等任務,它是用戶或客戶端與集群之間的核心聯絡點,並負責Kubernetes系統的大多數集中式管控邏輯。單個Master節點即可完成其所有的功能,但出於冗余及負載均衡等目的,生產環境中通常需要協同部署多個此類主機。Master節點類似於蜂群中的蜂王。
Node
Node是Kubernetes集群的工作節點,負責接收來自Master的工作指令並根據指令相應的創建或刪除Pod對象,以及調整網絡規則以合理地路由和轉發流量等。理論上講,Node可以是任何形式的計算設備,不過Master會統一將其抽象為Node對象進行管理。Node類似於蜂群中的工蜂,生產環境中,它們通常數量眾多。
Kubernetes將所有Node的資源集結於一處形成一台更強大的“服務器”,如下圖,在用戶將應用部署於其上時,Master會使用調度算法將其自動指派某個特定的Node運行,在Node加入集群或從集群中移除時,Master也會按需重行編排影響到的Pod(容器)。於是,用戶無需關心其應用究竟運行於何處。

從抽象的角度來講,Kubernetes還有着眾多的組件來支撐其內部的業務邏輯,包括運行應用、應用編排、服務暴露、應用恢復等,它們在Kubernetes中被抽象為Pod、Service、Controller等資源類型。
(1)Pod
Kubernetes並不直接運行容器,而是使用一個抽象的資源對象來封裝一個或者多個容器,這個抽象即為Pod,它是Kubernetes的最小調度單元。同一Pod中的容器共享網絡名稱空間和存儲資源,這些容器可經由本地回環接口lo直接通信,但彼此之間又在Mount、User及PID等名稱空間上保持了隔離。盡管Pod中可以包含多個容器,但是作為最小調度單元,它應該盡可能地保持“小”,即通常只應該包含一個主容器,以及必要的輔助型容器(sidecar)

(2)資源標簽
標簽(Label)是將資源進行分類的標識符,資源標簽其實就是一個鍵值型(key/values)數據。標簽旨在指定對象(如Pod等)辨識性的屬性,這些屬性僅對用戶存在特定的意義,對Kubernetes集群來說並不直接表達核心系統語意。標簽可以在對象創建時附加其上,並能夠在創建后的任意時間進行添加和修改。一個對象可以擁有多個標簽,一個標簽也可以附加於多個對象(通常是同一類對象)之上。

(3)標簽選擇器
標簽選擇器(Selector)全稱為”Label Selector“,它是一種根據Label來過濾符合條件的資源對象的機制。例如,將附有標簽”role:backend“的所有Pod對象挑選出來歸為一組就是標簽選擇器的一種應用,如下圖所示,通常使用標簽對資源對象進行分類,而后使用標簽選擇器挑選出它們,例如將其創建未某Service的端點。

(4)Pod控制器

(5)服務資源(Service)
Service是建立在一組Pod對象之上的資源抽象,它通過標簽選擇器選定一組Pod對象,並為這組Pod對象定義一個統一的固定訪問入口(通常是一個IP地址),若Kubernetes集群存在DNS附件,它就會在Service創建時為其自動配置一個DNS名稱以便客戶端進行服務發現。到達Service IP的請求將被負載均衡至其后的端點——各個Pod對象之上,因此Service從本質上來講是一個四層代理服務。另外,service還可以將集群外部流量引入到集群中來。
(6)存儲卷
存儲卷(Volume)是獨立於容器文件系統之外的存儲空間,常用於擴展容器的存儲空間並為它提供持久存儲能力。Kubernetes集群上的存儲卷大體可以分為臨時卷、本地卷和網絡卷。臨時卷和本地卷都位於Node本地,一旦Pod被調度至其他Node,此種類型的存儲卷將無法訪問到,因此臨時卷和本地卷通常用於數據緩存,持久化的數據則需要放置於持久卷(persistent volume)之上。
(7)Name和Namespace
名稱(Name)是Kubernetes集群中資源對象的標識符,它們的作用域通常是名稱空間(Namespace),因此名稱空間是名稱的額外的限定機制。在同一名稱空間中,同一類型資源對象的名稱必須具有唯一性。名稱空間通常用於實現租戶或項目的資源隔離,從而形成邏輯分組,如下圖所示,創建的Pod和Service等資源對象都屬於名稱空間級別,未指定時,他們都屬於默認的名稱空間“default”。

Annotation(注釋)是另一種附加在對象之上的鍵值類型的數據,但它擁有更大的數據容量。Annotation常用於將各種非標識型元數據(metadata)附加到對象上,但它不能用於標識和選擇對象,通常也不會被Kubernetes直接使用,其主要目的是方便工具或用戶的閱讀和查找等。
(9)Ingress
Kubernetes將Pod對象和外部網絡環境進行了隔離,Pod和Service等對象間的通信都使用其內部專用地址進行,如若需要開放某些Pod對象提供給外部用戶訪問,則需要為其請求流量打開一個通往Kubernetes集群內部的通道,除了Service之外,Ingress也是這類通道的實現方式之一。
Master組件
Kubernetes的集群控制平面由多個組件組成,這些組件可統一運行於單一Master節點,也可以以多副本的方式同時運行於多個節點,以為Master提供高可用功能,甚至還可以運行於Kubernetes集群自身之上。Master主要包括以下幾個組件。
(1)API Server
Api Server負責輸出RESTful風格的Kubernetes API,它是發往集群的所有REST操作命令的接入點,並負責接收、校驗並響應所有的REST請求,結果狀態被持久存儲於etcd中。因此,API Server是整個集群的網關。
(2)ETCD
Kubernetes集群的所有狀態信息都需要持久存儲於存儲系統etcd中,不過,etcd是由CoreOS基於Raft協議開發的分布式鍵值存儲,可用於服務發現、共享配置以及一致性保障(例如數據庫主節點選擇、分布式鎖等)。因此,etcd是獨立的服務組件,並不隸屬於Kubernetes集群自身。生產環境中應該以etcd集群的方式運行以確保其服務可用性。
(3)Controller Manager
Kubernetes中,集群級別的大多數功能都是由幾個被稱為控制器的進程執行實現的,這幾個進程被集成與kube-controller-manager守護進程中。由控制器完成的功能主要包括生命周期功能和API業務邏輯,具體如下
生命周期功能:包括Namespace創建和生命周期、Event垃圾回收、Pod終止相關的垃圾回收、級聯垃圾回收及Node垃圾回收等。
API業務邏輯:例如,由ReplicaSet執行的Pod擴展等。
(4)Scheduler
Kubernetes是用於部署和管理大規模容器應用的平台,根據集群規模的不同,其托管運行的容器很可能會數以千計甚至更多。API Server確認Pod對象的創建請求之后,便需要由Scheduler根據集群內各節點的可用資源狀態,以及要運行的容器的資源需求做出調度決策,如下圖所示。另外,Kubernetes還支持用戶自定義調度器。

Node組件
Node負責提供運行容器的各種依賴環境,並接收Master的管理。每個Node主要由以下幾個組件構成。
(1)kubelet
kubelet是運行於工作節點之上的守護進程,它從API Server接收關於Pod對象的配置信息並確保它們處於期望的狀態(desired state,也可以說目標狀態)kubelet會在API Server上注冊當前工作節點,定期向Master匯報節點資源使用情況,並通過cAdvisor監控容器和節點的資源占用情況。
(2)kube-proxy
每個工作節點都需要運行一個kube-proxy守護進程,它能夠按需為Service資源對象生成iptables或ipvs規則,從而捕獲訪問當前Service的ClusterIP的流量並將其轉發至正確的后端Pod對象。
(3)docker
docker用於運行容器
核心附件
Kubernetes集群還依賴於一組稱為"附件"(add-ons)的組件以提供完整的功能,它們通常是由第三方提供的特定應用程序,且托管運行於Kubernetes集群之上,如上圖所示。
-
KubeDNS
在Kubernetes集群中調度運行提供DNS服務的Pod,同一集群中的其他pod可使用此DNS服務解決主機名。Kubernetes從1.11版本開始默認使用CoreDNS項目為集群提供服務注冊和服務發現的動態名稱解析服務,之前的版本中用到的是kube-dns項目,而SKyDNS則是更早一代的項目。
-
Kubernetes Dashboard
Kubernetes集群的全部功能都要基於Web的UI,來管理集群中應用甚至是集群自身。
-
Heapster
容器和節點的性能監控與分析系統,它收集並解析多種指標數據,如資源利用率、生命周期事件等。新版本的Kubernetes中,其功能會逐漸由Prometheus結合其他組件所取代。
-
Ingress Controller
Service是一種工作於傳輸層的負載均衡器,而Ingress是在應用層實現的HTTP(s)負載均衡機制。不過,Ingress資源自身不能進行“流量穿透”,它僅是一組路由規則的集合,這些規則需要通過Ingress控制器(Ingress Controller)發揮作用。目前,此類的可用項目有Nginx、Traefik、Envoy及HAProxy等。

