k8s創建pod和service的過程


一、概念介紹

更詳細的參見:https://www.kubernetes.org.cn/5335.html

1、K8s

K8s 是一種用於在一組主機上運行和協同容器化應用程序的系統,提供應用部署、規划、更新維護的機制。

應用運行在 K8s 集群之上,借助服務擴容、縮容,執行滾動更新在不同版本的應用程序之間調度流量以測試功能或回滾有問題的部署。

K8s 實現管理服務的各項功能是通過定義各種類型的資源來實現的,如 deployment、pod、service、volume 等。

 

2、Pod

Pod 是 K8s 系統的基礎單元,是由用戶創建或部署的最小組件,也是 K8s 系統上運行容器化應用的資源對象。

K8s 集群中其他資源對象都是為 pod 這個資源對象做支撐來實現 K8s 管理應用服務的目的。

K8s 集群組件主要包括主節點組件API Server、Controller Manager、Scheduler 以及子節點組件 kubelet、container Runtime(如docker)、kube-proxy 等。

Pod 生命周期中的幾種不同狀態包括pending、running、succeeded、failed、Unknown

 

二、Pod的創建、運行、銷毀等生命周期

1、創建pod

1.1、與API Server交互

         API Server 提供了集群與外部交互的接口,通過 kubectl 命令或者其他 API 客戶端提交 pod spec 給 API Server 作為pod創建的起始。

         Pod 與 API Server 交互的主要流程如下: 

         用戶通過Kubectl提交一個創建RC的請求,該請求通過APIServer被寫入etcd中,此時Controller Manager通過API Server的監聽資源變化的接口監聽到這個RC事件,

         分析之后,發現當前集群中還沒有它所對應的Pod實例,於是根據RC里的Pod模板定義生成一個Pod對象,通過APIServer寫入etcd

         至此,API Server 創建過程完成,剩下的由 scheduler 和 kubelet 來完成,此時 pod 處於 pending 狀態。

1.2、與scheduler交互

         此事件被Scheduler發現,它立即執行一個復雜的調度流程,為這個新Pod選定一個落戶的Node,然后通過API Server講這一結果寫入到etcd中,

         目標Node上運行的Kubelet進程通過APIServer監測到這個“新生的”Pod,並按照它的定義,啟動該Pod並任勞任怨地負責它的下半生,直到Pod的生命結束。

1.3、kubelet 在所選定的節點上啟動 pod。

         Kubelet組件啟動podkubelet 組件的作用不單單是創建 pod,另外還包括節點管理、cAdvisor 資源監控管理、容器健康檢查等功能。 

2、創建service

2.1、隨后,我們通過Kubectl提交一個新的映射到該Pod的Service的創建請求

2.2、ControllerManager會通過Label標簽查詢到相關聯的Pod實例,然后生成Service的Endpoints信息,並通過APIServer寫入到etcd中,

2.3、接下來,所有Node上運行的Proxy進程通過APIServer查詢並監聽Service對象與其對應的Endpoints信息,建立一個軟件方式的負載均衡器來實現Service訪問到后端Pod的流量轉發功能。

三、master和node

1、Master:Master節點上面主要由四個模塊組成:APIServer、scheduler、controller manager、etcd。

1.1、APIServer: APIServer負責對外提供RESTful的K8s API服務,
它是系統管理指令的統一入口,任何對資源進行增刪改查的操作都要交給
APIServer處理后再提交給etcd。如架構圖中所示,kubectl(K8s提供的客戶端工具,
該工具內部就是對K8s API的調用)是直接和APIServer交互的。

1.2、schedule: scheduler的職責很明確,就是負責調度pod到合適的Node上。如果把scheduler看成一個黑匣子,
那么它的輸入是pod和由多個Node組成的列表,輸出是Pod和一個Node的綁定,即將這個pod部署到這個Node上。
K8s目前提供了調度算法,但是同樣也保留了接口,用戶可以根據自己的需求定義自己的調度算法。
controller manager: 如果說APIServer做的是“前台”的工作的話,那controller manager就是負責“后台”的。
每個資源一般都對應有一個控制器,而controller manager就是負責管理這些控制器的。比如我們通過APIServer
創建一個pod,當這個pod創建成功后,APIServer的任務就算完成了。而后面保證Pod的狀態始終和我們預期的一樣
的重任就由controller manager去保證了。

1.3、etcd: etcd是一個高可用的鍵值存儲系統,K8s使用它來存儲各個資源的狀態,從而實現了Restful的API。

2、Node:每個Node節點主要由三個模塊組成:kubelet、kube-proxy、runtime。

2.1、runtime
runtime指的是容器運行環境,目前K8s支持docker和rkt兩種容器。

2.2、kube-proxy
該模塊實現了K8s中的服務發現和反向代理功能。反向代理方面:kube-proxy支持TCP和UDP連接轉發,默認基於Round
Robin算法將客戶端流量轉發到與service對應的一組后端pod。服務發現方面,
kube-proxy使用etcd的watch機制,監控集群中service和endpoint對象數據的動態變化,並且維護一個service到endpoint的映射關系,
從而保證了后端pod的IP變化不會對訪問者造成影響。另外kube-proxy還支持session affinity。

2.3、kubelet
Kubelet是Master在每個Node節點上面的agent,是Node節點上面最重要的模塊,它負責維護和管理該Node上面的所有容器,
但是如果容器不是通過K8s創建的,它並不會管理。本質上,它負責使Pod得運行狀態與期望的狀態一致。

至此,K8s的Master和Node就簡單介紹完了。下面我們來看K8s中的各種資源/對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM