跳至內容

Kubernetes

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Kubernetes
首次釋出2014年6月7日,​10年前​(2014-06-07[1]
目前版本1.25.3[2](2022年10月13日,​2年前​(2022-10-13
原始碼庫 編輯維基數據連結
程式語言Go
作業系統跨平台
類型叢集管理
特許條款Apache特許條款 2.0
網站kubernetes.io

Kubernetes(常簡稱為K8s)是用於自動部署、擴充和管理「容器化(containerized)應用程式」的開源系統。[3]該系統由Google設計並捐贈給Cloud Native Computing Foundation(今屬Linux基金會)來使用。

它旨在提供「跨主機叢集的自動部署、擴充以及執行應用程式容器的平台」。[4] 它支援一系列容器工具,包括Docker等。

歷史

[編輯]
Google Container Engine簡報

Kubernetes(在希臘語意為「舵手」或「駕駛員」)由Joe Beda、Brendan Burns和Craig McLuckie創立,[5]並由其他谷歌工程師,包括Brian Grant和Tim Hockin等進行加盟創作,並由谷歌在2014年首次對外宣佈 。[6] 該系統的開發和設計都深受谷歌的Borg系統[7][8]的影響,其許多頂級貢獻者之前也是Borg系統的開發者。在谷歌內部,Kubernetes的原始代號曾經是Seven,即星際迷航中的Borg(博格人)。[9]Kubernetes標識中舵輪有七個輪輻就是對該專案代號的致意。

Kubernetes v1.0於2015年7月21日釋出。[10] 隨着v1.0版本釋出,谷歌與Linux基金會合作組建了Cloud Native Computing Foundation(CNCF)[11]並將Kubernetes作為種子技術來提供。

Rancher Labs在其Rancher容器管理平台中包含了Kubernetes的釋出版。[12]Kubernetes也在很多其他公司的產品中被使用,例如Red HatOpenShift[13][14] CoreOS的Tectonic, IBM的IBM私有雲產品,[15],精靈雲的EcOS[16],KubeSphere[17],以及 VMware的PKS等等。

而現今資訊界常見的縮寫手法「K8s」則是將「ubernete」八個字母縮寫為「8」而來。

設計

[編輯]

Kubernetes在設計結構上定義了一系列的構建模組,其目的是為了提供一個可以共同提供部署、維護和擴充應用程式的機制。組成Kubernetes的組件設計概念為鬆耦合和可延伸的,這樣可以使之滿足多種不同的工作負載。可延伸性在很大程度上由Kubernetes API提供,此API主要被作為擴充的內部組件以及Kubernetes上執行的容器來使用。[18]

Pod

[編輯]

Kubernetes的基本排程單元稱為「pod」。通過該種抽象類別可以把更進階別的抽象內容增加到容器化組件。一個pod一般包含一個或多個容器,這樣可以保證它們執行在同一主機節點上,並且可以共用資源。[18]Kubernetes中的每個pod都被分配一個唯一的(在叢集內的)IP位址這樣就可以允許應用程式使用同一埠,而避免了發生衝突的問題。[19] Pod可以定義一個卷,例如本地磁碟目錄或網絡磁碟,並將其暴露在pod中的一個容器之中。[20]。pod可以通過Kubernetes API手動管理,也可以委託給控制器來實現自動管理。[18]

標籤和選擇器

[編輯]

Kubernetes使客戶端(用戶或內部組件)將稱為「標籤」的鍵值對附加到系統中的任何API對象,如pod和節點。相應地,「標籤選擇器」是針對匹配對象的標籤的查詢方法。[18]

標籤和選擇器是Kubernetes中的主要分組機制,用於確定操作適用的組件。[21]

例如,如果應用程式的Pods具有系統的標籤 tier (比如"front-end"、"back-end") 和一個 release_track (比如"canary"、"production"),那麼對所有"back-end" 和 "canary" 節點的操作可以使用如下所示的標籤選擇器:[22]

tier=back-end AND release_track=canary

控制器

[編輯]

控制器是通過管理一組pod來實現來將實際叢集狀態轉移到所需叢集狀態的對帳迴圈機制[23]。一種控制器指的是一組具有相同特徵的「複製控制器」,控制器通過在叢集中執行指定數量的pod副本來處理複製和縮放。在基礎節點出現故障的情況下,它還可以用於處理建立替換pod。[23]其它控制器也是核心Kubernetes系統的一部分,包括「DaemonSet控制器」為每台機器(或機器的一些子集)上執行的單個pod,和用於執行pod的「作業控制器」。[24] 控制器管理的pod組由作為控制器定義的部分的標籤選擇器來確定。[22]

服務

[編輯]

Kubernetes服務本質是一組協同工作的pod,類同多層架構應用中的一層。構成服務的pod組通過標籤選擇器來定義。[18]Kubernetes通過給服務分配靜態IP位址和域名來提供服務發現機制,並且以輪循排程英語Round-robin DNS的方式將流量負載均衡到能與選擇器匹配的pod的IP位址的網絡連接上(即使是故障導致pod從一台機器移動到另一台機器)。[19] 預設情況下,服務任務會暴露在叢集中(例如,多個後端pod可能被分組成一個服務,前端pod的請求在它們之間負載平衡);除此以外,服務任務也可以暴露在叢集外部(例如,從客戶端訪問前端pod)。[25]

建構

[編輯]
Kubernetes architecture diagram

Kubernetes遵循主從式架構設計。Kubernetes的組件可以分為管理單個的 node 組件和控制平面部分的組件。[18][26]

Kubernetes Master是叢集的主要控制單元,其用於管理其工作負載並指導整個系統的通訊。Kubernetes控制平面由各自的行程群組成,每個組件都可以在單個主節點上執行,也可以在支援高可用性叢集[26]的多個主節點上執行。是Kubernetes控制平面的各種組件如下:

etcd

[編輯]

etcd頁面存檔備份,存於互聯網檔案館 是由CoreOS開發,用於可靠地儲存叢集的組態數據的一種永續性,輕量型的,分散式的鍵-值數據儲存組件。該組件可表示在任何給定時間點處的叢集的整體狀態。其他組件在注意到儲存的變化之後,會變成相應的狀態。[26]

API伺服器

[編輯]

API伺服器是一個關鍵組件 並使用 Kubernetes APIJSON over HTTP來提供了Kubernetes的內部和外部介面。[18][27] API伺服器處理和驗證 REST請求並更新 API 對象的狀態etcd頁面存檔備份,存於互聯網檔案館),從而允許客戶端在Worker節點之間組態工作負載和容器。

排程器

[編輯]

T排程程式是可插拔式組件,其基於資源可用性來選擇未排程的pod(由排程程式管理的基本實體)應該執行哪個節點。排程程式跟蹤每個節點上的資源利用率,以確保工作負載不會超過可用資源。為此,排程程式必須知道資源需求,資源可用性以及各種其他用戶提供的約束和策略指令,例如服務質素,親和力/反關聯性要求,數據位置等。實質上,排程程式的作用是將資源「供應」與工作負載「需求」相匹配以維持系統的穩定和可靠。 [28]

控制器管理

[編輯]

控制器管理器是核心Kubernetes控制器,其包括DaemonSet控制器和複製控制器等。該控制器可與API伺服器進行通訊以在需要時建立,更新和刪除他們管理的資源(pod,伺服器端點等)[27]

Kubernetes 節點

[編輯]

Node也稱為Worker或Minion,是部署容器(工作負載)的單機器(或虛擬機器)。叢集中的每個節點都必須具備容器的執行環境(runtime) ——比如 Docker,以及下面提到的其他組件,以便與這些容器的網絡組態進行通訊。

Kubelet

[編輯]

Kubelet負責每個節點的執行狀態(即確保節點上的所有容器都正常執行)。它按照控制面板的指示來處理啟動,停止和維護應用程式容器(按組織到pod中)。[18][29]

Kubelet會監視pod的狀態,如果不處於所需狀態,則pod將被重新部署到同一個節點。節點狀態每隔幾秒就會傳遞訊息至中繼主機。主控器檢測到節點故障後,複製控制器將觀察此狀態更改,並在其他健康節點上啟動pod。[來源請求]

容器

[編輯]

容器從屬於pod。在執行應用、庫及其依賴的微服務中,容器是最低層級的。通過繫結一個外部IP,容器可以被外網訪問。

Kube代理

[編輯]

Kube代理是網絡代理負載均衡的實現,支援服務抽象以及其他網絡操作。[18]根據傳入請求的IP和埠,該組件會將流量轉發到指定的合適的容器中。

cAdvisor

[編輯]

cAdvisor 是監視和收集例如每個節點上的容器的CPU,主記憶體,檔案和網絡使用情況等的資源使用情況和效能指標的代理組件。

參見

[編輯]

參考文獻

[編輯]
  1. ^ First GitHub commit for Kubernetes. github.com. 2014-06-07 [2017-06-17]. (原始內容存檔於2017-03-01). 
  2. ^ GitHub Releases page. github.com. 2022-10-13 [2022-10-13]. (原始內容存檔於2017-03-01). 
  3. ^ kubernetes/kubernetes. GitHub. [2017-03-28]. (原始內容存檔於2017-04-21) (英語). 
  4. ^ What is Kubernetes?. Kubernetes. [2017-03-31]. (原始內容存檔於2019-05-30). 
  5. ^ Google Made Its Secret Blueprint Public to Boost Its Cloud. [2016-06-27]. (原始內容存檔於2016-07-01) (美國英語). 
  6. ^ Google Open Sources Its Secret Weapon in Cloud Computing. Wired. [24 September 2015]. (原始內容存檔於2015-09-10). 
  7. ^ Abhishek Verma; Luis Pedrosa; Madhukar R. Korupolu; David Oppenheimer; Eric Tune; John Wilkes. Large-scale cluster management at Google with Borg. Proceedings of the European Conference on Computer Systems (EuroSys). April 21–24, 2015 [2017-06-17]. (原始內容存檔於2017-07-27). 
  8. ^ Borg, Omega, and Kubernetes - ACM Queue. queue.acm.org. [2016-06-27]. (原始內容存檔於2016-07-09). 
  9. ^ Early Stage Startup Heptio Aims to Make Kubernetes Friendly. [2016-12-06]. [失效連結]
  10. ^ As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation. TechCrunch. [24 September 2015]. (原始內容存檔於2020-11-17). 
  11. ^ Cloud Native Computing Foundation. [2017-06-17]. (原始內容存檔於2017-07-03). 
  12. ^ Deploy and Manage Kubernetes Clusters | Rancher Labs. Rancher Labs. [2017-04-15]. (原始內容存檔於2017-04-16) (美國英語). 
  13. ^ OpenShift v3 Platform Combines Docker, Kubernetes. blog.openshift.com. [14 August 2014]. (原始內容存檔於2015-07-06). 
  14. ^ Why Red Hat Chose Kubernetes for OpenShift. blog.openshift.com. [7 November 2016]. (原始內容存檔於2017-02-21). 
  15. ^ IBM Spectrum Conductor for Containers. ibm.com/developerWorks. [2017-05-19]. (原始內容存檔於2021-01-28) (美國英語). 
  16. ^ Ghostcloud Enterprise Container OS. www.ghostcloud.cn. [2019-07-24]. (原始內容存檔於2020-11-27) (美國英語). 
  17. ^ Open Source Enterprise Kubernetes Platform | KubeSphere. kubesphere.io. [2022-02-21]. (原始內容存檔於2022-05-04) (美國英語). 
  18. ^ 18.0 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 An Introduction to Kubernetes. DigitalOcean. [24 September 2015]. (原始內容存檔於2015-10-01). 
  19. ^ 19.0 19.1 Langemak, Jon. Kubernetes 101 – Networking. Das Blinken Lichten. 2015-02-11 [2015-11-02]. (原始內容存檔於2015-10-25). 
  20. ^ Strachan, James. Kubernetes for Developers. Medium (publishing platform). 2015-05-21 [2015-11-02]. (原始內容存檔於2015-09-07). 
  21. ^ Surana, Ramit. Containerizing Docker on Kubernetes. LinkedIn. 2015-09-16 [2015-11-02]. 
  22. ^ 22.0 22.1 Intro: Docker and Kubernetes training - Day 2. Red Hat. 2015-10-20 [2015-11-02]. (原始內容存檔於2015-10-29). 
  23. ^ 23.0 23.1 Overview of a Replication Controller. Documentation. CoreOS. [2015-11-02]. (原始內容存檔於2015-09-22). 
  24. ^ Sanders, Jake. Kubernetes: Exciting Experimental Features. Livewyer. 2015-10-02 [2015-11-02]. (原始內容存檔於2015-10-20). 
  25. ^ Langemak, Jon. Kubernetes 101 – External Access Into The Cluster. Das Blinken Lichten. 2015-02-15 [2015-11-02]. (原始內容存檔於2015-10-26). 
  26. ^ 26.0 26.1 26.2 Kubernetes Infrastructure. OpenShift Community Documentation. OpenShift. [24 September 2015]. (原始內容存檔於2015-07-06). 
  27. ^ 27.0 27.1 Marhubi, Kamal. Kubernetes from the ground up: API server. kamalmarhubi.com. 2015-09-26 [2015-11-02]. (原始內容存檔於2015-10-29). 
  28. ^ The Three Pillars of Kubernetes Container Orchestration - Rancher Labs. rancher.com. 18 May 2017 [22 May 2017]. (原始內容存檔於2017-06-24). 
  29. ^ Marhubi, Kamal. What [..] is a Kubelet?. kamalmarhubi.com. 2015-08-27 [2015-11-02]. (原始內容存檔於2015-11-13). 

外部連結

[編輯]