4、k8s 重要概念

4、k8s 重要概念

​ 在實踐以前,必須先學習 Kubernetes 的幾個重要概念,它們是組成 Kubernetes 集羣的基石。node

(一)Cluster

​ Cluster 是計算、存儲和網絡資源的集合,Kubernetes 利用這些資源運行各類基於容器的應用。網絡

(二)Master

​ Master 是 Cluster 的大腦,它的主要職責是調度,即決定將應用放在哪裏運行。Master 運行 Linux 操做系統,能夠是物理機或者虛擬機。爲了實現高可用,能夠運行多個 Master。負載均衡

(三)Node

​ Node 的職責是運行容器應用。Node 由 Master 管理,Node 負責監控並彙報容器的狀態,並根據 Master 的要求管理容器的生命週期。Node 運行在 Linux 操做系統,能夠是物理機或者是虛擬機。學習

​ 在前面交互式教程中咱們建立的 Cluster 只有一個主機 host01, 它既是 Master 也是 Node。spa

$ 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 主要基於下面兩個目的:code

  • 可管理性。blog

    有些容器天生就是須要緊密聯繫,一塊兒工做。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 中。

相關文章
相關標籤/搜索