Kubernetes 是一種用於在一組主機上運行和協同容器化應用程序的系統,提供應用部署、規劃、更新維護的機制。應用運行在 kubernetes 集羣之上,實現服務的擴容、縮容,執行滾動更新以及在不一樣版本的應用程序之間調度流量以測試功能或回滾有問題的部署。Kubernetes 實現管理服務的各項功能是經過定義各類類型的資源來實現的,如 deployment、pod、service、volume 等。下面經過該文章來簡述 pod 的基礎信息並詳述 pod 的生命週期。node
Pod 是 kubernetes 系統的基礎單元,是由用戶建立或部署的最小組件,也是 kubernetes 系統上運行容器化應用的資源對象。Kubernetes 集羣中其餘資源對象都是爲 pod 這個資源對象作支撐來實現 kubernetes 管理應用服務的目的。docker
Kubernetes 集羣組件主要包括主節點組件API Server、Controller Manager、Scheduler 以及子節點組件 kubelet、container Runtime(如docker)、kube-proxy 等。從與集羣各組件交互角度講述 pod 的建立、運行、銷燬等生命週期,Pod 生命週期中的幾種不一樣狀態包括pending、running、succeeded、failed、Unknown。restful
API Server 提供了集羣與外部交互的接口,經過 kubectl 命令或者其餘 API 客戶端提交 pod spec 給 API Server 做爲pod建立的起始。網絡
Pod 與 API Server 交互的主要流程以下:異步
當提交建立 pod 的請求與 API Server 的交互完成以後,接下來由 scheduler 進行工做,該組件主要是完成 pod 的調度來決定 pod 具體運行在集羣的哪一個節點上。注意,此處聲明一點,API Server 完成任務以後,將信息寫入到 etcd 中,此時 scheduler 經過 watch 機制監聽到寫入到 etcd 的信息而後再進行工做。函數
Scheduler 讀取到寫入到 etcd 中的 pod 信息,而後基於一系列規則從集羣中挑選一個合適的節點來運行它,調度時主要經過三步來肯定 pod 運行節點:測試
注:若是有特殊 pod 資源須要運行在特殊節點上,此時能夠經過組合節點標籤以及 pod 標籤和標籤選擇器等來實現高級調度,如 MatchInterPodAffinity、MatchNodeSelector 和 PodToleratesNodeTaints 等預選策略,他們爲用戶提供自定義 Pod 親和性或反親和性、節點親和性以及基於污點及容忍度的調度機制。
預選策略ui
預選策略就是節點過濾器,例如 MathNodeSelector 實現的規則,以及 PodFitsResources 實現的規則等。執行預選操做時,若是不存在適合的節點,此時 pod 會一直處於 pending 狀態,直到至少有一個可用節點。spa
支持的預選策略列舉一下(1.10版本):rest
CheckNodeCondition
General
NoDiskConflict
PodToleratesNodeTaintsPodToleratesNodeNoExecuteTaints
CheckServiceAffinity
MaxEBsVolumeCount
MaxGCEPDVolumeCount
MaxAzureDiskVolumeCount
CheckVolumeBinding
NoVolumeZoneConflict
CheckNodeMemoryPressure
CheckNodePIDPressure
CheckNodeDiskPressure
MatchInterPodAffinity
簡單介紹幾種:
優選函數
經常使用優選函數:
BalancedResourceAllocation
LeaastRequstedPriority
NodePreferAvoidPodsPriority
NodeAffinityPriority
TaintTolerationPriority
InterPodAffinityPriority
SelectorSpreadPriority
NodeLabelPriority
MostRequestedPriority
ImageLoccalityPriority
此外調度器支持爲每一個優選函數指定一個簡單的整數值表示權重,進行節點優先級分值的計算,計算公式以下:
FinalScoreNode = (weight1 priorityFunc1) + (weight2 priorityFunc2)+ ....
列舉說明幾個優選函數:
對於上述節點調度中還包括一些節點親和度:硬親和度和軟親和性、資源親和調度。硬親和調度和軟親和調度以及反親和調度、污點容忍度等,都是 pod 調度的策略,不一一詳述。
當 scheduler 經過一系列策略選定 pod 運行節點以後將結果信息更新至 API Server,由 API Server 更新至 etcd 中,並由 API Server 反映調度結果,接下來由 kubelet 在所選定的節點上啓動 pod。
kubelet 組件的做用不僅僅是建立 pod,另外還包括節點管理、cAdvisor 資源監控管理、容器健康檢查等功能。
啓動pod流程分析
kubelet 經過 API Server 監聽 etcd 目錄,同步 pod 列表。若是發現有新的 pod 綁定到本節點,則按照 pod 清單要求建立 pod,若是是發現 pod 被更新,則作出相應更改。
讀取到 pod 的信息以後,若是是建立和修改 pod 的任務,則作以下處理:
詳述pod聲明週期中的重要行爲
除了建立應用容器(主容器及輔助容器以外,注意,若是集羣中部署了 istio,則會在 pod 啓動的時候注入一個新的和 istio 相關的容器,那是另外一個美好故事的開端),還能夠爲 pod 對象定義其聲明週期中的多種行爲,如初始化容器、容器探測以及就緒性探測等。
容器生命週期的幾種行爲
初始化容器
初始化容器即 pod 內主容器啓動以前要運行的容器,主要是作一些前置工做,初始化容器具備如下特徵:
聲明週期鉤子函數
備註:鉤子程序的執行方式有「Exec」和「HTTP」兩種。
容器探測
容器探測分爲存活性探測和就緒性探測容器探測是kubelet對容器健康狀態進行診斷,容器探測的方式主要如下三種:
Pod終止過程
終止過程主要分爲以下幾個步驟:
此外 kubelet 除了啓動以外,kubelet 中還有 cAdvisor,用於收集容器 CPU、內存、文件系統和網絡使用狀況等信息,與 prometheus 結合實現對集羣內 pod 監控。
此外,除了上述三個組件在建立 pod 過程當中的交互,還有 controller-manager 來保證 pod 處於用戶指望狀態(即保證 pod 永遠處於存活狀態)等功能以及 proxy 用於集羣內 pod 之間通訊等。
本文由博雲研究院原創發表,轉載請註明出處。