K8s 核心組件及運(yùn)行機(jī)制
kubernetes核心組件及運(yùn)行機(jī)制
一個 Kubernetes 集群由一組被稱作節(jié)點(diǎn)的機(jī)器組成。這些節(jié)點(diǎn)上運(yùn)行 Kubernetes所管理的容器化應(yīng)用。集群具有至少一個工作節(jié)點(diǎn)。
工作節(jié)點(diǎn)托管作為應(yīng)用負(fù)載的組件的 Pod ??刂破矫婀芾砑褐械墓ぷ鞴?jié)點(diǎn)和 Pod 。為集群提供故障轉(zhuǎn)移和高可用性,這些控制平面一般跨多主機(jī)運(yùn)行,集群跨多個節(jié)點(diǎn)運(yùn)行。
k8s運(yùn)行機(jī)制
API server
API server 的核心功能是提供k8s各類資源對象(如Pod、RC、Service)的增刪改查及Watch等HTTP REST接口,成為集群內(nèi)各個功能模塊之間數(shù)據(jù)交互和通信的中心樞紐,是整個集群的數(shù)據(jù)總線和數(shù)據(jù)中心。 通常還具有以下功能。
- 集群管理的API入口
- 資源配額控制的入口
- 提供了完備的集群安全機(jī)制。
通常我們會通過kubectl命令與API server進(jìn)行交互,提供restful API,所以說也可以通過代碼方式直接調(diào)用k8s的API server。
apiserver架構(gòu)圖
controller-manager
controller-manager 作為集群內(nèi)部的管理控制中心,負(fù)責(zé)集群內(nèi)部的Node、Pod、Endpoint、Namespace、ServiceAccount、ResourceQuota等的管理,意為控制器。
新版本replication controller 被ReplicaSet替代。
controller manager
從邏輯上講,每個控制器都是一個單獨(dú)的進(jìn)程, 但是為了降低復(fù)雜性,它們都被編譯到同一個可執(zhí)行文件,并在一個進(jìn)程中運(yùn)行。
每個controller通過API server 提供的接口實(shí)時監(jiān)控著集群里每個資源對象的狀態(tài),當(dāng)發(fā)生各種故障導(dǎo)致系統(tǒng)狀態(tài)發(fā)生變化,會嘗試著將系統(tǒng)從“現(xiàn)有狀態(tài)”修正到“期望狀態(tài)”。
以下為一些控制器的作用
- 節(jié)點(diǎn)控制器(Node Controller): 負(fù)責(zé)在節(jié)點(diǎn)出現(xiàn)故障時進(jìn)行通知和響應(yīng) 。
- 端點(diǎn)控制器(Endpoints Controller): 填充端點(diǎn)(Endpoints)對象(即加入 Service 與 Pod)。
- 服務(wù)帳戶和令牌控制器(Service Account & Token Controllers): 為新的命名空間創(chuàng)建默認(rèn)帳戶和 API 訪問令牌。
scheduler
kube-scheduler意為調(diào)度器,在集群承擔(dān)了"承上啟下"的重要功能,“承上”指的是它負(fù)責(zé)接收 Controller -manager創(chuàng)建的新Pod。為其安排一個可以安置的node;“啟下”指的是安置完成之后,目前Node上的kubelet服務(wù)進(jìn)程接管后繼續(xù)工作,負(fù)責(zé)Pod生命周期中的下半生。
具體來說,Kubernetes Scheduler的作用是將待調(diào)度的Pod(API新創(chuàng)建的Pod、Controller Manager為補(bǔ)足副本而創(chuàng)建的Pod等)按照特定的調(diào)度算法和調(diào)度策略綁定(Binding)到集群中某個合適的Node上,并將綁定信息寫入etcd中。在整個調(diào)度過程中涉及三個對象,分別是待調(diào)度Pod列表、可用Node列表,以及調(diào)度算法和策略。簡單地說,就是通過調(diào)度算法調(diào)度為待調(diào)度Pod列表中的每個Pod從Node列表中選擇一個最適合的Node。
scheduler運(yùn)行機(jī)制
kubelet
一個在集群中每個節(jié)點(diǎn)(node)上運(yùn)行的代理。 它保證容器(containers)都 運(yùn)行在 Pod 中。
kubelet 接收一組通過各類機(jī)制提供給它的 PodSpecs,確保這些 PodSpecs 中描述的容器處于運(yùn)行狀態(tài)且健康。
kube-proxy
kube-proxy 是集群中每個節(jié)點(diǎn)上運(yùn)行的網(wǎng)絡(luò)代理, 實(shí)現(xiàn) Kubernetes 服務(wù)(Service) 概念的一部分。
kube-proxy 維護(hù)節(jié)點(diǎn)上的網(wǎng)絡(luò)規(guī)則。這些網(wǎng)絡(luò)規(guī)則允許從集群內(nèi)部或外部的網(wǎng)絡(luò)會話與 Pod 進(jìn)行網(wǎng)絡(luò)通信。
如果操作系統(tǒng)提供了數(shù)據(jù)包過濾層并可用的話,kube-proxy 會通過它來實(shí)現(xiàn)網(wǎng)絡(luò)規(guī)則。否則, kube-proxy 僅轉(zhuǎn)發(fā)流量本身
這里介紹一下 RC RSDeployment的區(qū)別
- replicationController POD管理控制器 老版本使用
- replicaset 新版本的POD控制器,替代RC 支持集合式的selector:(version in (v1.0, v2.0)或env notin (dev, qa))
- Deployment 聲明式的pod部署方式 支持rolling update,Deployment為Pod和ReplicaSet提供聲明式更新。
你只需要在Deployment中描述你想要的目標(biāo)狀態(tài)是什么,Deployment controller就會幫你將Pod和Replica
Set的實(shí)際狀態(tài)改變到你的目標(biāo)狀態(tài)。你可以定義一個全新的Deployment,也可以創(chuàng)建一個新的替換舊的Deployment