Kubernetes

**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 大優點解析 （頁面存檔備份，存於網際網路檔案館）