Kubernetes簡介
概述
Kubernetes 是一個可移植、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。 Kubernetes 擁有一個龐大且快速增長的生態(tài),其服務、支持和工具的使用范圍相當廣泛。
Kubernetes,又稱為 k8s(首字母為 k、首字母與尾字母之間有 8 個字符、尾字母為 s,所以簡稱 k8s)或者簡稱為 "kube" ,是一種可自動實施 Linux 容器操作的開源平臺。它可以幫助用戶省去應用容器化過程的許多手動部署和擴展操作。也就是說,您可以將運行 Linux 容器的多組主機聚集在一起,由 Kubernetes 幫助您輕松高效地管理這些集群。而且,這些集群可跨公共云、私有云或混合云部署主機。因此,對于要求快速擴展的云原生應用而言(例如借助 Apache Kafka 進行的實時數(shù)據(jù)流處理),Kubernetes 是理想的托管平臺。
起源
隨著以 docker 代表的 linux 容器技術的應用場景越來越廣,如何在大型的應用服務管理成百上千個容器成為了一個令人頭痛的問題,docker 官方給出了docker compose + swarm 的方案來解決大規(guī)模容器部署的挑戰(zhàn)。
Kubernetes 這個名字源于希臘語,意為“舵手”或“飛行員”。k8s 這個縮寫是因為 k 和 s 之間有八個字符的關系。 Google 在 2014 年開源了 Kubernetes 項目。 Kubernetes 建立在 Google 大規(guī)模運行生產工作負載十幾年經(jīng)驗的基礎上, 結合了社區(qū)中最優(yōu)秀的想法和實踐。
容器編排
容器編排是指自動化容器的部署、管理、擴展和聯(lián)網(wǎng)。容器編排可以幫助您在不同環(huán)境中部署相同的應用,而無需重新設計。利用編排來管理容器的生命周期也為將編排集成到 CI/CD 工作流中的 DevOps 團隊提供了支持。與應用編程接口(API)和 DevOps 團隊一樣,容器化微服務也是云原生應用的重要基礎。
為什么需要 Kubernetes?
真正的生產型應用會涉及多個容器。這些容器必須跨多個服務器主機進行部署。容器安全性需要多層部署,因此可能會比較復雜。但 Kubernetes 有助于解決這一問題。Kubernetes 可以提供所需的編排和管理功能,以便您針對這些工作負載大規(guī)模部署容器。借助 Kubernetes 編排功能,您可以構建跨多個容器的應用服務、跨集群調度、擴展這些容器,并長期持續(xù)管理這些容器的健康狀況。有了 Kubernetes,您便可切實采取一些措施來提高 IT 安全性。
Kubernetes 為你提供:
服務發(fā)現(xiàn)和負載均衡
Kubernetes 可以使用 DNS 名稱或自己的 IP 地址來曝露容器。 如果進入容器的流量很大, Kubernetes 可以負載均衡并分配網(wǎng)絡流量,從而使部署穩(wěn)定。
存儲編排
Kubernetes 允許你自動掛載你選擇的存儲系統(tǒng),例如本地存儲、公共云提供商等。
自動部署和回滾
你可以使用 Kubernetes 描述已部署容器的所需狀態(tài), 它可以以受控的速率將實際狀態(tài)更改為期望狀態(tài)。 例如,你可以自動化 Kubernetes 來為你的部署創(chuàng)建新容器, 刪除現(xiàn)有容器并將它們的所有資源用于新容器。
自動完成裝箱計算
你為 Kubernetes 提供許多節(jié)點組成的集群,在這個集群上運行容器化的任務。 你告訴 Kubernetes 每個容器需要多少 CPU 和內存 (RAM)。 Kubernetes 可以將這些容器按實際情況調度到你的節(jié)點上,以最佳方式利用你的資源。
自我修復
Kubernetes 將重新啟動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器, 并且在準備好服務之前不將其通告給客戶端。
密鑰與配置管理
Kubernetes 允許你存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。 你可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰。
Kubernetes 不是什么?
Kubernetes 不是傳統(tǒng)的、包羅萬象的 PaaS(平臺即服務)系統(tǒng)。 由于 Kubernetes 是在容器級別運行,而非在硬件級別,它提供了 PaaS 產品共有的一些普遍適用的功能, 例如部署、擴展、負載均衡,允許用戶集成他們的日志記錄、監(jiān)控和警報方案。 但是,Kubernetes 不是單體式(monolithic)系統(tǒng),那些默認解決方案都是可選、可插拔的。 Kubernetes 為構建開發(fā)人員平臺提供了基礎,但是在重要的地方保留了用戶選擇權,能有更高的靈活性。
Kubernetes:
- 不限制支持的應用程序類型。 Kubernetes 旨在支持極其多種多樣的工作負載,包括無狀態(tài)、有狀態(tài)和數(shù)據(jù)處理工作負載。 如果應用程序可以在容器中運行,那么它應該可以在 Kubernetes 上很好地運行。
不部署源代碼,也不構建你的應用程序。 持續(xù)集成(CI)、交付和部署(CI/CD)工作流取決于組織的文化和偏好以及技術要求。
不提供應用程序級別的服務作為內置服務,例如中間件(例如消息中間件)、 數(shù)據(jù)處理框架(例如 Spark)、數(shù)據(jù)庫(例如 MySQL)、緩存、集群存儲系統(tǒng) (例如 Ceph)。這樣的組件可以在 Kubernetes 上運行,并且/或者可以由運行在 Kubernetes 上的應用程序通過可移植機制 (例如開放服務代理)來訪問。 - 不是日志記錄、監(jiān)視或警報的解決方案。 它集成了一些功能作為概念證明,并提供了收集和導出指標的機制。
- 不提供也不要求配置用的語言、系統(tǒng)(例如 jsonnet),它提供了聲明性 API, 該聲明性 API 可以由任意形式的聲明性規(guī)范所構成。
- 不提供也不采用任何全面的機器配置、維護、管理或自我修復系統(tǒng)。
Kubernetes 架構

控制平面組件(Control Plane Components)
控制平面組件會為集群做出全局決策,比如資源的調度。以及檢測和響應集群事件,例如當不滿足部署的 replicas 字段時, 要啟動新的 pod)。
控制平面組件可以在集群中的任何節(jié)點上運行。 然而,為了簡單起見,設置腳本通常會在同一個計算機上啟動所有控制平面組件, 并且不會在此計算機上運行用戶容器。 請參閱使用 kubeadm 構建高可用性集群 中關于跨多機器控制平面設置的示例。
控制平面包括組件: kube-apiserver, etcd, kube-scheduler, kube-controller-manager, kubelet。
工作平面組件(Work Plane Components)
工作平面組件運行在工作節(jié)點中, 提供 Kubernetes 中的 Pod 所需的運行環(huán)境。
工作平面組包括組件: kubelet, kube-proxy, 容器運行時。
Kubernetes 組件

kube-apiserver
API 服務器是 Kubernetes 控制平面的組件, 該組件負責公開了 Kubernetes API,負責處理接受請求的工作。 API 服務器是 Kubernetes 控制平面的前端。
Kubernetes API 服務器的主要實現(xiàn)是 kube-apiserver。 kube-apiserver 設計上考慮了水平擴縮,也就是說,它可通過部署多個實例來進行擴縮。 你可以運行 kube-apiserver 的多個實例,并在這些實例之間平衡流量。
etcd
一致且高度可用的鍵值存儲,用作 Kubernetes 的所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫。
如果你的 Kubernetes 集群使用 etcd 作為其后臺數(shù)據(jù)庫, 請確保你針對這些數(shù)據(jù)有一份 備份計劃。
你可以在官方文檔中找到有關 etcd 的深入知識。
kube-scheduler
kube-scheduler 是控制平面的組件, 負責監(jiān)視新創(chuàng)建的、未指定運行節(jié)點(node)的 Pods, 并選擇節(jié)點來讓 Pod 在上面運行。
調度決策考慮的因素包括單個 Pod 及 Pods 集合的資源需求、軟硬件及策略約束、 親和性及反親和性規(guī)范、數(shù)據(jù)位置、工作負載間的干擾及最后時限。
kube-controller-manager
kube-controller-manager 是控制平面的組件, 負責運行控制器進程。
從邏輯上講, 每個控制器都是一個單獨的進程, 但是為了降低復雜性,它們都被編譯到同一個可執(zhí)行文件,并在同一個進程中運行。
這些控制器包括:
節(jié)點控制器(Node Controller):負責在節(jié)點出現(xiàn)故障時進行通知和響應
任務控制器(Job Controller):監(jiān)測代表一次性任務的 Job 對象,然后創(chuàng)建 Pods 來運行這些任務直至完成
端點控制器(Endpoints Controller):填充端點(Endpoints)對象(即加入 Service 與 Pod)
服務帳戶和令牌控制器(Service Account & Token Controllers):為新的命名空間創(chuàng)建默認帳戶和 API 訪問令牌
cloud-controller-manager
一個 Kubernetes 控制平面組件, 嵌入了特定于云平臺的控制邏輯。 云控制器管理器(Cloud Controller Manager)允許你將你的集群連接到云提供商的 API 之上, 并將與該云平臺交互的組件同與你的集群交互的組件分離開來。
cloud-controller-manager 僅運行特定于云平臺的控制器。 因此如果你在自己的環(huán)境中運行 Kubernetes,或者在本地計算機中運行學習環(huán)境, 所部署的集群不需要有云控制器管理器。
與 kube-controller-manager 類似,cloud-controller-manager 將若干邏輯上獨立的控制回路組合到同一個可執(zhí)行文件中, 供你以同一進程的方式運行。 你可以對其執(zhí)行水平擴容(運行不止一個副本)以提升性能或者增強容錯能力。
下面的控制器都包含對云平臺驅動的依賴:
節(jié)點控制器(Node Controller):用于在節(jié)點終止響應后檢查云提供商以確定節(jié)點是否已被刪除
路由控制器(Route Controller):用于在底層云基礎架構中設置路由
服務控制器(Service Controller):用于創(chuàng)建、更新和刪除云提供商負載均衡器
kubelet
kubelet 會在集群中每個節(jié)點(node)上運行。 它保證容器(containers)都運行在 Pod 中。
kubelet 接收一組通過各類機制提供給它的 PodSpecs, 確保這些 PodSpecs 中描述的容器處于運行狀態(tài)且健康。 kubelet 不會管理不是由 Kubernetes 創(chuàng)建的容器。
kube-proxy
kube-proxy 是集群中每個節(jié)點(node)所上運行的網(wǎng)絡代理, 實現(xiàn) Kubernetes 服務(Service) 概念的一部分。
kube-proxy 維護節(jié)點上的一些網(wǎng)絡規(guī)則, 這些網(wǎng)絡規(guī)則會允許從集群內部或外部的網(wǎng)絡會話與 Pod 進行網(wǎng)絡通信。
如果操作系統(tǒng)提供了可用的數(shù)據(jù)包過濾層,則 kube-proxy 會通過它來實現(xiàn)網(wǎng)絡規(guī)則。 否則,kube-proxy 僅做流量轉發(fā)。
容器運行時(Container Runtime)
容器運行環(huán)境是負責運行容器的軟件。
Kubernetes 支持許多容器運行環(huán)境,例如 containerd、 CRI-O 以及 Kubernetes CRI (容器運行環(huán)境接口) 的其他任何實現(xiàn)。
Kubernetes 相關術語
和其它技術一樣,Kubernetes 也會采用一些專用的詞匯,這可能會對初學者理解和掌握這項技術造成一定的障礙。為了幫助您了解 Kubernetes,我們在下面來解釋一些常用術語。
管理節(jié)點(Master): 用于控制 Kubernetes 節(jié)點的計算機。所有任務分配都來自于此。
工作節(jié)點(WorkNode):負責執(zhí)行請求和所分配任務的計算機。由 Kubernetes 主機負責對節(jié)點進行控制。
容器集(Pods):被部署在單個節(jié)點上的,且包含一個或多個容器的容器組。同一容器集中的所有容器共享同一個 IP 地址、IPC、主機名稱及其它資源。容器集會將網(wǎng)絡和存儲從底層容器中抽象出來。這樣,您就能更加輕松地在集群中移動容器。
復制控制器(Replication controller):用于控制應在集群某處運行的完全相同的容器集副本數(shù)量。
服務(Service):將工作內容與容器集分離。Kubernetes 服務代理會自動將服務請求分發(fā)到正確的容器集——無論這個容器集會移到集群中的哪個位置,甚至可以被替換掉。
Kubelet:運行在節(jié)點上的服務,可讀取容器清單(container manifest),確保指定的容器啟動并運行。
kubectl: Kubernetes 的命令行配置工具。
kubeadm: 快速構建 Kubernetes 集群的官方工具。
更多技術分享瀏覽我的博客:
參考
- [1] [kubenretes官方文檔] (https://kubernetes.io/zh-cn/docs/concepts/overview/)