淺析Kubernetes的工做原理

本文來自網易雲社區git


先放一張Kubernetes的架構圖:github




總體來看,是一個老大,多個幹活的這種結構,基本上全部的分佈式系統都是這樣,可是裏面的組件名稱就紛繁複雜,下面將一一解析。後端


一、元數據存儲與集羣維護api

做爲一個集羣系統,總要有一個統一的地方維護整個集羣以及任務的元數據。並且做爲集羣系統的控制節點,爲了高可用性,每每存在多個Master,在多個Master中間,總要有一個Leader。服務器

在Kubernetes裏面,統一的存儲使用etcd來保存,Leader的選舉也是經過etcd進行,於是有apiserver有參數--etcd-servers,controller和scheduler都有參數--master string指向apiserver,而且有參數--leader-elect選舉出Leader,也會有熟悉的--address ip。網絡


二、API層與命令行架構

做爲一個分佈式系統,每一層都會有本身的API,可是對外每每須要一個統一的API接口層,通常除了酷酷的界面以外,爲了自動化,每每會有一個命令行能夠執行操做,其實命令裏面封裝的也是對API的調用。負載均衡

對於Kubernetes,API層是一個單獨的進程apiserver提供,認證和鑑權也是在這一層實現的,全部對於kubernetes的管理平臺的訪問都是經過apiserver這一層進行的。運維

對於命令行,kubernetes是kubectl,經過向apiserver調用執行操做,例如pod,service,deployment等。Kubernetes也有本身的相似package的管理,Kubernetes Helm,可是命令就變成了helm了。分佈式


三、調度

當運行一個容器的時候,放在哪臺節點上,這個過程是調度。對於Kubernetes,調度是由一個單獨的進程scheduler負責的。

Kubernetes也支持經過對Node設置Label,從而將pod放在某些節點上。另外kubernetes還有NodeAffinity:

  • RequiredDuringSchedulingRequiredDuringExecution:在調度的時候必須部署到某些節點,運行期若是條件不知足則從新調度

  • RequiredDuringSchedulingIgnoredDuringExecution :在調度的時候必須部署到某些節點,運行期就算了。

  • PreferredDuringSchedulingIgnoredDuringExecution :在調度的時候最好部署到某些節點,運行期就算了。


四、副本與彈性伸縮

容器若是部署無狀態服務,一個好處就是能夠多副本,而且能夠彈性伸縮。

在Kubernetes裏面,副本數目是以pod爲單位的,由controller進程控制,能夠經過建立一個Deployment來控制副本數。

Kubernetes也能夠實現autoscaling。有一個組件Horizontal Pod Autoscaling,能夠經過監控CPU的使用狀況動態調整Pod的數量。


五、編排

爲了可以經過編排文件一鍵建立整個應用,須要有編排功能。Kubernetes的編排是基於yml文件。


六、服務發現與DNS

容器平臺的一個重要的功能是服務發現,也即當容器的地址改變的時候,能夠自動進行服務之間的關聯。

通常的服務發現首先要經過DNS將服務名和應用關聯起來,能夠基於DNS對一個服務的多個應用進行內部負載均衡,也有直接加一個內部負載均衡器來作這件事情。

Kubernetes的DNS組件是經過skyDNS實現的,負載均衡是經過將DNS轉化爲VIP,有個內置的負載均衡器kube-proxy來完成這件事情。


七、容器

Kubernetes支持Docker、RKT等多種容器格式。


八、網絡

容器的網絡配置有Docker Libnetwork Container Network Model(CNM)和Container Network Interface(CNI)兩個陣營。Docker Libnetwork的優點就是原生,並且和Docker容器生命週期結合緊密;缺點也能夠理解爲是原生,被Docker「綁架」。Kubernetes屬於CNI陣營,CNI的優點是兼容其餘容器技術(e.g. rkt)及上層編排系統(Kuberneres & Mesos),並且社區活躍勢頭迅猛,缺點是非Docker原生。


九、存儲

Kubernetes能夠建立Persistent Volumes,支持GCE,AWS,NFS,GlusterFS,Ceph等。


十、監控

容器的監控中Prometheus +cadvisor是主流的方案,而cadvisor來自Kubernetes的一個組件。


十一、大數據與包管理

在kubernetes裏面部署大數據能夠參考https://github.com/kubernetes/examples


十二、負載均衡

這裏的負載均衡指的是外部負載均衡。在kubernetes中,外部負載均衡器是經過一個ingress controller根據請求進行建立,若是在雲平臺例如GCE,可建立雲平臺的負載均衡器,雲平臺的負載均衡器可經過NodePort鏈接到後端的Service。


1三、節點

kubernetes的Node上跑的是kubelet。


1四、升級與回滾

全部的容器平臺對於容器多副本的升級所有都是要滾動升級,在Kubernetes裏面,一樣有對rolling update的支持。


網易雲從2015下半年開始向Kubernetes社區投入,是國內最先的Kubernetes實踐者和貢獻者,也是Kubernetes技術的積極佈道者。網易雲基於Kubernetes的容器服務爲用戶提供了無服務器容器,讓企業可以快速部署業務,輕鬆運維服務。容器服務支持彈性伸縮、垂直擴容、灰度升級、服務發現、服務編排、錯誤恢復及性能監測等功能。點擊可免費試用

相關文章
相關標籤/搜索