|

DevOps(Deveplopment和Operations的簡稱),中譯為開發(fā)運(yùn)維一體化,可定義為是一種過程、方法、文化、運(yùn)動(dòng)或?qū)嵺`,主要是為了通過一條高度自動(dòng)化的流水線來加強(qiáng)開發(fā)和其他IT職能部門之間的溝通和協(xié)作,加速軟件和服務(wù)的交付。
在一個(gè)較成熟的軟件和服務(wù)交付的團(tuán)隊(duì)里,就技術(shù)層面來說主要分為三個(gè)組成部分:開發(fā)、測試和運(yùn)維。DevOps的作用就是將這三個(gè)部分緊密的連接起來,提供一條從軟件開發(fā)到質(zhì)量保障到技術(shù)運(yùn)營的自動(dòng)化流水線,加強(qiáng)不同角色之間的溝通和協(xié)作,基于用戶需求實(shí)現(xiàn)軟件和服務(wù)的快速交付。 
“開發(fā)的這群傻叉新給的發(fā)布包又把系統(tǒng)CPU搞到100%了,應(yīng)用又夯住了,都是些什么水平的人啊……” “運(yùn)維的這幫傻鳥技術(shù)太差,維護(hù)的是些什么稀爛的系統(tǒng),在我這跑得好好的,上他們那應(yīng)用就掛……” “這是開發(fā)的鍋……” “這是運(yùn)維的盤……” 描述得略顯浮夸……但這種踢皮球的事情在IT公司里面真的是隨處可見。無謂對錯(cuò),也無鍋可背,都是由開發(fā)和運(yùn)維的基因所決定,但是最終的受害者卻是用戶。偏偏比較有意思的就是,開發(fā)和運(yùn)維人員所做的這些也都是為了用戶,開發(fā)人員必須根據(jù)用戶的需求對應(yīng)用的功能進(jìn)行不停的變更,運(yùn)維人員也必須根據(jù)用戶的需求提供穩(wěn)定和持續(xù)的服務(wù)。各司其職的同時(shí)也在兩者之間形成了一面無形的墻,阻礙了開發(fā)和運(yùn)維之間的溝通和協(xié)作,而DevOps的出現(xiàn)就是為了擊碎這堵無形之墻。 DevOps不是一個(gè)工具,但它需要被工具來實(shí)現(xiàn),好在現(xiàn)今已經(jīng)有了很多商業(yè)版和開源版的軟件不是一個(gè)工具,但它需要被工具來實(shí)現(xiàn),好在現(xiàn)今已經(jīng)有了很多商業(yè)版和開源版的軟件來形成一個(gè)有效的工具鏈來作為DevOps技術(shù)層面的支撐。但是光有工具還不夠,再好的工具沒人會用也沒意義,所以需要有熟悉這個(gè)工具鏈的IT人員來提供技術(shù)支持,利用工具實(shí)現(xiàn)DevOps的高度自動(dòng)化。
流程層面DevOps是一條從開發(fā)到運(yùn)維的流水線,想要流水線能夠高效的自動(dòng)運(yùn)行,必須要設(shè)定一系列的流程和規(guī)范來進(jìn)行管控。IT的管理者需要有基于軟件或服務(wù)交付的全局觀,能夠清晰的認(rèn)識到交付周期中不同角色的痛點(diǎn)在哪里,進(jìn)而定制出合適的協(xié)作流程。 組織層面DevOps并不是簡單的將開發(fā)部門和運(yùn)維部門合并,而是加強(qiáng)開發(fā)部門和運(yùn)維部門之間的協(xié)作和溝通。這需要管理者們對企業(yè)的IT部門有著足夠的重視并且愿意去推動(dòng)DevOps這種開發(fā)和運(yùn)維間高效協(xié)作的模式,并且開發(fā)和運(yùn)維的人員之間也需要有開放、接納和協(xié)作的意識。 DevOps是一個(gè)虛無縹緲的玩意兒,它并不能被工具或軟件來簡單的定義或量化。但工具或軟件卻是實(shí)現(xiàn)DevOps的一個(gè)重要組成部分,而Docker就是實(shí)現(xiàn)DevOps最合適的工具之一。 Docker是一個(gè)分布式應(yīng)用構(gòu)建、遷移和運(yùn)行的開放平臺,它允許開發(fā)或運(yùn)維人員將應(yīng)用和運(yùn)行應(yīng)用所依賴的文件打包到一個(gè)標(biāo)準(zhǔn)化的單元(容器)中運(yùn)行。

容器是一個(gè)非常早期的技術(shù),Unix的Chroot功能可以說是容器的雛形,而后到大家所熟知的基于Namespace和Cgroups技術(shù)的LXC(Linux Container),最后到現(xiàn)在如日中天的Docker。站在前人的肩膀之上,Docker最妙的地方就是將容器的使用簡單化和標(biāo)準(zhǔn)化,再配合一波開源、互聯(lián)網(wǎng)、云計(jì)算、大數(shù)據(jù)的浪潮,可謂是時(shí)代的寵兒。 
很多人都喜歡拿容器和虛擬機(jī)對比,其實(shí)容器和虛機(jī)都是屬于虛擬化技術(shù)的一種實(shí)現(xiàn)。兩種架構(gòu)在底層上相同,需要物理硬件和操作系統(tǒng)的支持。不同的是虛擬機(jī)場景中,Hypervisor(如KVM)作為操作系統(tǒng)到虛擬機(jī)的中間層,而容器場景中Docker Engine(以Docker為例)作為操作系統(tǒng)到容器的中間層。虛機(jī)封裝操作系統(tǒng)和應(yīng)用,而容器則直接封裝應(yīng)用,這也是為什么容器要比虛機(jī)輕量的原因。 
上圖中將虛擬機(jī)和容器的特性進(jìn)行了對比,可以看出容器相對于虛擬機(jī)比較有優(yōu)勢的地方就是輕量、靈活、資源利用率高。缺點(diǎn)主要就是隔離性不如虛擬機(jī),也就是一直被無限放大的容器的安全性問題。但偏偏就是因?yàn)槿萜鳑]有完全被隔離到一個(gè)密封的小黑屋里面,所以才能帶來比虛擬機(jī)更好的資源利用率。 個(gè)人認(rèn)為容器在短期之內(nèi)還取代不了虛機(jī),在未來很長一段時(shí)間內(nèi)會是容器和虛機(jī)并存的情況。而到最終誰替代誰,取決的不是技術(shù)本身,而是用戶體驗(yàn)時(shí)代的需求。 PS:希望有朋友能夠發(fā)現(xiàn)此圖中的一點(diǎn)小漏洞。
Docker基本組件介紹
Docker Image Docker鏡像是一個(gè)運(yùn)行容器的只讀模板。 Docker Container Docker容器是一個(gè)運(yùn)行應(yīng)用的標(biāo)準(zhǔn)化單元。 Docker Registry Docker注冊服務(wù)器用來存放鏡像。 Docker Engine Docker引擎用來在主機(jī)上創(chuàng)建,運(yùn)行和管理容器。

了解Docker的朋友都知道,Docker將自身最主要的特點(diǎn)以下面這一句話來描述”Build,Ship and Run Any App Anywhere”。Build出Image,然后使用Registry來Ship鏡像,最終使用Engine將Container和包含的App在任意平臺(Anywhere)上運(yùn)行起來。 Docker原生工具介紹
Docker Machine:讓用戶在基礎(chǔ)架構(gòu)平臺快速部署Docker宿主機(jī); Docker Swarm:讓用戶在集群環(huán)境中調(diào)度和運(yùn)行容器; Docker Compose:讓用戶在集群環(huán)境中編排和部署應(yīng)用。
這三個(gè)工具構(gòu)成了Docker的原生環(huán)境,加上比較火的Kubernetes、Mesos、Rancher、etcd等外部生態(tài),構(gòu)建出了一個(gè)比較完整的Docker容器生態(tài)圈。對于原生工具和外部工具,個(gè)人覺得工具或技術(shù)并沒有好壞之分,主要還是看適用場景和客戶需求。而正是有這些生態(tài)的合作和競爭造就的亂世,才促進(jìn)了容器技術(shù)的高速發(fā)展和逐步成熟。 Docker適用的場景持續(xù)集成和持續(xù)交付 開發(fā)運(yùn)維一體化 容器云 大數(shù)據(jù)

Docker官方給的Use Case是CI/CD、DevOps、Big Data和Infrastructure Optimization(Cloud)。 這里比較有意思的就是,這幾個(gè)使用場景似乎正好描繪著Docker當(dāng)前的發(fā)展史。 起初Docker的出現(xiàn)主要面向的對象是開發(fā)者,為開發(fā)者提供應(yīng)用快速開發(fā)和測試的環(huán)境,這就是CI/CD所在的場景。 隨后的發(fā)展使得Docker不再僅僅只關(guān)注開發(fā)層面的東西,而在向運(yùn)維層面邁進(jìn),就出現(xiàn)了DevOps的場景。 既然有了運(yùn)維,那肯定避免不了接觸到基礎(chǔ)架構(gòu)的東西,而現(xiàn)今的基礎(chǔ)架構(gòu)基本都是圍繞著云計(jì)算來展開,所以Docker又涉及到了基礎(chǔ)架構(gòu)優(yōu)化的層面,也就是Container Cloud。 基礎(chǔ)架構(gòu)的容器云有了,那么勢必需要對云中的應(yīng)用提供服務(wù),加上Docker自身的許多優(yōu)勢,自然而然的又涉及到了Big Data的使用場景。 而Docker自身的解決方案Docker Cloud和Docker Data Center的先后推出也側(cè)面反應(yīng)了從開發(fā)到運(yùn)維場景的逐步支持。DDC的出現(xiàn)更是將目標(biāo)直接瞄準(zhǔn)了企業(yè)內(nèi)部容器云。 難以分清是新技術(shù)成就了Docker,還是Docker承載了新技術(shù)。至少就目前來看,Docker的發(fā)展方向是順應(yīng)這個(gè)時(shí)代的。這只是三歲多的Docker,不敢想象它在將來會有多大的能量爆發(fā)出來,將這些留給時(shí)間去述說。 Docker實(shí)現(xiàn)DevOps的優(yōu)勢優(yōu)勢一開發(fā)、測試和生產(chǎn)環(huán)境的統(tǒng)一化和標(biāo)準(zhǔn)化。鏡像作為標(biāo)準(zhǔn)的交付件,可在開發(fā)、測試和生產(chǎn)環(huán)境上以容器來運(yùn)行,最終實(shí)現(xiàn)三套環(huán)境上的應(yīng)用以及運(yùn)行所依賴內(nèi)容的完全一致。 優(yōu)勢二解決底層基礎(chǔ)環(huán)境的異構(gòu)問題?;A(chǔ)環(huán)境的多元化造成了從Dev到Ops過程中的阻力,而使用Docker Engine可無視基礎(chǔ)環(huán)境的類型。不同的物理設(shè)備,不同的虛擬化類型,不同云計(jì)算平臺,只要是運(yùn)行了Docker Engine的環(huán)境,最終的應(yīng)用都會以容器為基礎(chǔ)來提供服務(wù)。 優(yōu)勢三易于構(gòu)建、遷移和部署。Dockerfile實(shí)現(xiàn)鏡像構(gòu)建的標(biāo)準(zhǔn)化和可復(fù)用,鏡像本身的分層機(jī)制也提高了鏡像構(gòu)建的效率。使用Registry可以將構(gòu)建好的鏡像遷移到任意環(huán)境,而且環(huán)境的部署僅需要將靜態(tài)只讀的鏡像轉(zhuǎn)換為動(dòng)態(tài)可運(yùn)行的容器即可。 優(yōu)勢四輕量和高效。和需要封裝操作系統(tǒng)的虛擬機(jī)相比,容器僅需要封裝應(yīng)用和應(yīng)用需要的依賴文件,實(shí)現(xiàn)輕量的應(yīng)用運(yùn)行環(huán)境,且擁有比虛擬機(jī)更高的硬件資源利用率。 優(yōu)勢五工具鏈的標(biāo)準(zhǔn)化和快速部署。將實(shí)現(xiàn)DevOps所需的多種工具或軟件進(jìn)行Docker化后,可在任意環(huán)境實(shí)現(xiàn)一條或多條工具鏈的快速部署。 架構(gòu)介紹
該DevOps環(huán)境基于開源產(chǎn)品Rancher進(jìn)行管理,分為三套環(huán)境和一套橫跨各環(huán)境的私有Registry。基于RancherUI和Docker宿主機(jī),每套環(huán)境對不同的角色配置權(quán)限管理,每個(gè)角色僅能訪問對應(yīng)的環(huán)境。開發(fā)、測試和運(yùn)維人員可自由選擇Web UI或Docker CLI的方式去管理自己的環(huán)境。 DEV ENV定義為開發(fā)環(huán)境,包含開發(fā)人員客戶端的筆記本和服務(wù)端的一臺Docker主機(jī)。 TEST ENV定義為測試環(huán)境,包含測試人員客戶端筆記本和服務(wù)端的一臺Docker主機(jī)。 OPS ENV定義為運(yùn)維環(huán)境,包含運(yùn)維人員客戶端筆記本和服務(wù)端的兩臺Docker主機(jī)構(gòu)建的Swarm集群。 Pri-Registry私有鏡像服務(wù)器,整個(gè)DevOps流水線中的核心。將鏡像作為最終的交付件在不同的環(huán)境中Ship和Run,以實(shí)現(xiàn)從Dev到Ops應(yīng)用環(huán)境的一致性部署。 運(yùn)作流程
開發(fā)者通過本地的Git客戶端向服務(wù)端的Gogs提交代碼,Jenkins將代碼構(gòu)建成鏡像放到本地。開發(fā)人員將對應(yīng)的鏡像啟動(dòng)容器來預(yù)覽的開發(fā)結(jié)果。如果確認(rèn)已滿足預(yù)期,則將該鏡像推送到私有的Docker注冊服務(wù)器中進(jìn)行存儲。 測試人員將私有鏡像倉庫中開發(fā)人員新提交的鏡像運(yùn)行成容器,并進(jìn)行手動(dòng)或者自動(dòng)的功能性測試,測試通過后鏡像會被打上一個(gè)新的Tag以被其他環(huán)境使用。 運(yùn)維人員基于私有鏡像倉庫中被打過Tag的鏡像啟動(dòng)為容器,最終交付給客戶。
目前該環(huán)境主要用于Docker Image的構(gòu)建和發(fā)布,Ops(Prod)環(huán)境中跑了一些項(xiàng)目內(nèi)部使用的應(yīng)用,但更多的是作為Demo環(huán)境提供給客戶訪問而并非真正意義上的生產(chǎn)環(huán)境。
|