Kubernetes
是容器集羣管理系統,是一個開源的平臺,能夠實現容器集羣的自動化部署、自動擴縮容、維護等功能。算法使用
Kubernetes
能夠:docker
自動化容器的部署和複製數據庫
隨時擴展或收縮容器規模後端
將容器組織成組,而且提供容器間的負載均衡緩存
服務器
節省資源,優化硬件資源的使用網絡
提供容器彈性,若是容器失效就替換它,等等...負載均衡
便攜性:支持公有云、私有云、混合雲、多重雲(multi-cloud)ssh
可擴展:模塊化、插件化、可組合、可掛載分佈式
自修復:自動部署,自動重啓,自動複製,自動伸縮擴展
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的全部組件、功能和工做負載的物理平臺。集羣中一臺服務器(或高可用部署中的一組服務器)用做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也是這類通道的實現方式之一。
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負責提供運行容器的各類依賴環境,並接收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等。