k8s學習總結(jié)(一) 一些重要概念

k8s的一些重要概念

- Cluster

Cluster 是計算、存儲和網(wǎng)絡資源的集合,Kubernetes 利用這些資源運行各種基于容器的應用。

- Master

Master 是 Cluster 的大腦,它的主要職責是調(diào)度,即決定將應用放在哪里運行。Master 運行 Linux 操作系統(tǒng),可以是物理機或者虛擬機。為了實現(xiàn)高可用,可以運行多個 Master。

- Node

Node 的職責是運行容器應用。Node 由 Master 管理,Node 負責監(jiān)控并匯報容器的狀態(tài),并根據(jù) Master 的要求管理容器的生命周期。Node 運行在 Linux 操作系統(tǒng),可以是物理機或者是虛擬機。

- Pod

Pod 是 Kubernetes 的最小工作單元。每個 Pod 包含一個或多個容器。Pod 中的容器會作為一個整體被 Master 調(diào)度到一個 Node 上運行。

Kubernetes 引入 Pod 主要基于下面兩個目的:

1. 可管理性。

有些容器天生就是需要緊密聯(lián)系,一起工作。Pod 提供了比容器更高層次的抽象,將它們封裝到一個部署單元中。Kubernetes 以 Pod 為最小單位進行調(diào)度、擴展、共享資源、管理生命周期。

2. 通信和資源共享。

Pod 中的所有容器使用同一個網(wǎng)絡 namespace,即相同的 IP 地址和 Port 空間。它們可以直接用 localhost 通信。同樣的,這些容器可以共享存儲,當 Kubernetes 掛載 volume 到 Pod,本質(zhì)上是將 volume 掛載到 Pod 中的每一個容器。

Pods 有兩種使用方式

1. 運行單一容器。

one-container-per-Pod 是 Kubernetes 最常見的模型,這種情況下,只是將單個容器簡單封裝成 Pod。即便是只有一個容器,Kubernetes 管理的也是 Pod 而不是直接管理容器。

2. 運行多個容器。

但問題在于:哪些容器應該放到一個 Pod 中?
答案是:這些容器聯(lián)系必須 非常緊密,而且需要 直接共享資源。

Controller

Kubernetes 通常不會直接創(chuàng)建 Pod,而是通過 Controller 來管理 Pod 的。Controller 中定義了 Pod 的部署特性,比如有幾個副本,在什么樣的 Node 上運行等。為了滿足不同的業(yè)務場景,Kubernetes 提供了多種 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等,我們逐一討論。

  • Deployment 是最常用的 Controller,比如前面在線教程中就是通過創(chuàng)建 Deployment 來部署應用的。Deployment 可以管理 Pod 的多個副本,并確保 Pod 按照期望的狀態(tài)運行。

  • ReplicaSet 實現(xiàn)了 Pod 的多副本管理。使用 Deployment 時會自動創(chuàng)建 ReplicaSet,也就是說 Deployment 是通過 ReplicaSet 來管理 Pod 的多個副本,我們通常不需要直接使用 ReplicaSet。

  • DaemonSet 用于每個 Node 最多只運行一個 Pod 副本的場景。正如其名稱所揭示的,DaemonSet 通常用于運行 daemon。

  • StatefuleSet 能夠保證 Pod 的每個副本在整個生命周期中名稱是不變的。而其他 Controller 不提供這個功能,當某個 Pod 發(fā)生故障需要刪除并重新啟動時,Pod 的名稱會發(fā)生變化。同時 StatefuleSet 會保證副本按照固定的順序啟動、更新或者刪除。

  • Job 用于運行結(jié)束就刪除的應用。而其他 Controller 中的 Pod 通常是長期持續(xù)運行。

Service

問題:Deployment 可以部署多個副本,每個 Pod 都有自己的 IP,外界如何訪問這些副本呢?

通過 Pod 的 IP 嗎?
要知道 Pod 很可能會被頻繁地銷毀和重啟,它們的 IP 會發(fā)生變化,用 IP 來訪問不太現(xiàn)實。
答案當然是 Service。

Kubernetes Service 定義了外界訪問一組特定 Pod 的方式。Service 有自己的 IP 和端口,Service 為 Pod 提供了負載均衡。
Kubernetes 運行容器(Pod)與訪問容器(Pod)這兩項任務分別由 Controller 和 Service 執(zhí)行。

Namespace

如果有多個用戶或項目組使用同一個 Kubernetes Cluster,如何將他們創(chuàng)建的 Controller、Pod 等資源分開呢?
答案就是 Namespace。

Namespace 可以將一個物理的 Cluster 邏輯上劃分成多個虛擬 Cluster,每個 Cluster 就是一個 Namespace。不同 Namespace 里的資源是完全隔離的。
Kubernetes 默認創(chuàng)建了兩個 Namespace。
[root@node1 ~]# kubectl get namespace
NAME STATUS AGE
default Active 1d
kube-system Active 1d

  • default -- 創(chuàng)建資源時如果不指定,將被放到這個 Namespace 中。
  • kube-system -- Kubernetes 自己創(chuàng)建的系統(tǒng)資源將放到這個 Namespace 中。
    Kubernetes架構(gòu)圖(經(jīng)典經(jīng)典!!)


    k8s架構(gòu)

    Kubernetes拆解圖(經(jīng)典經(jīng)典??!)


    k8s架構(gòu)拆解

K8S Master節(jié)點

從上圖可以看到,Master是K8S集群的核心部分,主要運行著以下的服務:kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod網(wǎng)絡(如:flanne)

  • API Server:K8S對外的唯一接口,提供HTTP/HTTPS RESTful API,即kubernetes API。所有的請求都需要經(jīng)過這個接口進行通信。主要處理REST操作以及更新ETCD中的對象。是所有資源增刪改查的唯一入口。

  • Scheduler:資源調(diào)度,負責決定將Pod放到哪個Node上運行。Scheduler在調(diào)度時會對集群的結(jié)構(gòu)進行分析,當前各個節(jié)點的負載,以及應用對高可用、性能等方面的需求。

  • Controller Manager:負責管理集群各種資源,保證資源處于預期的狀態(tài)。Controller Manager由多種controller組成,包括replication controller、endpoints controller、namespace controller、serviceaccounts controller等

  • ETCD:負責保存k8s 集群的配置信息和各種資源的狀態(tài)信息,當數(shù)據(jù)發(fā)生變化時,etcd會快速地通知k8s相關組件。

  • Pod網(wǎng)絡:Pod要能夠相互間通信,K8S集群必須部署Pod網(wǎng)絡,flannel是其中一種的可選方案。

K8S Node節(jié)點

Node是Pod運行的地方,Kubernetes支持Docker、rkt等容器Runtime。Node上運行的K8S組件包括kubelet、kube-proxy和Pod網(wǎng)絡。

  • Kubelet:kubelet是node的agent,當Scheduler確定在某個Node上運行Pod后,會將Pod的具體配置信息(image、volume等)發(fā)送給該節(jié)點的kubelet,kubelet會根據(jù)這些信息創(chuàng)建和運行容器,并向master報告運行狀態(tài)。
  • Kube-proxy:service在邏輯上代表了后端的多個Pod,外借通過service訪問Pod。service接收到請求就需要kube-proxy完成轉(zhuǎn)發(fā)到Pod的。
    每個Node都會運行kube-proxy服務,負責將訪問的service的TCP/UDP數(shù)據(jù)流轉(zhuǎn)發(fā)到后端的容器,如果有多個副本,kube-proxy會實現(xiàn)負載均衡,有2種方式:LVS或者Iptables Docker Engine:負責節(jié)點的容器的管理工作

Kubernetes中pod創(chuàng)建流程

Pod是Kubernetes中最基本的部署調(diào)度單元,可以包含container,邏輯上表示某種應用的一個實例。例如一個web站點應用由前端、后端及數(shù)據(jù)庫構(gòu)建而成,這三個組件將運行在各自的容器中,那么我們可以創(chuàng)建包含三個container的pod。

pod創(chuàng)建的所有流程

具體的創(chuàng)建步驟包括:

  1. 客戶端提交創(chuàng)建請求,可以通過API Server的Restful API,也可以使用kubectl命令行工具。支持的數(shù)據(jù)類型包括JSON和YAML。

  2. API Server處理用戶請求,存儲Pod數(shù)據(jù)到etcd。

  3. 調(diào)度器通過API Server查看未綁定的Pod。嘗試為Pod分配主機。

  4. 過濾主機 (調(diào)度預選):調(diào)度器用一組規(guī)則過濾掉不符合要求的主機。比如Pod指定了所需要的資源量,那么可用資源比Pod需要的資源量少的主機會被過濾掉。

  5. 主機打分(調(diào)度優(yōu)選):對第一步篩選出的符合要求的主機進行打分,在主機打分階段,調(diào)度器會考慮一些整體優(yōu)化策略,比如把容一個Replication Controller的副本分布到不同的主機上,使用最低負載的主機等。

  6. 選擇主機:選擇打分最高的主機,進行binding操作,結(jié)果存儲到etcd中。

  7. kubelet根據(jù)調(diào)度結(jié)果執(zhí)行Pod創(chuàng)建操作: 綁定成功后,scheduler會調(diào)用APIServer的API在etcd中創(chuàng)建一個boundpod對象,描述在一個工作節(jié)點上綁定運行的所有pod信息。運行在每個工作節(jié)點上的kubelet也會定期與etcd同步boundpod信息,一旦發(fā)現(xiàn)應該在該工作節(jié)點上運行的boundpod對象沒有更新,則調(diào)用Docker API創(chuàng)建并啟動pod內(nèi)的容器。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容