摘要:比如選取合適的節點,配置相應的負載均衡策略等行動控制器會負責具體的工作執行,以達到用戶聲明的應用狀態,該過程是全自動化。
什么是kubernetes?
官方說明:
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 平臺一樣,也都支持比如服務部署、自動運維、資源調度、擴縮容、自我修復、負載均衡,服務發現等功能。
講點不一樣的,Kubernets 到底有什么特別的地方?以我的理解還是在于能力抽象,抽象可以分為兩大塊:基礎設施 和 API。
1.基礎設施的抽象
基礎設施包括很多,比如runtime(docker、rkt、pouch),存儲,網絡等。還有不同的云服務提供商,集群環境的差異都會很大。
像存儲、網絡這類都是難啃的骨頭,如果 Kubernetes 想吃,那就會出現大量的 PR,這些代碼量甚至會比主體代碼倍上好幾倍,不僅會提升代碼的復雜度,還會影響系統的穩定性。
所以 Kubernetes 根本不想吃,但是又想做云無關,便開始實現各類 interface,做各種抽象。比如容器運行時接口(CRI)、容器網絡接口(CNI)、容器存儲接口(CSI)。這些接口讓 Kubernetes 變得無比開放,而其本身則可以專注于內部部署及容器調度。
Kubernetes 生態中也會有很多通用的功能,比如服務發現、負載均衡、日志系統、監控系統等,這些都有提供默認方案,且這些方案都是可選、可插拔的。這些也都可以看作是 PaaS 平臺的基礎設施,在 Kubernetes 上也沒有強綁強銷的買賣,給用戶提供了高度的靈活性。
2. API 的抽象
Kubernetes 的各種功能都離不開它定義的資源對象,這些對象都可以通過 API 被提交到集群的 Etcd 中。API 的定義和實現都符合 HTTP REST 的格式,用戶可以通過標準的 HTTP 動詞(POST、PUT、GET、DELETE)來完成對相關資源對象的增刪改查。
常用的資源對象,比如 Deployment、DaemonSet、Job、PV 等。API 的抽象也意在這部分資源對象的定義。Kubernetes 有新的功能實現,一般會創建新的資源對象,而功能也依托于該對象進行實現。
我覺得這兩部分的抽象,才是極大的成就了當前的 Kubernetes,使其成為業界標準的關鍵之一。
設計Kubernetes 已經是一個非常龐大的分布式系統了,在深入各類源碼實現之前,值得先了解下 Kubernetes 的設計理念。
這里先學習下 Kubernetes 的聲明式設計及控制閉環。
1. 聲明式
Kubernetes 采用了聲明式(Declarative)的資源管理模式,該模式會有如下幾個步驟:
聲明:用戶通過聲明式的配置文件(json/yaml等)向 Kubernetes 告訴所期望達到的應用狀態。(比如:運行 2 個副本的 nginx 服務)
觀測:Kubernetes 會觀測到用戶的聲明,并自動分析出需要執行的操作及用戶所期望達到的應用狀態。(比如選取合適的節點,配置相應的負載均衡策略等)
行動:Kubernetes 控制器會負責具體的工作執行,以達到用戶聲明的應用狀態,該過程是全自動化。
持續觀測與收斂:大型分布式系統必然會存在各種異常,比如系統崩潰、容器退出等。Kubernetes 自然會持續關注系統的實時狀態,當遇到異常時能夠及時的進行自我修復。比如用戶聲明了 2 個 nginx 服務,當其中有個 nginx 掛了,或者所在的宿主機掛了,kubernetes 會自動發現,并尋找合適的節點,再運行一個新的 nginx 服務,以維持用戶所期望達到的應用狀態。
在命令式(Imperative)設計模式中,用戶需要指明一步一步的具體流程和指令,而并非像聲明式模式一樣直接指明最終想要達到的狀態。
可以簡單假想下,如果用命令式來實現 Kubernetes集群,會如何實現?
必然 scheduler 模塊自身不僅需要完成原本的調度工作,還攜帶了 apiserver & controller等功能;scheduler 不僅需要執行命令,還需要關心命令執行的結果;很多復雜的概念都會堆積在 scheduler 模塊上,導致該模塊越來越重,越來越復雜。
相對于命令式操作,聲明式操作會更穩定且更容易被用戶接受,因為該API中隱含了用戶想要操作的目標對象,而這些對象剛好都是名詞性質的,比如Service、Deployment、PV等;且聲明式的配置文件更貼近“人類語言”,比如YAML、JSON。
所以相比較,命令式思想在分布式系統和微服務架構中會存在各種困境。
2. 控制閉環
Kubernetes 使用了聲明式設計模式,這里控制閉環又起到了什么作用呢?
我們可以從該系統的需求入手分析:
持續觀測、校正,最終將運行狀態達到用戶期望的狀態。
感知用戶的行為并執行。比如修改 Pod 數量,應用升級/回滾等等。
聲明僅僅只是聲明,用戶丟過來一個 yaml 文件后,該如何智能的轉化為一系列可執行操作,且達到上面所描述的需求?
調度器是核心,但它只是負責從集群節點中選擇合適的 node 來運行 pods,顯然讓調度器來實現上訴的功能不太合適,而需要有專門的控制器組件來實現。
Kubernetes 實現了大量的 controllers,它們通過 list-watch etcd 來感知集群數據的更新,然后 24 小時不間斷的工作以達到期待的狀態,在該過程中它們也會把創建的各類數據反饋回 kube-apiserver & etcd,從而形成了數據流的閉環。
Kube-controller-manager 不僅完成了 Kubernetes 集群功能的半片天,還提供很強大的擴展能力,可以讓用戶輕松的實現自己的 controllers。
架構Kubernetes 架構是借鑒了 Borg 的設計理念,如下圖:
Kubernetes 主要由以下幾個核心組件組成:
Etcd:是高可用的key/value存儲系統,用于持久化存儲集群中的所有資源對象,比如:Node,Pod,Serivce,RC,namespace等。API server提供了操作etcd的封裝接口API,以Rest的方式提供,這些API基本上都是集群中資源對象的增刪改查及監聽資源變化的接口,比如創建Pod、RC,監聽Pod的變化等接口。API server是連接其他所有服務組件的中間樞紐。
API Server:提供了資源對象的唯一操作入口,其他組件都必須通過它提供的 API 來操作資源數據,通過對相關的資源數據"全量查詢" + "變化監聽",這些組件可以很"實時"的完成相關的業務功能。比如提交一個新的 Pod 到 API server 中,Controller Manger 可以立即就發現并開始作用。它還有一套完備的安全機制,包括認證、授權及準入控制等相關模塊。
Controller Manger:集群內部的管理控制中心,主要完成了集群的故障檢測和恢復的自動化工作。比如對 RC 定義的 Pod 進行維護;根據 service 和 Pod的關系,完成服務的 Endpoints 對象的創建和更新;還有 Node 的發現、管理和狀態監控,死亡容器所占資源及本地緩存的鏡像文件的清理等工作。
Scheduler: 集群的調度器,負責 Pod 在集群節點中的調度分配。
Kubelet:負責本地節點上 Pod 的創建、修改、監控、刪除等生命周期管理,同時會上報本 Node 的狀態信息到 API server。
Kube-proxy:實現 Service 的代理及軟件模式的負載均衡器。
Kubectl:集群內部的客戶端可以直接使用 kubectl 命令管理集群;集群外的客戶端需要使用 kubectl Porxy 進行反向代理來訪問 API server。
cAdvisor: 在 Node 節點運行的 Kubelet 服務中內嵌了一個 cAdvisor 服務,cAdvisor 是谷歌的開源項目,用于實時監控 Docker 上運行的容器的性能指標。
除了這些核心組件,還有一些推薦的服務:
Kube-DNS:負責為整個集群提供 DNS 服務。
Heapster:提供資源監控服務。
Dashboard:提供 GUI。
Fluentd-ES:提供集群日志系統。
….
分層架構Kubernetes 有類似于 Linux 的分層架構,如下圖所示:
基礎設施層:runtime、網絡、存儲等
核心層:Kubernetes 最核心的功能,對外提供 API 構建高層的應用,對內提供插件式應用執行環境。
應用層:部署(無狀態、有狀態應用、Job等)和路由(服務發現、負載均衡等)
管理層:系統度量(如基礎設施、容器和網絡的度量),自動化(如自動擴展、動態 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)
接口層:kubectl 命令行工具、客戶端 SDK 以及集群聯邦
生態系統:在接口層之上的龐大容器集群管理調度的生態系統,可以劃分為兩個范疇。
Kubernetes 外部:日志、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps 等
Kubernetes 內部:CRI、CNI、CSI、鏡像倉庫、Cloud Provider、集群自身的配置和管理等。
參考資料https://kubernetes.io/docs/co...
https://github.com/kubernetes...
https://kubernetes.feisky.xyz...
https://segmentfault.com/a/11...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32724.html
摘要:平臺上的微服務架構應用再來看一下我眼中的基于當前最流行的微服務架構的設計是什么樣的,即我們平臺上要運行的典型應用是什么樣的。 showImg(https://segmentfault.com/img/remote/1460000010900878); 8月19日的數人云Container Meetup上,張龍老師做了《基于Kubernetes的PaaS平臺的設計和思考》的精彩分享,分別...
摘要:此時,一些聰明的技術公司紛紛跟進,推出了自家的容器集群管理項目,并且稱之為。容器是完全使用沙箱機制,相互之間不會有任何接口。管理集群的所有行為例如應用調度改變應用的狀態,擴縮容,更新降級應用等。 showImg(https://segmentfault.com/img/remote/1460000018689306); 阿里妹導讀:Kubernetes 近幾年很熱門,在各大技術論壇上被...
摘要:下需要為每個單獨進行采集配置采集日志目錄,采集規則,存儲目標等,不易維護。日志服務的日志架構實踐我們提出基于阿里云日志服務的日志處理架構,用以補充社區的方案,來嘗試解決場景下日志處理的一些細節體驗問題。 摘要: 在Kubernetes服務化、日志處理實時化以及日志集中式存儲趨勢下,Kubernetes日志處理上也遇到的新挑戰,包括:容器動態采集、大流量性能瓶頸、日志路由管理等問題。本文...
摘要:祈使式的腳本很難長期地對系統狀態進行自動維護。這些事件包括的創建消亡的更新例如標簽副本數量等。每當上述事件發生,這個事件所牽扯到的具體的對象就會被放入這個工作隊列中。 本期文章來自才云科技(Caicloud)CEO 張鑫的技術原創。導言:Kubernetes 是一個龐大的軟件系統,欲從源碼層精通 Kubernetes 的進階學習者往往會經歷 Kubernetes:從入門到放棄 的挫敗...
摘要:一方面,網關是個推微服務體系對外的唯一入口另一方面,網關中實現了很多后端服務的共性需求,避免了重復建設。個推微服務網關的設計與實現個推微服務主要是基于和進行實踐的。下圖是個推微服務體系的架構圖。 作者:個推應用平臺基礎架構高級研發工程師 阿飛 在微服務架構中,不同的微服務可以有不同的網絡地址,各個微服務之間通過互相調用完成用戶請求,客戶端可能通過調用N個微服務的接口完成一個用戶請求。因...
閱讀 2423·2021-10-09 09:59
閱讀 2177·2021-09-23 11:30
閱讀 2591·2019-08-30 15:56
閱讀 1145·2019-08-30 14:00
閱讀 2938·2019-08-29 12:37
閱讀 1252·2019-08-28 18:16
閱讀 1655·2019-08-27 10:56
閱讀 1022·2019-08-26 17:23