一、Master 組件
-
API server
1、提供集群管理的 REST API 接口,包括認(rèn)證授權(quán)、數(shù)據(jù)校驗(yàn)以及集群狀態(tài)變更等提供其他模塊之間的數(shù)據(jù)交互和通信的樞紐(其他模塊通過 API Server 查詢或修改數(shù)據(jù),只有 API Server 才直接操作 etcd)。維護(hù)的REST對象持久化到Etcd中存儲(chǔ)。
2、通常通過 kubectl 來訪問 apiserver,也可以通過 Kubernetes 各個(gè)語言的 client 庫來訪問 apiserver。
-
etcd
1、 etcd 用于 Kubernetes 的后端存儲(chǔ)。所有集群數(shù)據(jù)都存儲(chǔ)在此處,始終為您的 Kubernetes 集群的 etcd 數(shù)據(jù)提供備份計(jì)劃。
2、 通過api server與etcd聯(lián)系得知如何訪問組件,包括創(chuàng)建好的RC,里面有幾個(gè)Pod,有幾個(gè)copy,每個(gè)copy的ip地址都會(huì)存放到數(shù)據(jù)庫中
-
kube scheduler
1、kube-scheduler 負(fù)責(zé)分配調(diào)度 Pod 到集群內(nèi)的節(jié)點(diǎn)上,它監(jiān)聽 kube-apiserver,查詢還未分配 Node 的 Pod,然后根據(jù)調(diào)度策略為這些 Pod 分配節(jié)點(diǎn)(更新 Pod 的 NodeName 字段)
調(diào)度器需要充分考慮諸多的因素:
1 公平調(diào)度
2 資源高效利用
3 QoS
4 affinity 和 anti-affinity
5 數(shù)據(jù)本地化(data locality)
6 內(nèi)部負(fù)載干擾(inter-workload interference)
7 deadlines
-
kube controller manager
1、Node Controller管理維護(hù)Node,定期檢查Node的健康狀態(tài),標(biāo)識出(失效|未失效)的Node節(jié)點(diǎn)。
2、Replication Controller負(fù)責(zé)維護(hù)系統(tǒng)中每個(gè)副本控制器對象正確數(shù)量的 Pod。管理維護(hù)Replication Controller,關(guān)聯(lián)Replication Controller和Pod,保證Replication Controller定義的副本數(shù)量與實(shí)際運(yùn)行Pod數(shù)量一致。新版本的 Kubernetes 中建議使用 ReplicaSet(也簡稱為 rs)來取代ReplicationController
3、EndPoints Controller管理維護(hù)Endpoints,關(guān)聯(lián)Service和Pod,創(chuàng)建Endpoints為Service的后端,當(dāng)Pod發(fā)生變化時(shí)實(shí)時(shí)更新Endpoints。
4、Namespace Controller 管理維護(hù)Namespace,定期清理無效的Namespace,包括Namesapce下的API對象,比如Pod、Service等。
5、Service Account & Token Controllers為新的命名空間創(chuàng)建默認(rèn)帳戶和 API 訪問令牌
6、Service Controller管理維護(hù)Service,提供負(fù)載以及服務(wù)代理。
7、DeploymentController管理維護(hù)Deployment,關(guān)聯(lián)Deployment和Replication Controller,保證運(yùn)行指定數(shù)量的Pod。當(dāng)Deployment更新時(shí),控制實(shí)現(xiàn)Replication Controller和 Pod的更新。
8、Job Controller 管理維護(hù)Job,為Jod創(chuàng)建一次性任務(wù)Pod,保證完成Job指定完成的任務(wù)數(shù)目
9、Pod Autoscaler Controller 實(shí)現(xiàn)Pod的自動(dòng)伸縮,定時(shí)獲取監(jiān)控?cái)?shù)據(jù),進(jìn)行策略匹配,當(dāng)滿足條件時(shí)執(zhí)行Pod的伸縮動(dòng)作。
-
ADDONS(插件)----> DNS
雖然其他插件并不是必需的,但所有 Kubernetes 集群都應(yīng)該具有Cluster DNS,許多示例依賴于它。
Cluster DNS 是一個(gè) DNS 服務(wù)器,和您部署環(huán)境中的其他 DNS 服務(wù)器一起工作,為 Kubernetes 服務(wù)提供DNS記錄。
Kubernetes 啟動(dòng)的容器自動(dòng)將 DNS 服務(wù)器包含在 DNS 搜索中。
二、Node 組件
-
kubelet
每個(gè)節(jié)點(diǎn)上都運(yùn)行一個(gè) kubelet 服務(wù)進(jìn)程,默認(rèn)監(jiān)聽 10250 端口,接收并執(zhí)行 master 發(fā)來的指令,管理 Pod 及 Pod 中的容器。每個(gè) kubelet 進(jìn)程會(huì)在 API Server 上注冊節(jié)點(diǎn)自身信息,定期向 master 節(jié)點(diǎn)匯報(bào)節(jié)點(diǎn)的資源使用情況,并通過 cAdvisor 監(jiān)控節(jié)點(diǎn)和容器的資源
提供如下功能:
1 掛載 Pod 所需要的數(shù)據(jù)卷(Volume)。
2 下載 Pod 的 secrets。
3 通過 Docker 運(yùn)行(或通過 rkt)運(yùn)行 Pod 的容器。
4 周期性的對容器生命周期進(jìn)行探測。
5 如果需要,通過創(chuàng)建 鏡像 Pod(Mirror Pod) 將 Pod 的狀態(tài)報(bào)告回系
統(tǒng)的其余部分。
6 將節(jié)點(diǎn)的狀態(tài)報(bào)告回系統(tǒng)的其余部分。
-
kube-proxy
每臺(tái)機(jī)器上都運(yùn)行一個(gè) kube-proxy 服務(wù),它監(jiān)聽 API server 中 service 和 endpoint 的變化情況,并通過 iptables 等來為服務(wù)配置負(fù)載均衡(僅支持 TCP 和 UDP)。 通過維護(hù)主機(jī)上的網(wǎng)絡(luò)規(guī)則并執(zhí)行連接轉(zhuǎn)發(fā),實(shí)現(xiàn)了Kubernetes服務(wù)抽象。
kube-proxy 當(dāng)前支持一下幾種實(shí)現(xiàn)
1 userspace:最早的負(fù)載均衡方案,它在用戶空間監(jiān)聽一個(gè)端口,所有服務(wù)通過 iptables 轉(zhuǎn)發(fā)到這個(gè)端口,然后在其內(nèi)部負(fù)載均衡到實(shí)際的 Pod。該方式最主要的問題是效率低,有明顯的性能瓶頸。
2 iptables:目前推薦的方案,完全以 iptables 規(guī)則的方式來實(shí)現(xiàn) service 負(fù)載均衡。該方式最主要的問題是在服務(wù)多的時(shí)候產(chǎn)生太多的 iptables 規(guī)則,非增量式更新會(huì)引入一定的時(shí)延,大規(guī)模情況下有明顯的性能問題。kube-proxy只負(fù)責(zé)生成相應(yīng)的Iptables規(guī)則。
3 ipvs:為解決 iptables 模式的性能問題,v1.11 新增了 ipvs 模式(v1.8 開始支持測試版,并在 v1.11 GA),采用增量式更新,并可以保證 service 更新期間連接保持不斷開
4 winuserspace:同 userspace,但僅工作在 windows 節(jié)點(diǎn)上
iptables模式圖

-
docker
Docker 用于運(yùn)行容器 ----》點(diǎn)擊參考docker命令
-
supervisord
supervisord 是一個(gè)輕量級的進(jìn)程監(jiān)控系統(tǒng),可以用來保證 kubelet 和 docker 運(yùn)行。
-
fluentd
fluentd 是一個(gè)守護(hù)進(jìn)程,它有助于提供集群層面日志 集群層面的日志。
三、資源對象
-
Autoscaling
Horizontal Pod Autoscaling (HPA) 可以根據(jù) CPU 使用率或應(yīng)用自定義 metrics 自動(dòng)擴(kuò)展 Pod 數(shù)量(支持 replication controller、deployment 和 replica set )。
-
Deployment
Deployment為 Pod 和 ReplicaSet 提供了一個(gè)聲明式定義 (declarative) 方法,用來替代以前的 ReplicationController 來方便的管理應(yīng)用。
-
Namespace
Namespace 是對一組資源和對象的抽象集合,比如可以用來將系統(tǒng)內(nèi)部的對象劃分為不同的項(xiàng)目組或用戶組。常見的 pod, service, replication controller 和 deployment 等都是屬于某一個(gè) namespace 的(默認(rèn)是 default),而 node, persistent volume,namespace 等資源則不屬于任何 namespace。
-
ReplicaSet
ReplicationController(也簡稱為 rc)用來確保容器應(yīng)用的副本數(shù)始終保持在用戶定義的副本數(shù),即如果有容器異常退出,會(huì)自動(dòng)創(chuàng)建新的 Pod 來替代;而異常多出來的容器也會(huì)自動(dòng)回收。ReplicationController 的典型應(yīng)用場景包括確保健康 Pod 的數(shù)量、彈性伸縮、滾動(dòng)升級以及應(yīng)用多版本發(fā)布跟蹤等。在新版本的 Kubernetes 中建議使用 ReplicaSet(也簡稱為 rs)來取代 ReplicationController。ReplicaSet 跟 ReplicationController 沒有本質(zhì)的不同,只是名字不一樣,并且 ReplicaSet 支持集合式的 selector(ReplicationController 僅支持等式)。雖然也 ReplicaSet 可以獨(dú)立使用,但建議使用 Deployment 來自動(dòng)管理 ReplicaSet,這樣就無需擔(dān)心跟其他機(jī)制的不兼容問題(比如 ReplicaSet 不支持 rolling-update 但 Deployment 支持),并且還支持版本記錄、回滾、暫停升級等高級特性。Deployment 的詳細(xì)介紹和使用方法見 這里。
-
Secret
Secret 解決了密碼、token、密鑰等敏感數(shù)據(jù)的配置問題,而不需要把這些敏感數(shù)據(jù)暴露到鏡像或者 Pod Spec 中。Secret 可以以 Volume 或者環(huán)境變量的方式使用。
-
Volume
我們知道默認(rèn)情況下容器的數(shù)據(jù)都是非持久化的,在容器消亡以后數(shù)據(jù)也跟著丟失,所以 Docker 提供了 Volume 機(jī)制以便將數(shù)據(jù)持久化存儲(chǔ)。類似的,Kubernetes 提供了更強(qiáng)大的 Volume 機(jī)制和豐富的插件,解決了容器數(shù)據(jù)持久化和容器間共享數(shù)據(jù)的問題。與 Docker 不同,Kubernetes Volume 的生命周期與 Pod 綁定,容器掛掉后 Kubelet 再次重啟容器時(shí),Volume 的數(shù)據(jù)依然還在,而 Pod 刪除時(shí),Volume 才會(huì)清理。數(shù)據(jù)是否丟失取決于具體的 Volume 類型,比如 emptyDir 的數(shù)據(jù)會(huì)丟失,而 PV 的數(shù)據(jù)則不會(huì)丟
-
Service
Kubernetes 在設(shè)計(jì)之初就充分考慮了針對容器的服務(wù)發(fā)現(xiàn)與負(fù)載均衡機(jī)制,提供了 Service 資源,并通過 kube-proxy 配合 cloud provider 來適應(yīng)不同的應(yīng)用場景。隨著 kubernetes 用戶的激增,用戶場景的不斷豐富,又產(chǎn)生了一些新的負(fù)載均衡機(jī)制。目前,kubernetes 中的負(fù)載均衡大致可以分為以下幾種機(jī)制,每種機(jī)制都有其特定的應(yīng)用場景:
主要有四種
1 Service:直接用 Service 提供 cluster 內(nèi)部的負(fù)載均衡,并借助 cloud provider 提供的 LB 提供外部訪問
2 Ingress Controller:還是用 Service 提供 cluster 內(nèi)部的負(fù)載均衡,但是通過自定義 Ingress Controller 提供外部訪問
3 Service Load Balancer:把 load balancer 直接跑在容器中,實(shí)現(xiàn) Bare Metal 的 Service Load Balancer
4 Custom Load Balancer:自定義負(fù)載均衡,并替代 kube-proxy,一般在物理部署 Kubernetes 時(shí)使用,方便接入公司已有的外部服務(wù)
-
StatefulSet
StatefulSet 是為了解決有狀態(tài)服務(wù)的問題(對應(yīng) Deployments 和 ReplicaSets 是為無狀態(tài)服務(wù)而設(shè)計(jì))
其應(yīng)用場景包括
1穩(wěn)定的持久化存儲(chǔ),即 Pod 重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù),基于 PVC 來實(shí)現(xiàn)
2 穩(wěn)定的網(wǎng)絡(luò)標(biāo)志,即 Pod 重新調(diào)度后其 PodName 和 HostName 不變,基于 Headless Service(即沒有 Cluster IP 的 Service)來實(shí)現(xiàn)
3 有序部署,有序擴(kuò)展,即 Pod 是有順序的,在部署或者擴(kuò)展的時(shí)候要依據(jù)定義的順序依次依序進(jìn)行(即從 0 到 N-1,在下一個(gè) Pod 運(yùn)行之前所有之前的 Pod 必須都是 Running 和 Ready 狀態(tài)),基于 init containers 來實(shí)現(xiàn)
4 有序收縮,有序刪除(即從 N-1 到 0)
-
PersistentVolume
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供網(wǎng)絡(luò)存儲(chǔ)資源,而 PVC 請求存儲(chǔ)資源。這樣,設(shè)置持久化的工作流包括配置底層文件系統(tǒng)或者云數(shù)據(jù)卷、創(chuàng)建持久性數(shù)據(jù)卷、最后創(chuàng)建 PVC 來將 Pod 跟數(shù)據(jù)卷關(guān)聯(lián)起來。PV 和 PVC 可以將 pod 和數(shù)據(jù)卷解耦,pod 不需要知道確切的文件系統(tǒng)或者支持它的持久化引擎。
-
DaemonSet
DaemonSet 保證在每個(gè) Node 上都運(yùn)行一個(gè)容器副本,常用來部署一些集群的日志、監(jiān)控或者其他系統(tǒng)管理應(yīng)用。典型的應(yīng)用包括:
日志收集,比如 fluentd,logstash 等
系統(tǒng)監(jiān)控,比如 Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等
系統(tǒng)程序,比如 kube-proxy, kube-dns, glusterd, ceph 等