Docker產(chǎn)生的原因
研發(fā)本地開(kāi)發(fā)的代碼,交付運(yùn)維部署到生產(chǎn)環(huán)境時(shí)稠茂,會(huì)由于環(huán)境、配置等各種非代碼因素的原因無(wú)法順利發(fā)布情妖,每次發(fā)版時(shí)需要浪費(fèi)人力物力去排查問(wèn)題睬关。
Docker的簡(jiǎn)介
Docker屬于容器,而容器就是將軟件打包成標(biāo)準(zhǔn)化單元毡证,以用于開(kāi)發(fā)电爹、交付和部署。以前是代碼即應(yīng)用料睛,現(xiàn)在是運(yùn)行環(huán)境丐箩、代碼,才是應(yīng)用恤煞,不會(huì)出現(xiàn)本地可以運(yùn)行屎勘,但是生產(chǎn)卻無(wú)法運(yùn)行。一次構(gòu)建處處運(yùn)行居扒,減少人工運(yùn)行成本挑秉。
虛擬機(jī)和Docker區(qū)別
虛擬機(jī)模擬的是整套環(huán)境,包括硬件苔货、環(huán)境犀概。虛擬機(jī)的啟動(dòng)時(shí)長(zhǎng)是分鐘級(jí),而docker可以做到秒級(jí)夜惭。虛擬機(jī)資源占用多姻灶、冗余步驟多、啟動(dòng)慢诈茧。
虛擬機(jī)時(shí)在一個(gè)操作系統(tǒng)里運(yùn)行另外一種操作系統(tǒng)产喉,比如在Windows系統(tǒng)里面運(yùn)行Linux,應(yīng)用程序無(wú)感知。因?yàn)樘摂M機(jī)看上去和真實(shí)系統(tǒng)一模一樣敢会,而對(duì)于底層系統(tǒng)來(lái)說(shuō)曾沈,虛擬機(jī)就是一個(gè)普通文件,不需要了就刪除鸥昏,對(duì)其他部分毫無(wú)影響塞俱。
容器和虛擬機(jī)區(qū)別,容器不再是整套環(huán)境的模擬吏垮,而是需要的庫(kù)資源和設(shè)置障涯,和應(yīng)用代碼綁定在一個(gè)環(huán)境中。
傳統(tǒng)虛擬機(jī)技術(shù)是虛擬出一套硬件后膳汪,在其上運(yùn)行一個(gè)完整操作系統(tǒng)唯蝶,在該系統(tǒng)上再運(yùn)行所需應(yīng)用進(jìn)程;而容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核遗嗽,容器內(nèi)沒(méi)有自己的內(nèi)核粘我,而且也沒(méi)有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
鏡像簡(jiǎn)介
Docker包括三個(gè)基本概念:鏡像、容器屈嗤、倉(cāng)庫(kù)删豺。
鏡像(Image)——一個(gè)特殊的文件系統(tǒng),即可直接在OS上運(yùn)行的代碼和環(huán)境
容器(Container)——鏡像運(yùn)行時(shí)的實(shí)體仔涩,正在對(duì)外提供服務(wù)的實(shí)體
倉(cāng)庫(kù)(Repository)——集中存放鏡像文件的地方
容器鏡像是輕量的、可執(zhí)行的獨(dú)立軟件包 ,包含軟件運(yùn)行所需的所有內(nèi)容:代碼搁料、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具系羞、系統(tǒng)庫(kù)和設(shè)置郭计。鏡像解決的問(wèn)題是,彈性擴(kuò)容數(shù)十臺(tái)集群的機(jī)器椒振,不可能通過(guò)人手工去維護(hù)昭伸,而是通過(guò)鏡像去復(fù)制粘貼到不同服務(wù)器上去。
Docker - Build, Ship, and Run Any App, Anywhere
Build(構(gòu)建鏡像):鏡像就像是集裝箱包括文件以及運(yùn)行環(huán)境等等資源澎迎。
Ship(運(yùn)輸鏡像):主機(jī)和鏡像倉(cāng)庫(kù)間運(yùn)輸庐杨,這里的倉(cāng)庫(kù)就像是超級(jí)碼頭一樣选调。
Run (運(yùn)行鏡像):運(yùn)行的鏡像就是一個(gè)容器,容器就是運(yùn)行程序的地方灵份。
Docker運(yùn)行過(guò)程也就是去倉(cāng)庫(kù)把鏡像拉到本地仁堪,然后用一條命令把鏡像運(yùn)行起來(lái)變成容器。所以填渠,我們也常常將Docker稱為碼頭工人或碼頭裝卸工弦聂,這和Docker的中文翻譯搬運(yùn)工人如出一轍。
容器服務(wù)K8S
Kubernetes是Google在2014年開(kāi)源的一個(gè)容器集群管理系統(tǒng)氛什,Kubernetes簡(jiǎn)稱K8S莺葫。K8S用于容器化應(yīng)用程序的部署,擴(kuò)展和管理枪眉。K8S提供了容器編排捺檬,資源調(diào)度,彈性伸縮瑰谜,部署管理欺冀,服務(wù)發(fā)現(xiàn)等一系列功能。
容器解決了研發(fā)環(huán)境和生產(chǎn)環(huán)境一致性的問(wèn)題萨脑。而Kubernetes目標(biāo)是讓批量部署容器化應(yīng)用簡(jiǎn)單高效隐轩。
容器K8S特點(diǎn)
【1】自我修復(fù):在節(jié)點(diǎn)故障時(shí)重新啟動(dòng)失敗的容器,替換和重新部署渤早,保證預(yù)期的副本數(shù)量职车;殺死健康檢查失敗的容器,并且在未準(zhǔn)備好之前不會(huì)處理客戶端請(qǐng)求鹊杖,確保線上服務(wù)不中斷悴灵。
【2】彈性伸縮:使用命令、UI或者基于CPU使用情況自動(dòng)快速擴(kuò)容和縮容應(yīng)用程序?qū)嵗畋停WC應(yīng)用業(yè)務(wù)高峰并發(fā)時(shí)的高可用性积瞒;業(yè)務(wù)低峰時(shí)回收資源,以最小成本運(yùn)行服務(wù)登下。
【3】自動(dòng)部署和回滾:K8S采用滾動(dòng)更新策略更新應(yīng)用茫孔,一次更新一個(gè)Pod,而不是同時(shí)刪除所有Pod被芳,如果更新過(guò)程中出現(xiàn)問(wèn)題缰贝,將回滾更改,確保升級(jí)不受影響業(yè)務(wù)畔濒。
【4】服務(wù)發(fā)現(xiàn)和負(fù)載均衡:K8S為多個(gè)容器提供一個(gè)統(tǒng)一訪問(wèn)入口(內(nèi)部IP地址和一個(gè)DNS名稱)剩晴,并且負(fù)載均衡關(guān)聯(lián)的所有容器,使得用戶無(wú)需考慮容器IP問(wèn)題侵状。
【5】機(jī)密和配置管理管理機(jī)密數(shù)據(jù)和應(yīng)用程序配置赞弥,而不需要把敏感數(shù)據(jù)暴露在鏡像里毅整,提高敏感數(shù)據(jù)安全性。并可以將一些常用的配置存儲(chǔ)在K8S中绽左,方便應(yīng)用程序使用毛嫉。
【6】存儲(chǔ)編排:掛載外部存儲(chǔ)系統(tǒng),無(wú)論是來(lái)自本地存儲(chǔ)妇菱,公有云(如AWS),還是網(wǎng)絡(luò)存儲(chǔ)(如NFS暴区、GlusterFS闯团、Ceph)都作為集群資源的一部分使用,極大提高存儲(chǔ)使用靈活性仙粱。
【7】批處理:提供一次性任務(wù)房交,定時(shí)任務(wù);滿足批量數(shù)據(jù)處理和分析的場(chǎng)景伐割。
Masternode:統(tǒng)一入口由Master節(jié)點(diǎn)的APIServer實(shí)現(xiàn)候味。
scheduler:是負(fù)責(zé)調(diào)度策略
Controller Manager:作為集群內(nèi)部的管理控制中心,負(fù)責(zé)集群內(nèi)的Node隔心、Pod副本白群、服務(wù)端點(diǎn)(Endpoint)、命名空間(Namespace)硬霍、服務(wù)賬號(hào)(ServiceAccount)帜慢、資源定額(ResourceQuota)的管理,當(dāng)某個(gè)Node意外宕機(jī)時(shí)唯卖,Controller Manager會(huì)及時(shí)發(fā)現(xiàn)并執(zhí)行自動(dòng)化修復(fù)流程粱玲,確保集群始終處于預(yù)期的工作狀態(tài)。
Worknode就是對(duì)應(yīng)的部署了同樣業(yè)務(wù)代碼的節(jié)點(diǎn)拜轨。
Kube_proxy提供網(wǎng)絡(luò)代理等負(fù)載均衡功能抽减。
pod是worknode節(jié)點(diǎn)上運(yùn)行的多個(gè)實(shí)例,實(shí)現(xiàn)高可用橄碾、彈性擴(kuò)展卵沉。因?yàn)槭菬o(wú)狀態(tài)服務(wù),如果實(shí)例異常無(wú)法使用堪嫂,實(shí)例漂移之后偎箫,可以不依賴任何數(shù)據(jù)。有狀態(tài)服務(wù)則是依賴網(wǎng)絡(luò)IP皆串,存儲(chǔ)的數(shù)據(jù)淹办。
Controller Manager中的Replication Controller,稱為副本控制器恶复。副本控制器的作用即保證集群中一個(gè)RC所關(guān)聯(lián)的Pod副本數(shù)始終保持預(yù)設(shè)值怜森。
Controller Manager中的Endpoints表示了一個(gè)Service對(duì)應(yīng)的所有Pod副本的訪問(wèn)地址速挑,而Endpoints Controller負(fù)責(zé)生成和維護(hù)所有Endpoints對(duì)象的控制器。它負(fù)責(zé)監(jiān)聽(tīng)Service和對(duì)應(yīng)的Pod副本的變化副硅。
Pod是kubernetes中你可以創(chuàng)建和部署的最小也是最簡(jiǎn)單位姥宝。一個(gè)Pod代表著集群中運(yùn)行的一個(gè)進(jìn)程,可能由一個(gè)或者多個(gè)容器組合在一起共享資源恐疲。
為什么k8s使用Pod在容器之上再封裝一層呢腊满?
一個(gè)很重要的原因是Docker容器之間的通信受到網(wǎng)絡(luò)機(jī)制的限制。在Docker的世界中培己,一個(gè)容器需要通過(guò)link方式才能訪問(wèn)另一個(gè)容器提供的服務(wù)(端口)碳蛋。大量容器之間的link將是一個(gè)非常繁重的工作。通過(guò)Pod的概念將多個(gè)容器組合在一個(gè)虛擬的“主機(jī)”內(nèi)省咨,可以實(shí)現(xiàn)容器之間僅需通過(guò)Localhost就能相互通信了肃弟。
Ingress是用戶訪問(wèn)域名之后,解析成IP零蓉,分發(fā)給對(duì)應(yīng)Service笤受。而Service則是容器對(duì)外統(tǒng)一暴露的接口,隱藏容器內(nèi)部的實(shí)現(xiàn)邏輯敌蜂。由于容器是無(wú)狀態(tài)服務(wù)箩兽,當(dāng)pod服務(wù)異常重啟新的pod替代時(shí),會(huì)產(chǎn)生新的IP地址紊册。
node則是pod所運(yùn)行的主機(jī),可能是物理機(jī)比肄,也可能是虛擬機(jī)。