說到容器化就免不了說Docker, 毫無疑問,DocKer成了近些年來最火熱燎孟,甚至最具顛覆性的技術(shù)之一。百度Docker,看到Docker官網(wǎng)幾個(gè)醒目的大字“Build, Ship, and Run Any App, Anywhere”涤姊,由此我們想到上世紀(jì)90年代Java發(fā)布的時(shí)候疹瘦,每一家公司都表示了極大的興趣,直到他們意識(shí)到Java實(shí)際上對(duì)他們自有的平臺(tái)其實(shí)是一種巨大威脅噩翠。Java的愿景是“Write Once戏自,Run Anywhere”, 而Docker提出了“Build once绎秒,Run anywhere浦妄,Configure once,Run anything”见芹。很大程度上剂娄,二者都對(duì)某些公司形成了潛在的威脅。盡管我們目前還看不到具體的一些公司針對(duì)可能的威脅采取的應(yīng)對(duì)措施玄呛,但未來是誰也無法保證類似Java或VMware的歷史不會(huì)重演阅懦。
Docker技術(shù)的簡(jiǎn)要綜述:
Docker利用了一些Linux核心工具,比如cGruops徘铝、Namespace耳胎、SELinux和AUFS等技術(shù),對(duì)進(jìn)程進(jìn)行封裝隔離惕它。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程怕午,因此也稱其為容器。起初Docker只是LXC容器管理子系統(tǒng)的前端淹魄,但它在0.9版本中引入了libcontainer郁惜,從 1.11 開始,則進(jìn)一步演進(jìn)為使用runC和containerd甲锡。
Docker 在容器的基礎(chǔ)上兆蕉,進(jìn)行了進(jìn)一步的封裝羽戒,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等等虎韵,極大的簡(jiǎn)化了容器的創(chuàng)建和維護(hù)易稠。使得 Docker 技術(shù)比虛擬機(jī)技術(shù)更為輕便、快捷包蓝。
Docker和虛擬機(jī)對(duì)比
虛擬機(jī):
簡(jiǎn)單說虛擬機(jī)(VM)是將一臺(tái)服務(wù)器變成多臺(tái)服務(wù)器的物理硬件的抽象驶社。管理程序允許多臺(tái)虛擬機(jī)在單臺(tái)機(jī)器上運(yùn)行。每個(gè)VM都包含一個(gè)操作系統(tǒng)的完整副本养晋,一個(gè)或多個(gè)應(yīng)用程序衬吆,必需的二進(jìn)制文件和庫(kù) - 占用的空間很大。VM啟動(dòng)緩慢绳泉。
Docker:
Docker使用的階段
Docker自2013年來非常火熱來榆骚,隨著需求的變化分為兩個(gè)階段
第一階段:Docker還是當(dāng)初的Docker
是Docker對(duì)一個(gè)(或一組)進(jìn)程的封裝片拍,一個(gè)容器需要綁定宿主機(jī)的端口來向宿主機(jī)之外的網(wǎng)絡(luò)提供服務(wù),為了避免端口沖突妓肢,對(duì)于需要暴露端口的容器捌省,Docker會(huì)隨機(jī)綁定一個(gè)宿主機(jī)端口,這個(gè)時(shí)候就需要服務(wù)發(fā)現(xiàn)來幫助不同機(jī)器上的服務(wù)來進(jìn)行通信了碉钠「倩海可能更適用是單一個(gè)的程序或者程序關(guān)聯(lián)性很小的應(yīng)用,隨著系統(tǒng)慢慢的龐大就會(huì)暴露出問題喊废。
第二階段:開源的容器集群管理系統(tǒng)
常見的開源容器集群管理系統(tǒng)有Kubernetes祝高,Swarm和Mesos 。隨著Docker官方宣布支持Kubernetes污筷,Kubernetes大有統(tǒng)一容器天下之勢(shì)褂策,所以我們主要講一下kubernetes。
Kubernetes是Docker生態(tài)圈里的重要一員,Google開源的容器集群管理系統(tǒng)斤寂,為容器化的應(yīng)用提供部署運(yùn)行、資源調(diào)度揪惦、服務(wù)發(fā)現(xiàn)和動(dòng)態(tài)伸縮等一系列完整功能遍搞,提高了大規(guī)模容器集群管理的便捷性。
Kubernetes優(yōu)勢(shì):
- 容器編排
- 輕量級(jí)
- 開源
- 彈性伸縮
- 負(fù)載均衡
講訴Container在kubernetes的大致過程器腋,用戶通過kubectl提交需要運(yùn)行的docker Container(pod)溪猿,apiserver負(fù)責(zé)etcd存儲(chǔ)的所有操作,且只有apiserver才直接操作etcd集群纫塌,scheduler掃描分配主機(jī)诊县,kubelet找到需要跑的Container在當(dāng)前Node中運(yùn)行,用戶提交RC描述措左,replication contorller監(jiān)視集群中的pod并保持pod數(shù)量依痊,用戶提交service描述文件,由kube proxy負(fù)責(zé)具體工作流量轉(zhuǎn)發(fā)怎披。如下圖:
一個(gè)kuberbetes集群是由分布式存儲(chǔ)(etcd)胸嘁、服務(wù)節(jié)點(diǎn)(Minion,etcd現(xiàn)在稱為Node)和控制節(jié)點(diǎn)(Master)構(gòu)成的凉逛。所有的集群狀態(tài)都保存在etcd中性宏,Master節(jié)點(diǎn)上則運(yùn)行集群的管理控制模塊。Node節(jié)點(diǎn)是真正運(yùn)行應(yīng)用容器的主機(jī)節(jié)點(diǎn)状飞,在每個(gè)Minion節(jié)點(diǎn)上都會(huì)運(yùn)行一個(gè)Kubelet代理毫胜,控制該節(jié)點(diǎn)上的容器、鏡像和存儲(chǔ)卷等诬辈。
kuberbetes組件酵使,如圖:
Pod
Pod是Kubernetes調(diào)度的基本單位,Pod 安排在節(jié)點(diǎn)上自晰,包含一組容器和卷凝化。同一個(gè)Pod里的容器共享同一個(gè)網(wǎng)絡(luò)命名空間,可以使用localhost互相通信酬荞。Pod是短暫的搓劫,不是持續(xù)性實(shí)體。
service
Service是對(duì)一組提供相同功能的Pods的抽象混巧,并為它們提供一個(gè)統(tǒng)一的入口枪向。借助Service,應(yīng)用可以方便的實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)與負(fù)載均衡咧党,并實(shí)現(xiàn)應(yīng)用的零宕機(jī)升級(jí)秘蛔。Service通過標(biāo)簽來選取服務(wù)后端,一般配合Replication Controller或者Deployment來保證后端容器的正常運(yùn)行。
Replication Controller
ReplicationController(也簡(jiǎn)稱為rc)用來確保容器應(yīng)用的副本數(shù)始終保持在用戶定義的副本數(shù)深员,即如果有容器異常退出负蠕,會(huì)自動(dòng)創(chuàng)建新的Pod來替代;而異常多出來的容器也會(huì)自動(dòng)回收倦畅。ReplicationController的典型應(yīng)用場(chǎng)景包括確保健康Pod的數(shù)量遮糖、彈性伸縮、滾動(dòng)升級(jí)以及應(yīng)用多版本發(fā)布跟蹤等叠赐。
apiserver
kube-apiserver是Kubernetes最重要的核心組件之一欲账,主要提供以下的功能
- 提供集群管理的REST API接口,包括認(rèn)證授權(quán)芭概、數(shù)據(jù)校驗(yàn)以及集群狀態(tài)變更等
- 提供其他模塊之間的數(shù)據(jù)交互和通信的樞紐(其他模塊通過API Server查詢或修改數(shù)據(jù)赛不,只有API Server才直接操作etcd)
scheduler
scheduler負(fù)責(zé)分配調(diào)度Pod到集群內(nèi)的節(jié)點(diǎn)上,它監(jiān)聽apiserver罢洲,查詢還未分配Node的Pod踢故,然后根據(jù)調(diào)度策略為這些Pod分配節(jié)點(diǎn)。
調(diào)度器需要充分考慮諸多的因素:
- 公平調(diào)度
- 資源高效利用
- 數(shù)據(jù)本地化
- 內(nèi)部負(fù)載干擾
- 服務(wù)質(zhì)量
Controller Manager
Controller Manager是Kubernetes的大腦奏路,它通過apiserver監(jiān)控整個(gè)集群的狀態(tài)畴椰,并確保集群處于預(yù)期的工作狀態(tài)。
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上注冊(cè)節(jié)點(diǎn)自身信息帚戳,定期向master節(jié)點(diǎn)匯報(bào)節(jié)點(diǎn)的資源使用情況,并通過cAdvisor監(jiān)控節(jié)點(diǎn)和容器的資源儡首。
proxy
每臺(tái)機(jī)器上都運(yùn)行一個(gè)kube-proxy服務(wù)片任,它監(jiān)聽API server中service和endpoint的變化情況,并通過iptables等來為服務(wù)配置負(fù)載均衡蔬胯。
應(yīng)用部署架構(gòu)圖:
主要講一下Gkube
容器控制程序对供,由Jenkins job通過 Execute shell 調(diào)用,主要功能是管理kubernetes集群氛濒,創(chuàng)建产场,刪除,變更舞竿,查看pod(docker)容器京景。python3.4編寫,調(diào)用kubernetes etcd glusterfs的API進(jìn)行資源管理骗奖。主要邏輯是當(dāng)job進(jìn)行調(diào)用后查詢etcd是否有該job對(duì)應(yīng)的docker信息确徙,如果有則移交給代碼更新腳本醒串,如果沒有則創(chuàng)建一個(gè)容器,并初始化部署環(huán)境鄙皇,然后發(fā)布代碼芜赌。