官方說明:
Kubernetes is an open-source system for automating deployment, scaling, and management of containerized applications.It groups containers that make up an application into logical units for easy management and discovery.
說簡單點,Kubernetes 就是自動化容器管理平臺,它跟通常的 PaaS 平臺同樣,也都支持好比服務部署、自動運維、資源調度、擴縮容、自我修復、負載均衡,服務發現
等功能。node
講點不同的,Kubernets 到底有什麼特別的地方?以個人理解仍是在於能力抽象
,抽象能夠分爲兩大塊:基礎設施
和 API
。nginx
1.基礎設施的抽象git
基礎設施包括不少,好比runtime(docker、rkt、pouch),存儲,網絡等。還有不一樣的雲服務提供商,集羣環境的差別都會很大。
像存儲、網絡這類都是難啃的骨頭,若是 Kubernetes 想吃,那就會出現大量的 PR,這些代碼量甚至會比主體代碼倍上好幾倍,不只會提高代碼的複雜度,還會影響系統的穩定性。github
因此 Kubernetes 根本不想吃,可是又想作雲無關
,便開始實現各種 interface,作各類抽象。好比容器運行時接口(CRI)、容器網絡接口(CNI)、容器存儲接口(CSI)。這些接口讓 Kubernetes 變得無比開放,而其自己則能夠專一於內部部署及容器調度。docker
Kubernetes 生態中也會有不少通用的功能,好比服務發現、負載均衡、日誌系統、監控系統等,這些都有提供默認方案,且這些方案都是可選、可插拔的。這些也均可以看做是 PaaS 平臺的基礎設施,在 Kubernetes 上也沒有強綁強銷的買賣,給用戶提供了高度的靈活性。json
2. API 的抽象segmentfault
Kubernetes 的各類功能都離不開它定義的資源對象,這些對象均可以經過 API 被提交到集羣的 Etcd 中。API 的定義和實現都符合 HTTP REST 的格式,用戶能夠經過標準的 HTTP 動詞(POST、PUT、GET、DELETE)來完成對相關資源對象的增刪改查。設計模式
經常使用的資源對象,好比 Deployment、DaemonSet、Job、PV 等。API 的抽象也意在這部分資源對象的定義。Kubernetes 有新的功能實現,通常會建立新的資源對象,而功能也依託於該對象進行實現。api
我以爲這兩部分的抽象,纔是極大的成就了當前的 Kubernetes,使其成爲業界標準的關鍵之一。緩存
Kubernetes 已是一個很是龐大的分佈式系統了,在深刻各種源碼實現以前,值得先了解下 Kubernetes 的設計理念。
這裏先學習下 Kubernetes 的聲明式設計及控制閉環。
1. 聲明式
Kubernetes 採用了聲明式(Declarative)的資源管理模式,該模式會有以下幾個步驟:
在命令式(Imperative)設計模式中,用戶須要指明一步一步的具體流程和指令,而並不是像聲明式模式同樣直接指明最終想要達到的狀態。
能夠簡單假想下,若是用命令式來實現 Kubernetes集羣,會如何實現?
必然 scheduler 模塊自身不只須要完成本來的調度工做,還攜帶了 apiserver & controller等功能;scheduler 不只須要執行命令,還須要關心命令執行的結果;不少複雜的概念都會堆積在 scheduler 模塊上,致使該模塊愈來愈重,愈來愈複雜。
相對於命令式操做,聲明式操做會更穩定且更容易被用戶接受,由於該API中隱含了用戶想要操做的目標對象,而這些對象恰好都是名詞性質的,好比Service、Deployment、PV等;且聲明式的配置文件更貼近「人類語言」,好比YAML、JSON。
因此相比較,命令式思想在分佈式系統和微服務架構中會存在各類困境。
2. 控制閉環
Kubernetes 使用了聲明式設計模式,這裏控制閉環又起到了什麼做用呢?
咱們能夠從該系統的需求入手分析:
聲明僅僅只是聲明,用戶丟過來一個 yaml 文件後,該如何智能的轉化爲一系列可執行操做,且達到上面所描述的需求?
調度器是核心,但它只是負責從集羣節點中選擇合適的 node 來運行 pods,顯然讓調度器來實現上訴的功能不太合適,而須要有專門的控制器組件來實現。
Kubernetes 實現了大量的 controllers,它們經過 list-watch etcd 來感知集羣數據的更新,而後 24 小時不間斷的工做以達到期待的狀態,在該過程當中它們也會把建立的各種數據反饋回 kube-apiserver & etcd,從而造成了數據流的閉環。
Kube-controller-manager 不只完成了 Kubernetes 集羣功能的半片天,還提供很強大的擴展能力,可讓用戶輕鬆的實現本身的 controllers。
Kubernetes 架構是借鑑了 Borg 的設計理念,以下圖:
Kubernetes 主要由如下幾個核心組件組成:
除了這些核心組件,還有一些推薦的服務:
Kubernetes 有相似於 Linux 的分層架構,以下圖所示:
生態系統:在接口層之上的龐大容器集羣管理調度的生態系統,能夠劃分爲兩個範疇。