四、k8s 重要概念
? 在實踐之前,必須先學習 Kubernetes 的幾個重要概念,它們是組成 Kubernetes 集群的基石,
(一)Cluster
? Cluster 是計算、存盤和網路資源的集合,Kubernetes 利用這些資源運行各種基于容器的應用,
(二)Master
? Master 是 Cluster 的大腦,它的主要職責是調度,即決定將應用放在哪里運行,Master 運行 Linux 作業系統,可以是物理機或者虛擬機,為了實作高可用,可以運行多個 Master,
(三)Node
? Node 的職責是運行容器應用,Node 由 Master 管理,Node 負責監控并匯報容器的狀態,并根據 Master 的要求管理容器的生命周期,Node 運行在 Linux 作業系統,可以是物理機或者是虛擬機,
? 在前面互動式教程中我們創建的 Cluster 只有一個主機 host01, 它既是 Master 也是 Node,
$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready master 57m v1.17.3
$ hostname
minikube
$
(四)Pod
? Pod 是 Kubernetes 的最小作業單元,每個 Pod 包含一個或多個容器,Pod 中的容器會作為一個整體被 Master 調度到一個 Node 上運行,
Kubernetes 引入 Pod 主要基于下面兩個目的:
-
可管理性,
有些容器天生就是需要緊密聯系,一起作業,Pod 提供了比容器更高層次的抽象,將它們封裝到一個部署單元中,Kubernetes 以 Pod 為最小單位進行調度、擴展、共享資源、管理生命周期,
-
通信和資源共享,
Pod 中的所有容器使用同一個網路 namespace,即相同的 IP 地址和 Port 空間,它們可以直接用 localhost 通信,同樣的,這些容器可以共享存盤,當 Kubernetes 掛載 volume 到 Pod,本質上是將 volume 掛載到 Pod 中的每一個容器,
Pods 有兩種使用方式:
-
運行單一容器,
one-container-per-Pod是 Kubernetes 最常見的模型,這種情況下,只是將單個容器簡單封裝成 Pod,即便是只有一個容器,Kubernetes 管理的也是 Pod 而不是直接管理容器, -
運行多個容器,
但問題在于:哪些容器應該放到一個 Pod 中? 答案是:這些容器聯系必須 非常緊密,而且需要 直接共享資源,
舉個例子,
下面這個 Pod 包含兩個容器:一個 File Puller,一個是 Web Server,

? File Puller 會定期從外部的 Content Manager 中拉取最新的檔案,將其存放在共享的 volume 中,Web Server 從 volume 讀取檔案,回應 Consumer 的請求,
? 這兩個容器是緊密協作的,它們一起為 Consumer 提供最新的資料;同時它們也通過 volume 共享資料,所以放到一個 Pod 是合適的,
? 再來看一個反例:是否需要將 Tomcat 和 MySQL 放到一個 Pod 中?
? Tomcat 從 MySQL 讀取資料,它們之間需要協作,但還不至于需要放到一個 Pod 中一起部署,一起啟動,一起停止,同時它們是之間通過 JDBC 交換資料,并不是直接共享存盤,所以放到各自的 Pod 中更合適,
(五)Controller
? Kubernetes 通常不會直接創建 Pod,而是通過 Controller 來管理 Pod 的,Controller 中定義了 Pod 的部署特性,比如有幾個副本,在什么樣的 Node 上運行等,為了滿足不同的業務場景,Kubernetes 提供了多種 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等,我們逐一討論,
(六)Deployment
? Deployment 是最常用的 Controller,比如前面在線教程中就是通過創建 Deployment 來部署應用的,Deployment 可以管理 Pod 的多個副本,并確保 Pod 按照期望的狀態運行,
(七)ReplicaSet
? ReplicaSet 實作了 Pod 的多副本管理,使用 Deployment 時會自動創建 ReplicaSet,也就是說 Deployment 是通過 ReplicaSet 來管理 Pod 的多個副本,我們通常不需要直接使用 ReplicaSet,
(八)DaemonSet
? DaemonSet 用于每個 Node 最多只運行一個 Pod 副本的場景,正如其名稱所揭示的,DaemonSet 通常用于運行 daemon,
(九)StatefuleSet
? StatefuleSet 能夠保證 Pod 的每個副本在整個生命周期中名稱是不變的,而其他 Controller 不提供這個功能,當某個 Pod 發生故障需要洗掉并重新啟動時,Pod 的名稱會發生變化,同時 StatefuleSet 會保證副本按照固定的順序啟動、更新或者洗掉,
(十)job
? Job 用于運行結束就洗掉的應用,而其他 Controller 中的 Pod 通常是長期持續運行,
(十一)service
? Deployment 可以部署多個副本,每個 Pod 都有自己的 IP,外界如何訪問這些副本呢?
? 通過 Pod 的 IP 嗎?要知道 Pod 很可能會被頻繁地銷毀和重啟,它們的 IP 會發生變化,用 IP 來訪問不太現實,
? 答案是 Service,
Kubernetes Service 定義了外界訪問一組特定 Pod 的方式,Service 有自己的 IP 和埠,Service 為 Pod 提供了負載均衡,
? Kubernetes 運行容器(Pod)與訪問容器(Pod)這兩項任務分別由 Controller 和 Service 執行,
(十二)Namespace
? 如果有多個用戶或專案組使用同一個 Kubernetes Cluster,如何將他們創建的 Controller、Pod 等資源分開呢?
? 答案就是 Namespace,
Namespace 可以將一個物理的 Cluster 邏輯上劃分成多個虛擬 Cluster,每個 Cluster 就是一個 Namespace,不同 Namespace 里的資源是完全隔離的,Kubernetes 默認創建了兩個 Namespace,
? default -- 創建資源時如果不指定,將被放到這個 Namespace 中,
? kube-system -- Kubernetes 自己創建的系統資源將放到這個 Namespace 中,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/250080.html
標籤:其他
上一篇:三、k8s 核心功能
下一篇:AlexNet
