文章目錄
前言:
Kubernetes 是一個可移植的、可擴展的開源平臺,用於管理容器化的工作負載和服務,可促進聲明式配置和自動化。Kubernetes 擁有一個龐大且快速增長的生態系統。Kubernetes 的服務、支持和工具廣泛可用。
名稱 Kubernetes 源於希臘語,意爲 “舵手” 或 “飛行員”。Google 在 2014 年開源了 Kubernetes 項目。Kubernetes 建立在 Google 在大規模運行生產工作負載方面擁有十幾年的經驗的基礎上,結合了社區中最好的想法和實踐。
一、Kubernetes 發展
-
傳統部署時代
早期,組織在物理服務器上運行應用程序。無法爲物理服務器中的應用程序定義資源邊界,這會導致資源分配問題。
例如,如果在物理服務器上運行多個應用程序,則可能會出現一個應用程序佔用大部分資源的情況,結果可能導致其他應用程序的性能下降。一種解決方案是在不同的物理服務器上運行每個應用程序,但是由於資源利用不足而無法擴展,並且組織維護許多物理服務器的成本很高
-
虛擬化部署時代
作爲解決方案,引入了虛擬化功能,它允許您在單個物理服務器的 CPU 上運行多個虛擬機(VM)。虛擬化功能允許應用程序在 VM 之間隔離,並提供安全級別,因爲一個應用程序的信息不能被另一應用程序自由地訪問。
因爲虛擬化可以輕鬆地添加或更新應用程序、降低硬件成本等等,所以虛擬化可以更好地利用物理服務器中的資源,並可以實現更好的可伸縮性
-
容器部署時代
容器類似於 VM,但是它們具有輕量級的隔離屬性,可以在應用程序之間共享操作系統(OS)。因此,容器被認爲是輕量級的。容器與 VM 類似,具有自己的文件系統、CPU、內存、進程空間等。由於它們與基礎架構分離,因此可以跨雲和 OS 分發進行移植
二、Kubernetes 作用
-
容器因爲具有許多優勢而變得很流行,容器是打包和運行應用程序非常好的方式,在生產環境中會面臨一個問題:
在日常工作中,管理運行的應用程序,並確保不會停機,例如,如果一個容器發送故障,則需要啓動另一個容器。如果給系統處理,效率會較低
三、 Kubernetes 其他特性
- Kubernetes 不是傳統的、包羅萬象的 PaaS(平臺即服務)系統,由於 Kubernetes 在容器級別而不是在硬件級別運行,因此它提供了 PaaS 產品共有的一些普遍適用的功能,例如部署、擴展、負載均衡、日誌記錄和監視
- 但是,Kubernetes 不是單一的,默認解決方案是可選和可插拔的。Kubernetes 提供了構建開發人員平臺的基礎,但是在重要的地方保留了用戶的選擇和靈活性
3.1 Kubernetes其他特性
- ① Kubernetes 不限制支持的應用程序類型。Kubernetes 旨在支持極其多種多樣的工作負載,包括無狀態、有狀態和數據處理工作負載。如果應用程序可以在容器中運行,那麼它應該可以在 Kubernetes 上很好地運行。
- ② Kubernetes 不部署源代碼,也不構建應用程序。持續集成(CI)、交付和部署(CI/CD)工作流取決於組織的文化和偏好以及技術要求
- ③ Kubernetes 不提供應用程序級別的服務作爲內置服務,例如中間件(例如,消息中間件)、數據處理框架(例如,Spark)、數據庫(例如,mysql)、緩存、集羣存儲系統(例如,Ceph)。這樣的組件可以在 Kubernetes 上運行,並且/或者可以由運行在 Kubernetes 上的應用程序通過可移植機制(例如,開放服務代理)來訪問
- ④ Kubernetes 不指定日誌記錄、監視或警報解決方案。它提供了一些集成作爲概念證明,並提供了收集和導出指標的機制。
- ⑤ Kubernetes 不提供或不要求配置語言/系統(例如 jsonnet),它提供了聲明性 API,該聲明性 API 可以由任意形式的聲明性規範所構成。
- ⑥ Kubernetes 不提供也不採用任何全面的機器配置、維護、管理或自我修復系統
- ⑦ 此外,Kubernetes 不僅僅是一個編排系統,實際上它消除了編排的需要。編排的技術定義是執行已定義的工作流程:首先執行 A,然後執行 B,再執行 C。相比之下,Kubernetes 包含一組獨立的、可組合的控制過程,這些過程連續地將當前狀態驅動到所提供的所需狀態。從 A 到 C 的方式無關緊要,也不需要集中控制,這使得系統更易於使用且功能更強大、健壯、彈性和可擴展性。
四、Kubernetes 集羣架構與組件
4.1 Kubernetes 集羣架構圖
4.2 Kubernetes 各組件詳解
- master節點主要由apiserver、controller-manager和scheduler三個組件,以及一個用於集羣狀態存儲的etcd存儲服務組成,而每個node節點則主要包含kubelet、kube-proxy及容器引擎等組件。此外,完整的集羣服務還依賴於一些附加組件,如kubedns等。
4.2.1 Master 節點/組件
-
Master組件:
提供集羣的管理控制中心。Master組件可以在集羣中任何節點上運行。但是爲了簡單起見,通常在一臺VM/機器上啓動所有Master組件,並且不會在此VM/機器上運行用戶容器。
-
**① kube-apiServer(核心組件) **
Kubernetes API,集羣的統一吐口,各組件協調者,以RESTful api 提供接口服務,所有的對象資源的增刪改查和監聽操作都是叫給APIServer處理後再提交給Etcd存儲
-
② kube-controller-manager
處理集羣中常規後臺任務,一個資源對應一個控制器,而ControllerManaager就是負責管理這些控制器的
控制器包括(部分):
- 節點控制器:負責在節點出現故障時進行通知和響應。
- 復制控制器:負責爲系統中的每個複製控制器對象維護正確數量的Pod。
- 端點控制器:填充“端點”對象(即,加入“服務和窗格”)。
- 服務帳戶和令牌控制器:爲新的名稱空間創建默認帳戶和API訪問令牌。
-
③ kube-scheduler
根據調度算法爲新創建的Pod選擇一個Node節點,可以任意部署,可以再部署再同一個節點上,也可以部署再不同的節點上。
調度算法(之後會對此進行介紹):
- ① 預選算法:過濾nodes
- ② 優選算法:對nodes打分
-
④ Etcd
分佈式鍵值存儲系統,用於保存集羣狀態數據,比如Pod、Service等對象信息
Etcd 具有服務發現系統,這是mysql、Oracle數據庫鎖沒有的,同時還有以下特點:
- 簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
- 安全:支持SSL證書驗證
- 快速:根據官方提供的benchmark數據,單實例支持每秒2K+讀操作
- 可靠:採用raft算法,實現分佈式系統數據的可用性和一致性
之後也會對Etcd進行單篇博客介紹
4.2.2 Node節點組件
-
節點組件運行在Node,提供Kubernetes運行時環境,以及維護Pod。
-
① kublet
kubelet 是Master在Node節點上的Agent,管理本機運行容器的生命週期,比如創建容器、Pod掛載數據卷、下載secret、獲取容器和節點狀態等工作。kubelet將每個Pod轉換成一組容器
-
② kube-proxy
在Node節點上實現Pod網絡代理,維護網絡規則和四層負載均衡工作。
-
③ docker或rocket
容器引擎,運行容器
4.2.3 Add-ons 附加組件
- kube-dns:負責爲整個集羣提供DNS服務;
- Ingress Controller:爲服務提供外網入口;
- Heapster:提供資源監控;
- Dashboard:提供GUI;
- Federation:提供跨可用區的集羣;
- Fluentd-elasticsearch:提供集羣日誌採集、存儲與查詢
4.3 單節點架構工作流程
4.3.1 單節點簡易圖
4.3.2 流程詳解:
- 假設用戶需創建 nginx資源(網站/調度)
- 請求發送至master 首先需要經過apiserver(資源控制請求的唯一入口)
- apiserver 接收到請求後首先會先記載在Etcd中
- Etcd的數據庫根據controllers manager(控制器) 查看創建的資源狀態(有無狀態化)
- 通過controllers 觸發 scheduler (調度器)
- scheduler 通過驗證算法 驗證架構中的nodes節點,篩選出最適合創建該資源,接着分配給這個節點進行創建
- node節點中的kubelet 負責執行master給與的資源請求,根據不同指令,執行不同操作
- 對外提供服務則由kube-proxy開設對應的規則(代理)
- container 容器開始運行(runtime 生命週期開始計算)
- 外界用戶進行訪問時,需要經過kube-proxy 訪問到container
- 如果container 因故障而被銷燬了,master節點的controllers 會再次通過scheduler 資源調度通過kubelet再次創建容器,恢復基本條件限制
五、Kubernetes 核心概念
-
Pod
① 最小部署單元
② 一組容器的集合
③ 一個Pod中的容器共享網絡命名空間(可以理解在同一個局域網)
④ Pod 是短暫的(有生命週期)
-
Controllers
① ReplicaSet:確保預期的Pod副本數量(參數,可進行設置)
② Deployment:無狀態應用(例如:web、nignx、apache、tomcat)
③ StatefulSet:有狀態應用部署
- 有狀態:該應用獨一無二,無法重新創建進行完美替代,例如mysql、Oracle數據庫
④ DaemonSet:確保所有的Node運行同一個Pod(把所有的Node設置爲同一個命名空間)
⑤ Job:一次性任務(類比linux:at)
⑥ Cronjob:定時任務(類比linux:crontab)
更高層次對象,部署和管理Pod
-
Service
防止Pod失聯
定義一組Pod訪問的策略(主要作用)
確保每個Pod之間的獨立性(安全)
-
Label
標籤,附加到某個資源上,用於關聯對象、查詢和篩選
-
Namespaces
命名空間,將對象邏輯上隔離
-
Annotations
註釋
總結:
本篇博客介紹了k8s中的基礎概念,之後會逐步進行深入介紹~~~