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

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



歷史

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

Kubernetes v1.0 於 2015 年 7 月 21 日釋出。 隨著 v1.0 版本釋出，Google 與 Linux 基金會合作組建了 Cloud Native Computing Foundation（CNCF）並將 Kubernetes 作為種子技術來提供。

Rancher Labs 在其 Rancher 容器管理平台中包含了 Kubernetes 的釋出版。Kubernetes 也在很多其他公司的產品中被使用，例如 Red Hat 的 OpenShift， CoreOS 的 Tectonic， IBM 的 IBM 私有雲產品，，精靈雲的 EcOS，KubeSphere，以及 VMware 的 PKS 等等。

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



設計

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

Pod

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

標籤和選擇器

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

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

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

> `tier=back-end AND release_track=canary`
> 
> 

控制器

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

服務

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



建構

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

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

etcd

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

API 伺服器

API 伺服器是一個關鍵組件 並使用 Kubernetes API 和 JSON over HTTP 來提供了 Kubernetes 的內部和外部介面。 API 伺服器處理和驗證 REST 請求並更新 API 物件的狀態 etcd （頁面存檔備份，存於網際網路檔案館），從而允許客戶端在 Worker 節點之間組態工作負載和容器。

排程器

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

控制器管理

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

Kubernetes 節點

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

Kubelet

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

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

容器

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

Kube 代理

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

cAdvisor

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



參見


* Kubectl



參考文獻



外部連結


* 官方網站

* GitHub 上的 kubernetes 頁面

* Kubernetes（K8s）是什麼？基礎介紹 + 3 大優點解析 （頁面存檔備份，存於網際網路檔案館）