[原創]kubernetes筆記之原理分析(上)
以下是《kubernetes權威指南》的學習筆記,我對書中的內容做了總結和提煉。 如有謬誤之處, 還望各位指出。
先放一張kubernetes的架構設計圖:Apiserver原理分析
概述
整個系統的數據匯流排。提供以下功能特性:
集群管理的api入口
資源配額控制的入口
提供完善的集群安全機制
api 訪問
訪問api的三種方式:
直接curl調用api
啟動內部代理(kubectl proxy ),然後訪問內部代理進行調用,可以進行訪問控制,如限制要訪問的介面,增加允許訪問的client的白名單
使用k8s提供的client lib ,通過編程的方式訪問,這種方式有兩種使用場景,一是pod需要發現同屬於一個service的其它pod副本的信息來組建集群(如elasticsearch集群), 二是需要通過調用api來我開發基於k8s的管理平台
獨特的k8s proxy api:
這種api可以用來代理rest請求, 把收到的請求轉發到某一個node上的kubelet進程的埠上,由kubelet進行響應示例: curl 127.0.0.1:8080/api/v1/proxy/nodes/node-1/pods這裡返回的pods的信息是由node上的kubelet進程收集的, 而不是從etcd的資料庫獲取, 二者的信息可能在某個時間點會有偏差。這種特殊的api的應用場景是: 通過這類api來直接訪問pods上的應用, 可以用來逐一排查同一service的多個pod副本上的應用是否有異常。示例一: curl 127.0.0.1:8080/api/v1/proxy/namespaces/default/pods/xxxx-pod-1示例二: curl 127.0.0.1:8080/api/v1/proxy/namespaces/default/services/xxxx-svr-1
集群之間功能模塊的通信
kubelet --> apiserver (彙報自身狀態, 偵聽pod信息)controller-manager --> apiserver (實時監控node信息,並做處理)scheduler --> apiserver (偵聽新建pod的信息, 檢索符合要求的node列表,並進行調度邏輯的執行)
為緩解apiserver的壓力, 各個模塊會緩存從apiserver獲取的數據, 某些情況下會直接使用緩存的數據(什麼情況使用緩存, 如何保證數據的一致性?)
controller manager原理分析
集群內部的管理控制中心,是一個「修正系統」。負責以下對象的管理:
node
pod副本
endpoint
namespace
service accout
resource quota
包含了以下controller:
replication controller
node controller
resourcequota controller
namespace controller
serviceaccount controller
token controller
service controller
endpoint controller
replication controller
職責是: 保證pod副本數量始終保持預設值應用場景:
確保pod數量, 以保證高可用要求
系統擴容和縮容
滾動更新
只有當pod的重啟策略是Always時(RestartPolicy=Always)時, replication controller 才會管理該pod的操作(例如創建, 銷毀, 重啟等)
pod通過修改標籤可以脫離replication controller的控制
node controller
通過apiserver獲取node的信息,實現管理和監控集群的各個node節點的相關控制功能。節點的健康狀態有三種: 就緒(true), 未就緒(false), 未知(unknown)master節點的系統時間作為探測時間, 狀態變化的時間可能是上一次保存的狀態時間,或者本次節點變化的時間。如果有段時間沒有收到節點信息,則狀態設置為unknown.當狀態為非就緒狀態時, 將節點加入待刪除隊列。
resourcequota controller
資源配額管理, 確保指定的資源對象在任何情況下都不會超量佔用系統資源,避免業務進程的設計和實現的缺陷導致整個系統的紊亂, 對整個集群的平穩運行起著重要作用。
k8s集群對資源配額的管理有三個維度: 容器級別, pod級別, namespace級別。容器級別: cpu & memorypod級別: 所有容器的可用資源namespace級別: pod數量, rc數量, svr數量, resourcequota數量, secret數量, pv數量
配額管理的控制:由apiserver中的admission control來控制, 實際上apiserver是配額控制的一個入口。兩種配額約束方式: limitranger(容器級別, pod級別), resourcequota(namespace級別)
resourcequota controller組件負責定期統計namespace下pod, rc, svr, resourcequota, secret, pv等資源對象的數量, 還有container實例使用的資源,將統計結果寫入etcd。這些信息會被admission controller使用, 如果不符合配額約束, 則創建對象失敗。如果既在namespace上命名了resourcequota約束, 又在pod級別聲明了limitranger,admission control 會同時計算二者的情況, 需要同時滿足才會創建對象。
namespace controller
用戶通過api server創建新的namespace, 並保存在etcd中。 而這個controller可以通過api server讀取namespace的相關信息。當namespace的狀態被設置為terminating時, 這個controller會刪除改namespace下的所有對象資源。admission controller會通過namespacelifecycle插件來阻止為該namespace創建新的資源。
serviceaccount controller
token controller
service controller
k8s集群和外部雲平台的一個介面控制器,負責偵聽service的變化。如果service的type是loadbalancer, 那麼service controller就會負責動態更新創建對於的loadbalancer實例, 和路由轉發表等
endpoint controller
負責偵聽service和相應的pod副本的變化,以及生成和維護所有endpoints對象。 當service被刪除時,該controller會負責刪除該service同名的endpoints對象。 當新的service被創建或修改, pod產生相關事件時, 該controller就會更新對應service的endpoints對象(更改對應的endpoint條目)。
註: endpoints對象維護一個service對應的所有pod副本的訪問地址。
scheduler 原理分析
scheduler是負責pod調度的重要組件。起著承上啟下的作用, 從上游接收controller manager 創建的pod, 為起安排node落腳, 然後交給目標node上的kubelet進程, 由其負責pod的「下半生」的生命周期管理。
默認調度流程分兩步:
預選(predicates): 遍歷所有node, 先根據預選策略初步篩選出符合條件的node
優選(priority): 從預選的node中挑出最優的選擇
調度流程是通過插件的方式載入調度演算法提供者。 每個algorithmprovider都要提供3個參數, 演算法名稱name, 預選策略集合predicatekeys, 優選策略集合prioritykeys
7個可用的預選策略:
NoDiskConflict
PodFirstResources
PodSelectorMatches
PodFitsHost
CheckNodeLablePresence
CheckServiceAffinity
PodFitsPorts
默認的algorithmprovider載入的預選策略:
NoDiskConflict
PodFirstResources
PodSelectorMatches
PodFitsHost
PodFitsPorts
所有預選策略的說明
NoDiskConflict
判斷備選pod的gcepersistentdisk或者awselasticblockstore和備選的節點已存在的pod是否存在衝突
PodFirstResources
node的資源是否滿足備選pod的需求。需要對備選pod和node上已有pod的資源進行求和,看是否超過node所能提供的資源
PodSelectorMatches
node是否有pod的標籤選擇器所指定的標籤, 即nodeselector所指定的標籤
PodFitsHost
node的名稱是否和pod所指定的node名稱一致, 即nodename所指定的名稱
CheckNodeLablePresence
用於判斷當策略列出的標籤在備選節點存在是, 是否選擇該備選節點
CheckServiceAffinity
用於判斷備選節點是否包含策略指定的標籤
PodFitsPorts
判斷備選pod所用的埠是否在備選的node中被佔用
3個優選策略:
LeastRequestedPriority
CalculateNodeLabelPriority
BalancedResourceAllocation
註:每個節點通過優選策略會算出一個得分, 得分最大的節點作為最終的優選結果。
問題: 所有的優選策略都要計算一遍么?還是只是挑選其中的一個?如果挑選其中一個,又是如何挑選?
所有優選策略的說明:
LeastRequestedPriority
選出資源消耗最少的節點, 即資源最充足的節點(cpu, mem兩個維度), 有對應的計算公式
CalculateNodeLabelPriority
判斷策略列出的標籤在備選節點出現時,是否選擇該備選節點
BalancedResourceAllocation
從備選節點中選出各項資源使用率最均衡的方法, 與1類似,但是計算公式又不同
歡迎關注微信公眾號"雲時代的運維開發"
推薦閱讀:
※第五章(第二遍)
※讀書筆記(五)
※夜深了,你怎麼還不睡?——評《這本書能讓你睡得好》
※(6/200)《你一生的故事》:沒吹的那麼精彩
TAG:Kubernetes | 容器 | 读书笔记 |