1.docker的三種編排工具
docker的第一類編排工具:
a.docker compose(docker原生):只能對乙個主機上的容器進行編排,無法編排多個主機上的容器;
b.docker swarm(docker原生):可以對多個主機上的容器進行編排;
c.docker machine(docker原生):可以將乙個主機迅速初始化到docker swarm集群裡.
以上三個稱為docker三劍客
docker的第二類編排工具:
mesos:它不是docker的編排工具,而是資源分配工具,所以mesos必須要依賴於容器編排框架marathon.
docker的第三類編排工具:
kubernetes(簡稱k8s):這個容器編排工具佔據了80%以上的市場份額.
有了容器和容器編排技術,對持續整合(ci)、持續交付delivery(cd)和持續部署deployment(cd)的需求有了很大幫助,這也就是devops的理念,devops並不是一種技術,而是一種運動、一種文化、一種思想.
2.k8s介紹
k8s的**託管在github之上:
特性:
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之間的網路行為.
參考部落格:
入門了解K8S
1 k8s,就是基於容器的集群管理平台,它的全稱,是kubernetes。kubernetes 是什麼?kubernetes 這個詞 於希臘語,有主管 舵手 船長的意思,我們從中能聽到一絲管理的意味,從圖示中也能看出來。乙個k8s系統,通常稱為乙個k8s集群 cluster 這個集群主要包括兩個部分...
K8S入門學習
k8s全名 kubernetes 它是乙個工具,在linux上管理應用生命週期的乙個工具。1 當你把專案部署到伺服器集群上,一台伺服器掛了,k8s它可以自動將這個伺服器上的服務排程到另乙個主機上執行。2 還有當你的專案更新了 之後,要打包重新發布,使用k8s可以做到不用中斷服務而更新發布專案。3 從...
k8s掛載目錄 K8S 入門 檔案掛載
最近在做清算,需要將清算檔案生成,後推送到遠端的ftp上。順便整理了一下檔案生成後的儲存方式。直接生成到docker容器內部。不過會隨著容器的消亡而消失 生成到儲存卷 生成到檔案伺服器 儲存卷首先需要宣告卷。volumes name log path hostpath directory locat...