認識 k8s 的本質




Borg 的研究人員曾經在論文中提到這樣一個觀點:
運行在大規模集羣中的各種任務之間,實際上存在着各種各樣的關係。這些關係的處理,纔是作業編排和管理系統最困難的地方。

而 k8s 項目所擅長的,正是按照用戶的意願和整個系統的規則,完全自動化地處理好容器之間的各種關係。

這種功能,就是我們經常聽到的一個概念:編排。




一、k8s 的設計架構

在這裏插入圖片描述


類似 Borg ,k8s 也由 Master 和 Node 兩種節點組成,這兩種角色分別對應控制節點和計算節點。


1、控制節點

Master 主要用於編排、管理、調度用戶提交的作業。


Master 由三個獨立組件組合而成:
1.1 kube-apiserver: 負責 API 服務,整個集羣的持久化數據由 kube-apiserver 處理後保存在 Etcd 中。
1.2 kube-scheduler: 負責調度
1.3 kube-controller-manager: 負責容器編排


2、計算節點

計算節點 Node 上最核心的部分,是 kubelet組件。


2.1 kubelet 主要負責同容器運行時打交道,交互需要依賴 CRI ;


CRI:Container Runtime Interface
這個遠程調用接口定義了容器運行時的各項核心操作,比如啓動一個容器需要的所有參數。
只要你的容器運行時能夠運行標準的容器鏡像,就可以通過實現 CRI 接入到 k8s 項目當中。

OCI : 容器運行時規範
具體的容器運行時一般通過 OCI 同底層的 Linux 操作系統進行交互,
把 CRI 請求翻譯成對 Linux 操作系統的調用( 操作 Linux Namespace 和 Cgroups 等)。


2.2 kubelet 還通過 gRPC 協議同一個叫作 Device Plugin 的插件進行交互;


Device Plugin :
是 k8s 項目用來管理 GPU 等宿主機物理設備的主要組件,
也是基於 k8s 項目進行機器學習訓練、高性能作業支持等工作必須關注的功能。

2.3 kubelet 還能調用網絡插件和存儲插件,爲容器配置網絡和持久化存儲
kubelet 與網絡插件進行交互的接口: CNI(Container Networking Interface)
kubelet 與存儲插件進行交互的接口: CSI(Container Storage Interface)




二、k8s 項目本質


1、關鍵對象

1.1 Pod :

k8s 項目對容器間的“訪問”進行了分類,總結出哪些應用之間需要非常頻繁的交互和訪問;
這些應用被劃分爲一個“Pod”,
Pod 是 k8s 項目中最基礎的一個對象,
Pod 裏的容器共享同一個 Network Namespace、同一組數據卷,從而達到高效率交換信息的目的。


1.2 Service :

Web 應用與數據庫之間的訪問關係,k8s 項目則提供了一種叫作“Service”的服務。
Web 應用與數據庫 往往故意不部署在同一臺機器上,這樣即使 Web 應用所在的機器宕機了,數據庫也完全不受影響。

對於一個容器來說,它的 IP 地址等信息不是固定的,那麼 Web 應用又是怎麼找到數據庫容器的 Pod 呢?
給 Pod 綁定一個 Service 服務,而 Service 服務聲明的 IP 地址等信息是“終生不變”的。

這個Service 服務的主要作用,就是作爲 Pod 的代理入口(Portal),從而代替 Pod 對外暴露一個固定的網絡地址。


2、k8s 如何處理應用與應用之間的關係?

容器間“緊密協作”關係如何維護
===>
Pod


如何一次啓動多個應用?
===>
Deployment ( Pod 多實例管理器 )


如何通過一個固定的 IP 地址和端口以負載均衡的方式訪問這組 POD ?
===>
Service


如果兩個不同 Pod 之間在訪問發起時需要加上授權信息,那如何處理這種關係 ?
===>
Secret對象

授權信息以 Secret 鍵值對方式保存在 Etcd 裏 ,
k8s 就會在指定的Web 應用 Pod 啓動時,自動把 Secret 裏的數據以 Volume 的方式掛載到容器裏。
這樣這個 Web 應用 Pod 就可以訪問數據庫了。


3、k8s 如何定義應用運行的形態?

Job: 基於 Pod 改進後的對象,用來描述一次性運行的 Pod(比如,大數據任務)
DaemonSet :用來描述每個宿主機上必須且只能運行一個副本的守護進程服務;
CronJob:則用於描述定時任務等等。


4、k8s 核心功能

圍繞容器和 Pod 不斷向真實的技術場景擴展,從而得到 k8s 的項目核心功能:


在這裏插入圖片描述


k8s 提供了一套基於容器構建分佈式系統的基礎依賴。
所以說,
k8s 項目的本質,是爲用戶提供一個具有普遍意義的容器編排工具!




參考文檔:張磊老師的 深入剖析Kubernetes

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章