Kubernetes 能夠管理大規模的集羣,使集羣中的每個節點彼此鏈接,可以像控制一臺單一的計算機同樣控制整個集羣。html
集羣的節點有兩種角色,一種是 master ,一種是 worker。算法
ETCD 做爲存儲的組件,負責存儲k8s 的全部相關信息。docker
Scheduler 負責集羣相關資源的調配,經過一系列的算法(預選、優選策略),調度某一個應用具體要運行在哪個節點上。後端
ControllerManager 負責全部應用的控制,譬如應用的多副本控制。網絡
ApiServer 是負責集羣的通訊,ETCD,Scheduler,ControllerManager 之間的通訊都是經過該組件,是操做 kubernetes 的惟一入口。架構
當咱們擁有一個 Kubernetes 集羣后,就能夠在上面跑咱們的應用了,前提是咱們的應用必須支持在 docker 中運行,也就是咱們要事先準備好docker鏡像。負載均衡
有了鏡像以後,通常咱們會經過Kubernetes的 Deployment 的配置文件去描述應用,好比應用叫什麼名字、使用的鏡像名字、要運行幾個實例、須要多少的內存資源、cpu 資源等等。學習
有了配置文件就能夠經過Kubernetes提供的命令行客戶端 - kubectl 去管理這個應用了。kubectl 會跟 Kubernetes 的 master 經過RestAPI通訊,最終完成應用的管理。建立應用以後,就由 Kubernetes 來保證咱們的應用處於運行狀態,當某個實例運行失敗了或者運行着應用的 Node 忽然宕機了,Kubernetes 會自動發現並在新的 Node 上調度一個新的實例,保證咱們的應用始終達到咱們預期的結果。spa
出於易用性、靈活性、穩定性等的考慮,Kubernetes 提出了一個叫作 Pod 的概念,做爲 Kubernetes 的最小調度單位。咱們的應用在每一個 Node 上運行的實際上是一個 Pod。Pod 也只能運行在 Node 上。命令行
那麼什麼是 Pod 呢?Pod 是一組容器(固然也能夠只有一個)。容器自己就是一個小盒子了,Pod 至關於在容器上又包了一層小盒子。這個盒子裏面的容器有什麼特色呢?
其中的 Pause 容器
至於這樣設計的好處呢,仍是要你們深刻學習後慢慢體會啦~
kubernetes 官方如今已經弱化了 ReplicaSet 的概念,在實際的操做,咱們通常不會接觸到 ReplicaSet,但 Pod 的實際管理是由ReplicaSet負責的。
上面的 Deployment 建立了,Pod 也運行起來了。如何才能訪問到咱們的應用呢?
最直接想到的方法就是直接經過 Pod-ip+port 去訪問,但若是實例數不少呢?好,拿到全部的 Pod-ip 列表,配置到負載均衡器中,輪詢訪問。但上面咱們說過,Pod 可能會死掉,甚至 Pod 所在的 Node 也可能宕機,Kubernetes 會自動幫咱們從新建立新的Pod。再者每次更新服務的時候也會重建 Pod。而每一個 Pod 都有本身的 ip。因此 Pod 的ip 是不穩定的,會常常變化的。
面對這種變化咱們就要藉助另外一個概念:Service。它就是來專門解決這個問題的。無論Deployment的Pod有多少個,無論它是更新、銷燬仍是重建,Service老是能發現並維護好它的ip列表。Service對外也提供了多種入口:
好,看似服務訪問的問題解決了。但你們有沒有想過,Service是如何知道它負責哪些 Pod 呢?是如何跟蹤這些 Pod 變化的?
最容易想到的方法是使用 Deployment 的名字。一個 Service 對應一個 Deployment 。固然這樣確實能夠實現。但k ubernetes 使用了一個更加靈活、通用的設計 - Label 標籤,經過給 Pod 打標籤,Service 能夠只負責一個 Deployment 的 Pod 也能夠負責多個 Deployment 的 Pod 了。Deployment 和 Service 就能夠經過 Label 解耦了。
滾動升級是Kubernetes中最典型的服務升級方案,主要思路是一邊增長新版本應用的實例數,一邊減小舊版本應用的實例數,直到新版本的實例數達到預期,舊版本的實例數減小爲0,滾動升級結束。在整個升級過程當中,服務一直處於可用狀態。而且能夠在任意時刻回滾到舊版本。