1.docker的三種編排工具node
Docker的第一類編排工具:nginx
a.docker compose(docker原生):只能對一個主機上的容器進行編排,沒法編排多個主機上的容器;git
b.docker swarm(docker原生):能夠對多個主機上的容器進行編排;github
c.docker machine(docker原生):能夠將一個主機迅速初始化到docker swarm集羣裏.算法
以上三個稱爲docker三劍客docker
Docker的第二類編排工具:bash
mesos:它不是docker的編排工具,而是資源分配工具,因此mesos必需要依賴於容器編排框架marathon.服務器
Docker的第三類編排工具:網絡
kubernetes(簡稱k8s):這個容器編排工具佔據了80%以上的市場份額.架構
有了容器和容器編排技術,對持續集成(CI)、持續交付Delivery(CD)和持續部署Deployment(CD)的需求有了很大幫助,這也就是DevOps的理念,DevOps並非一種技術,而是一種運動、一種文化、一種思想.
2.k8s介紹
k8s的代碼託管在github之上:https://github.com/kubernetes/kubernetes/releases
特性:
a.能夠自動裝箱,即:能夠自動完成容器的部署,而不影響可用性; b.能夠自我修復,若是容器崩潰了,能夠1s內從新啓動,有了k8s後,咱們再也不關注個體,而是關注羣體; c.能夠自動實現水平擴展,一個容器不夠,再啓動一個; d.能夠自動實現服務發現和負載均衡,能夠自動發現每一個微服務之間的關係,也能夠自動對容器內多個服務作負載均衡; e.能夠實現自動發佈和回滾; f.能夠實現密鑰和配置管理,也就是說每一個容器不是加載容器內的配置文件,而是加載遠程服務器上(配置中心)的配置文件; g.能夠實現存儲編排; h.能夠實現任務的批量處理執行.
k8s是一個有中心節點架構的集羣,由master節點(至少三個)和nodes節點(運行容器的節點)組成,客戶的啓動容器等請求會先發給master節點,master節點有個調度器會分析node節點資源(cpu、內存)的可用狀態,找到最佳適配的node來啓動用戶請求的容器.
master上的第一個組件叫調度器(Scheduler),它的工做原理有兩步:第一步調度器先作預選,即先評估有多少個node符合容器需求;第二步調度器再作優選,即在符合的node中選擇一個最佳的node來運行容器.若是node宕機了,那麼託管在node之上的全部容器也就不見了,此時k8s能夠在其餘節點上建立出來和宕機node上如出一轍的容器.
另外,master上還有一個組件叫控制器,它會不停的Loop,用來週期性監控每一個node的健康狀態;控制器是有多個的(由於有至少三個master),master上還有一個組件叫控制器管理器(Controller-Mnager),控制器管理器用來監控每一個控制器的健康.
在k8s上運行的最小單元不是容器,而是pod.pod能夠理解爲容器外殼,pod裏面裝的就是容器.一個pod裏面能夠放多個容器,這些容器能夠共享一個底層的網絡名稱空間、存儲卷,這樣一來,pod對外更像一個虛擬機.
通常說來,一個pod裏只放一個容器;若是一個pod必需要放多個容器,那麼裏面有一個是主容器,其餘都是輔助容器,輔助容器主要是爲了輔助主容器的主程序的某些功能而設置的.
一個pod裏面的全部容器只能運行在一個node上,最終用戶無需再關注pod運行在哪一個node之上,這也就是雲的概念,也就是把不少的node作爲一個資源池,來進行統一管理.pod儘可能由控制器管理,而不要手工管理.
3.pod能夠分爲兩類
a.自主式pod:即自我管理的pod.建立Pod,首先交給Apiserver,而後調度器調度給指定的node節點.若是容器須要啓動,由node上kubelet組件來完成;若是node發生故障,那麼pod也就消失了.
b.控制器管理的Pod(建議建立這種Pod):這種Pod是有生命週期的對象.由master上的調度器將pod調度至某node進行運行或者中止,Replica Set(副本集控制器),可是該控制器並不直接使用,而是使用一個聲明更新的控制器Deployment,這個也是用的最多的,Deployment控制器只能管理那些無狀態的應用;有狀態的應用是由Stateful Set控制器管理.
對於Deployment控制器,它還支持二級控制器,叫HPA(horizontalPodAutoscaler),該控制器能夠自動水平擴展pod,也就是當一個pod壓力大時,HPA控制器會自動水平擴展加幾個新的pod來分解壓力,具體加幾個,HPA會根據當前節點的cpu、內存負荷來計算,一旦訪問量小了,HPA還會自動減小pod個數;
若是咱們想在一個Node上只運行一個副本,須要用DaemonSet控制器;
若是須要運行做業(如備份、清理數據等),須要conjob控制器.以上所講的都是pod的控制器,用來管理不一樣類型的pod.
4.service
標籤選擇器(Lablel Selector)組件:是一個根據標籤來過濾符合要求的資源機制,給pod打上標籤(Lablel),能夠實現分組效果.
客戶端是經過service來找到pod的,service是經過pod的標籤選擇器來找到pod的.
service只是一個iptables方式的net地址轉換路由規則,到了1.11版本,支持了ipvs方式的分發規則,支持各類調度算法,這也就實現了負載均衡,裝完k8s,須要建立一個DNS pod,這是由於service的名字須要DNS服務器來解析,這種pod是k8s的組成部分,被稱爲k8s基礎架構的pod,也被稱爲k8s的附件,英文名叫AddOns.這種DNS是用來解析service名字的,而不是pod的,DNS名稱解析是K8s自動維護的,不須要人工干預.
一句話:service裏面的地址存在於iptables net或者ipvs中,service是用來調度流量的,而不會啓動或者中止容器.
pod的啓動或者關閉、建立等是由控制器來作的,好比建立一個nginx pod,就得先建立一個nginx控制器,nginx控制器就會自動幫咱們建立nginx pod;而後再建立一個nginx service,把nginx pod發佈出去.
service有兩種類型:一種是調度流量僅供k8s內部使用;另一種則調度流量供k8s外部使用.
service是用來分發流量給pod,控制器是用來建立、啓動和中止pod,標籤選擇器是讓service根據標籤來識別每一個pod的.
5.網絡
在k8s中,須要三種網絡
a.各pod在一個網絡中; b.service在另一個網絡,即service的地址和pod的地址是不一樣網段的, pod的地址是配置在pod內部的網絡名稱空間,是能夠ping通的, 但service的地址是虛擬的,是假地址,只存在於iptables或者ipvs中. c.node又存在於另一個網絡. 因此外部先到達node網絡,而後再到service網絡,最後纔到pod網絡.
pod之間怎麼通訊呢?同一個pod內的多個容器經過lo進行通訊;
各pod之間經過overlay network(疊加網絡)進行通訊,即便pod之間跨主機,通訊也沒問題;
pod與service之間經過網關(也就是docker 零橋的地址)進行通訊.
node上有個組件叫kube-proxy,它負責和ApiServer進行通訊,kube-proxy一旦發現service背後的pod地址發生變化,就會改變service在ipvs中的pod地址,因此service的管理是靠kube-proxy來實現的.
kubelet--node上用於和master通訊的一個組件,試圖啓動node上的容器,啓動容器是由容器引擎來操做的,最流行的容器引擎是docker.
6.通訊簡介
在master(master是有多個的)上的數據並不存在master本地,而是存在共享存儲DB中,這個共享DB叫etcd.etcd的數據以key-value形式存儲,集羣中全部狀態信息都在etcd中,因此ectd要作冗餘,通常至少三個節點,etcd經過https方式訪問,etcd有一個端口用於集羣內部通訊(也就是和其它etcd通訊),還有一個端口用於對ApiServer通訊,因此etcd內部通信須要點對點的專門證書,對ApiServer通訊須要另一套證書;ApiServer向客戶端提供服務,須要一套證書;ApiServer和node上的kubelet組件和kube-proxy組件通訊也須要CA證書,因此作K8s的部署,須要創建5個CA,這個比較考驗功底.
把k8s歸爲如下三類節點:master、node(部署pod)和ectd(存儲集羣狀態信息),彼此經過http或https進行通訊,網絡分爲:pod網絡、service網絡和node網絡.因此須要構建出三類網絡,可是K8s本身不提供這三類網絡,依賴於第三方插件CNI.
k8s經過CNI(容器網絡接口)插件體系接入網絡.目前常見的CNI插件是flannel,其實網絡用於提供兩個功能:一個是給pod、service等提供ip地址;另外就是提供網絡測試的功能,來隔離不一樣Pod之間的通訊.
flannel插件只支持網絡配置(供ip地址的功能),不支持網絡策略,CNI插件中的calico能夠同時支持網絡配置和網絡策略,可是calico的部署和使用門檻比較高,因而,又有了第三個CNI插件canel,它用flannel提供網絡配置,用calico提供網絡策略.這些插件能夠做爲k8s之上的守護進程運行,也能夠在k8s裏面的容器運行.
名稱空間--能夠將不一樣種類的pod運行在不一樣的名稱空間中.好比能夠把名稱空間分爲開發名稱空間、測試名稱空間等,能夠經過網絡策略來定義名稱空間之間、同一個名稱空間的pod之間的網絡行爲.
參考博客:http://blog.itpub.net/28916011/viewspace-2213456/