Kubernetes

Kubernetes（常簡稱為K8s）是用於自動部署、擴展和管理「容器化（containerized）應用程序」的開源系統。該系統由Google設計並捐贈給Cloud Native Computing Foundation（今屬Linux基金會）來使用。
它旨在提供“跨主機集群的自動部署、擴展以及運行應用程序容器的平臺”。 它支持一系列容器工具，包括Docker等。

**歷史**
Google Container Engine簡報
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一般包含一個或多個容器，這樣可以保證它們運行在同一主機節點上，並且可以共享資源。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 architecture diagram
Kubernetes遵循主從式架構設計。Kubernetes的組件可以分為管理單個的 node 組件和控制平面部分的組件。
Kubernetes Master是集群的主要控制單元，其用於管理其工作負載並指導整個系統的通信。Kubernetes控制平面由各自的進程組成，每個組件都可以在單個主節點上運行，也可以在支持高可用性集群的多個主節點上運行。是Kubernetes控制平面的各種組件如下：

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

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

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

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

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

**Kubelet**
Kubelet負責每個節點的運行狀態（即確保節點上的所有容器都正常運行）。它按照控制面板的指示來處理啟動，停止和維護應用程序容器（按組織到pod中）。
Kubelet會監視pod的狀態，如果不處於所需狀態，則pod將被重新部署到同一個節點。節點狀態每隔幾秒就會傳遞消息至中繼主機。主控器檢測到節點故障後，複製控制器將觀察此狀態更改，並在其他健康節點上啟動pod。date=October 2016

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

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

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

**參見**
Kubectl

**參考文獻**

**外部鏈接**
  Kubernetes（K8s）是什麼？基礎介紹+3大優點解析 date=20220910153425