Kubernetes

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

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

## 歷史

<image>

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

Kubernetes v1.0於2015年7月21日發布。隨著v1.0版本發布，谷歌與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一般包含一個或多個容器，pod可以保證這些容器運行在同一主機節點上。Kubernetes中的每個pod都被分配一個唯一的（在集群內的）IP位址這樣就可以允許應用程式使用同一埠，而避免了發生衝突的問題。Pod可以定義存儲的卷，例如本地磁碟目錄或網路磁碟，並將其暴露給pod中的某個容器。pod可以通過Kubernetes API手動管理，也可以委託給控制器來實現自動管理。

### 標籤和選擇器

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

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

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

`tier=back-end AND release_track=canary`

### 控制器

控制器是將集群的狀態轉移到所需集群狀態的對帳循環機制。

舉例而言，ReplicaSet控制器，通過在集群中運行指定數量的特定pod的副本，來實現對pod複製和縮放的管理。如果有節點出現故障，它還能夠在其他節點創建pod的副本以替代被故障所影響的原來的pod。Kubernetes系統還包括其他控制器，包括「DaemonSet控制器」，能夠令所有機器（節點）或其中的一部分機器（節點）運行恰好1個pod；「Job控制器」會啟動特定任務所需的pod，這樣的pod在完成任務後會進入「完成」狀態。控制器通常使用標籤選擇器來確定其管理的pod組。

### 服務

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

## 概念

<image>

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

### 控制平面

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

#### etcd

etcd 是由CoreOS開發，用於可靠地存儲集群的配置數據的一種持久性，輕量型的，分布式的鍵-值數據存儲組件。該組件可表示在任何給定時間點處的集群的整體狀態。其他組件在注意到存儲的變化之後，會變成相應的狀態。

#### API伺服器

API伺服器是一個關鍵組件 並使用 Kubernetes API 和 JSON over HTTP來提供了Kubernetes的內部和外部接口。API伺服器處理和驗證 REST請求並更新 API 對象的狀態 etcd，從而允許客戶端在Worker節點之間配置工作負載和容器。

#### 調度器

調度器（scheduler）是可擴展組件，它基於剩餘可用的資源以及其他約束條件來選擇節點，決定pod到哪個節點上運行。調度器跟蹤每個節點上的資源利用率，以確保工作負載（workload）不會被分配到超過可用資源的量。為此，調度程其必須知道工作負載的資源需求、節點的可用資源量，以及使用者提供的各種約束和策略指令，例如服務質量，親和性/反親和性要求，數據本地性等。簡言之，調度器的作用是將資源的「供應」與工作負載的「需求」相匹配以維持系統的穩定和可靠。

#### 控制器管理

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

### Kubernetes 節點

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

#### Kubelet

Kubelet負責每個節點的運行狀態（即確保節點上的所有容器都正常運行）。它按照控制面（control plane）的指示，以pod來容納容器，處理容器的啟動、停止和維護。

Kubelet會監視pod的狀態，如果不處於所需狀態，則pod將被重新部署到同一個節點。而關於節點的狀態監控，節點狀態的消息每隔幾秒就會被傳送到控制面的API伺服器。控制面上檢測到節點故障後，會有一個高級的控制器監控到節點狀態的變化，並在其他健康的節點上啟動原本運行在故障節點上的pod。

#### 容器

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

#### Kube代理

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

#### cAdvisor

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

## 外部連結

- https://github.com/kubernetes/kubernetes
- Kubernetes（K8s）是什麼？基礎介紹+3大優點解析

## 基本資料

- 發行日期：2014年6月7日
- 軟體版本週期：1.25.3
- 程式語言：Go
- 作業系統：跨平台
- 類型：集群管理
- 許可協議：Apache許可證 2.0