摘要:去年換工作后,開(kāi)始真正在生產(chǎn)環(huán)境中接觸容器與。今天想先談?wù)劊依斫獾娜萜魇鞘裁矗约盀槭裁此鼈兡芑鹌饋?lái)。一個(gè)容器鏡像的實(shí)質(zhì)就是程序進(jìn)程加所有運(yùn)行時(shí)環(huán)境及配置依賴的集合。這里再談?wù)勎依斫獾摹6褪悄壳暗娜萜骶幣诺钠脚_(tái)的事實(shí)標(biāo)準(zhǔn)了。
去年換工作后,開(kāi)始真正在生產(chǎn)環(huán)境中接觸容器與Kubernetes。邊惡補(bǔ)相關(guān)知識(shí)的同時(shí),也想把學(xué)到的內(nèi)容和自己的理解整理出來(lái)。學(xué)習(xí)的途徑包括k8s官方文檔、書(shū)籍、極客時(shí)間專欄及網(wǎng)上各種博文。所涉及一些摘抄或描述,大多用自己的理解來(lái)組織語(yǔ)言,也就不一一注明出處了。
Kubernetes(簡(jiǎn)稱K8S)與容器技術(shù),可以說(shuō)是近幾年最火熱的技術(shù)之一。提起K8S,大家都知道是google開(kāi)源的容器編排工具。今天想先談?wù)劊依斫獾娜萜鳌8S是什么,以及為什么它們能火起來(lái)。
Why Docker既然說(shuō)K8S是一個(gè)容器編排的工具,那么要搞清楚K8S是什么,首先得搞清楚,容器是什么,以及為什么要用容器技術(shù)。
形象的來(lái)說(shuō),一個(gè)linux容器,實(shí)際就是一個(gè)進(jìn)程,還是個(gè)被系統(tǒng)欺騙的進(jìn)程。為什么這么說(shuō)呢?一個(gè)運(yùn)行在容器里的進(jìn)程,主要有以下特點(diǎn):
它被宿主機(jī)操作系統(tǒng)隔離了,它看不到宿主機(jī)上的其他進(jìn)程,以為自己就是pid為1的進(jìn)程
它被宿主機(jī)操作系統(tǒng)限制了硬件資源,它能使用的cpu、內(nèi)存等硬件資源只是宿主機(jī)的一部分
在被宿主機(jī)操作系統(tǒng)限制了存儲(chǔ)空間,讓這個(gè)進(jìn)程認(rèn)為宿主機(jī)的某個(gè)目錄就是系統(tǒng)根目錄
這幾個(gè)欺騙進(jìn)程的技術(shù),就是是容器技術(shù)的三板斧,用于資源隔離的namespace,用于資源限制的cgroup,以及用于偽裝進(jìn)程根目錄的rootfs。這三種技術(shù),都是是早已存在于linux中的,只是docker公司比較創(chuàng)新的把這三種技術(shù)整合在一起,并且,提出了容器鏡像及鏡像倉(cāng)庫(kù)等概念,把這個(gè)進(jìn)程及相關(guān)的依賴環(huán)境都一起打包成可分發(fā)及重復(fù)使用的鏡像文件,方便容器能在不同機(jī)器之間移植。這樣,在任何地方,只要能運(yùn)行docker,就能把容器鏡像跑成一個(gè)包含這應(yīng)用進(jìn)程及相關(guān)依賴環(huán)境的容器實(shí)例。
這里用利用K8S官方文檔的圖,簡(jiǎn)單說(shuō)下生產(chǎn)中的場(chǎng)景,看看容器技術(shù)能解決什么問(wèn)題。
左圖是傳統(tǒng)的物理機(jī)部署應(yīng)用方式的方式,可以看到除了一個(gè)應(yīng)用的運(yùn)行,除了程序本身,離不開(kāi)應(yīng)用配置、庫(kù)、等等依賴環(huán)境。通常情況下,一個(gè)應(yīng)用的上線,要經(jīng)歷開(kāi)發(fā)環(huán)境、pre環(huán)境、beta環(huán)境、灰度測(cè)試、生產(chǎn)環(huán)境等等不同的基礎(chǔ)環(huán)境。開(kāi)發(fā)的同學(xué)在開(kāi)發(fā)環(huán)境跑通了代碼,到其他環(huán)境運(yùn)行時(shí),由于各環(huán)境依賴、配置、安全需求不同,可能會(huì)出現(xiàn)各種問(wèn)題。運(yùn)維的同學(xué)忙著在不同的環(huán)境中統(tǒng)一依賴。不同應(yīng)用各種語(yǔ)言,各種應(yīng)用的特殊依賴需求,也造成了CI/CD邏輯復(fù)雜,難以統(tǒng)一。
右圖是用了容器技術(shù)之后的場(chǎng)景。一個(gè)容器鏡像的實(shí)質(zhì)就是程序進(jìn)程加所有運(yùn)行時(shí)環(huán)境及配置、依賴的集合。只要各個(gè)環(huán)境的底層能兼容docker,就能實(shí)現(xiàn)所有環(huán)境部署的一致性。開(kāi)發(fā)同學(xué)不用關(guān)心生產(chǎn)環(huán)境和開(kāi)發(fā)環(huán)境的差異可能會(huì)導(dǎo)致應(yīng)用運(yùn)行問(wèn)題,運(yùn)維同學(xué)部署一個(gè)應(yīng)用,只要確保容器鏡像能正常運(yùn)行就好。CI/CD的自動(dòng)化也相對(duì)容易實(shí)現(xiàn)很多。從而極大增加開(kāi)發(fā)效率、應(yīng)用迭代效率及節(jié)省了運(yùn)維工作量。
說(shuō)到這里,不得不說(shuō)下容器與傳統(tǒng)意義的虛擬機(jī)間的對(duì)比。其實(shí)二者都可以理解為虛擬化,它們最本質(zhì)的區(qū)別是,容器是操作系統(tǒng)層級(jí)的虛擬化,而虛擬機(jī)是硬件層級(jí)的虛擬化。參看下圖。
由于虛擬機(jī)多了一層Guest OS,需要宿主機(jī)額外的性能開(kāi)銷進(jìn)行硬件虛擬化,同時(shí)因?yàn)槭峭暾牟僮飨到y(tǒng),虛擬機(jī)鏡像一般動(dòng)輒大幾G,很難在各環(huán)境間快速傳播,hypervisor層相對(duì)Docker Engine也比較重。再看docker容器,實(shí)質(zhì)就是宿主機(jī)上跑的一個(gè)進(jìn)程,只不過(guò)通過(guò)docker與其他進(jìn)程隔離開(kāi)來(lái)。簡(jiǎn)單的說(shuō),敏捷和高效,是容器相比虛擬機(jī)最大的優(yōu)勢(shì),當(dāng)然也有劣勢(shì),由于容器只是操作系統(tǒng)級(jí)別的隔離,不同容器間隔離的不夠徹底。
簡(jiǎn)單說(shuō)完了docker的理解,那么Kubernetes又是什么,它解決了哪些問(wèn)題呢,為啥現(xiàn)在提容器技術(shù)必提k8s呢。這里再談?wù)勎依斫獾腤hy K8S。
回到實(shí)際的場(chǎng)景來(lái),假如你已經(jīng)開(kāi)始用docker鏡像來(lái)打包應(yīng)用,可以方便的進(jìn)行分發(fā)和部署,不用去考慮不同環(huán)境的差異。但是不是還感覺(jué)還少了點(diǎn)什么?
因?yàn)檎5膶?shí)際業(yè)務(wù)系統(tǒng),不是應(yīng)用能部署,能運(yùn)行起來(lái)就完事了,還要考慮應(yīng)用容器的訪問(wèn)、水平伸縮、監(jiān)控、安全、備份、容災(zāi)等等因素。而對(duì)于一個(gè)完整的業(yè)務(wù)系統(tǒng)來(lái)說(shuō),也不是單個(gè)應(yīng)用就能搞定的,還要考慮的是各應(yīng)用間的關(guān)系,及應(yīng)用運(yùn)行的形態(tài)。比如一個(gè)web業(yè)務(wù),可能需要web服務(wù)器、緩存系統(tǒng)、數(shù)據(jù)庫(kù)等多個(gè)應(yīng)用。容器化部署后,它們可能部署在不同宿主機(jī)的不同容器中,相互間的訪問(wèn)要怎么實(shí)現(xiàn),這就涉及到容器間訪問(wèn)關(guān)系的處理。再比如,有個(gè)優(yōu)化緩存的應(yīng)用也跑在容器里,只需要定期運(yùn)行容器實(shí)例執(zhí)行優(yōu)化任務(wù),執(zhí)行完畢就終止容器,這就需要處理不同容器應(yīng)用的運(yùn)行形態(tài)問(wèn)題。類似上述這些對(duì)容器應(yīng)用及容器間關(guān)系進(jìn)行管理,就是所謂的容器編排及調(diào)度。而Kubernetes,就是目前的容器編排的平臺(tái)的事實(shí)標(biāo)準(zhǔn)了。
那么,具體來(lái)說(shuō),K8S到底能做哪些事呢。
在官方文檔中,對(duì)K8S功能的描述如下
Kubernetes 滿足了生產(chǎn)中運(yùn)行應(yīng)用程序的許多常見(jiàn)的需求,例如:
Pod提供了一種復(fù)合的應(yīng)用容器模型,
掛載外部存儲(chǔ),
Secret管理,
應(yīng)用健康檢查,
副本應(yīng)用實(shí)例,
橫向自動(dòng)擴(kuò)縮容,
服務(wù)發(fā)現(xiàn),
負(fù)載均衡,
滾動(dòng)更新,
資源監(jiān)測(cè),
日志采集和存儲(chǔ),
支持自檢和調(diào)試,
認(rèn)證和鑒權(quán).
從這些功能介紹可以看出,K8S已很類似一個(gè)云平臺(tái)了,可以完全能滿足生產(chǎn)級(jí)別的容器應(yīng)用管理需求。下面是一張最簡(jiǎn)單的K8S系統(tǒng)示意圖:
K8S集群由一個(gè)主節(jié)點(diǎn)(master節(jié)點(diǎn))及多個(gè)工作節(jié)點(diǎn)(node節(jié)點(diǎn))構(gòu)成,開(kāi)發(fā)者提交應(yīng)用容器鏡像,并將鏡像運(yùn)行的數(shù)量、方法等通過(guò)描述文件提交給K8S master節(jié)點(diǎn),K8S master節(jié)點(diǎn)或根據(jù)集群整體情況,將應(yīng)用按照需求部署在工作節(jié)點(diǎn)中。對(duì)于開(kāi)發(fā)者來(lái)說(shuō),利用K8S可以方便的部署程序,不用關(guān)心基礎(chǔ)設(shè)施,而對(duì)于運(yùn)維人員來(lái)說(shuō),工作重心從維護(hù)具體應(yīng)用,轉(zhuǎn)變?yōu)榫S護(hù)K8S集群。而且,不管是開(kāi)發(fā)者還是運(yùn)維人員,都不用關(guān)心應(yīng)用具體部署在哪個(gè)節(jié)點(diǎn),K8S會(huì)自動(dòng)判斷搞定一切。相比于傳統(tǒng)的應(yīng)用部署方式,有沒(méi)有覺(jué)得K8S很棒棒?
在容器編排這個(gè)概念出現(xiàn)的時(shí)候,Kubernetes并不是唯一的一個(gè)容器編排工具,主流的工具還有Docker公司原生的swarm和Apache基金會(huì)的mesos,為什么K8S能笑到最后,成為容器編排的事實(shí)標(biāo)準(zhǔn)呢?我理解K8S對(duì)比它們有兩個(gè)最大不同點(diǎn):(這里不對(duì)swarm和mesos做詳細(xì)介紹了,實(shí)際也確實(shí)沒(méi)怎么玩過(guò))
K8S對(duì)容器又做了一層抽象,也就是POD。
不同于與其他兩個(gè)工具,K8S管理的原子對(duì)象,其實(shí)并不是容器,而是POD。按照官方文檔的定義,一個(gè)POD,是由一個(gè)或多個(gè)共享存儲(chǔ)及網(wǎng)絡(luò)的容器,以及描述怎么運(yùn)行這些容器的集合,所以,POD實(shí)際是一個(gè)抽象的概念。k8s對(duì)容器的所有操作,比如動(dòng)態(tài)伸縮、監(jiān)控等,實(shí)際上都是對(duì)pod的管理。那這層抽象的好處是什么呢?
上面有提到過(guò),容器實(shí)質(zhì)就是被特殊處理的進(jìn)程。想像一個(gè)web業(yè)務(wù),web應(yīng)用進(jìn)程輸出的日志需要被大數(shù)據(jù)agent進(jìn)程處理。這個(gè)業(yè)務(wù)如果想容器化,通常有兩個(gè)做法。一是分別起來(lái)兩個(gè)容器,掛載宿主機(jī)同一個(gè)目錄來(lái)存放日志。另一種是起一個(gè)操作系統(tǒng)級(jí)別的容器或supervisord容器作為enterpoint,來(lái)管理web服務(wù)和agent進(jìn)程。前一種方式,這個(gè)兩個(gè)容器就被框在這臺(tái)宿主機(jī)上了,要實(shí)現(xiàn)業(yè)務(wù)實(shí)例橫向擴(kuò)縮容,要考慮兩個(gè)容器的運(yùn)行情況和存儲(chǔ)掛載,邏輯比較復(fù)雜。后一種方式,你要為每個(gè)容器再額外開(kāi)一個(gè)supervisord進(jìn)程,更重要的是,由于entrypoint是supervisord進(jìn)程,web應(yīng)用和大數(shù)據(jù)agent對(duì)docker來(lái)說(shuō),都是不可見(jiàn)的。即使nginx出錯(cuò)頻繁重啟,只要supervisord還活著,Docker就認(rèn)為這個(gè)容器是正常的。
我們?cè)賮?lái)看看,使用了pod這個(gè)概念以后,有什么變化。一個(gè)pod里面同時(shí)起了web服務(wù)進(jìn)程和大數(shù)據(jù)agent兩個(gè)容器實(shí)例,首先,pod里的容器實(shí)例是共享存儲(chǔ)和網(wǎng)絡(luò)namespace的,也就是說(shuō),這兩進(jìn)程的存儲(chǔ)數(shù)據(jù)是直接共享的,不需要額外的掛載動(dòng)作。其次,這個(gè)pod是作為一個(gè)整體被k8s管理著的,k8s會(huì)監(jiān)控pod里每個(gè)容器的狀態(tài),并根據(jù)策略在有問(wèn)題時(shí)進(jìn)行自動(dòng)干預(yù)。從這個(gè)意義上說(shuō),pod才更類似傳統(tǒng)的虛擬機(jī)。
聲明式API
第二點(diǎn)也是比較重要的方面,是K8S的聲明式api(貌似swarm的新版也支持了,同樣沒(méi)玩過(guò)就不細(xì)說(shuō)了)。什么是聲明式API呢,可以參考上面系統(tǒng)圖中的描述文件。比如要我需要集群中跑10個(gè)web服務(wù)容器,傳統(tǒng)的命令式API是一步步調(diào)用命令構(gòu)建出容器。而使用聲明式api,只要告訴K8S我要10個(gè)web容器,K8S就會(huì)自動(dòng)將web集群實(shí)例數(shù)維持在10個(gè),并且,在某個(gè)pod出問(wèn)題退出時(shí),K8S會(huì)自動(dòng)重新拉起新pod,使集群始終保持10個(gè)pod實(shí)例在跑。這就使得管理集群變得很簡(jiǎn)單,只要通過(guò)配置文件描述出希望的集群狀態(tài),而不用去關(guān)注中間的實(shí)現(xiàn)過(guò)程。
最后,總結(jié)一下:
Why Dokcer: 用容器技術(shù)跑應(yīng)用,相比原來(lái)的物理機(jī)及虛擬機(jī)更高效、輕量、省資源,同時(shí)大大方便了不同環(huán)境下的應(yīng)用部署及分發(fā)。
Why Kubernetes:生產(chǎn)集群光跑容器還不夠,還要對(duì)容器應(yīng)用作為一個(gè)業(yè)務(wù)系統(tǒng)集群進(jìn)行編排及管理,而K8S的一些優(yōu)勢(shì)使得它成為目前容器集群編排管理工具的事實(shí)標(biāo)準(zhǔn)。
最后的最后再多提一點(diǎn),實(shí)際上,容器技術(shù)不止Docker公司一家在做,Kubernetes也不是只能管理Docker容器。只是,無(wú)論從市場(chǎng)份額、應(yīng)用性還是開(kāi)發(fā)社區(qū)的熱度來(lái)說(shuō),它們都是目前容器技術(shù)最主流的解決方案,就生產(chǎn)環(huán)境來(lái)說(shuō),目前基本沒(méi)有必要去考慮其他的容器技術(shù)了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/32889.html
摘要:去年換工作后,開(kāi)始真正在生產(chǎn)環(huán)境中接觸容器與。今天想先談?wù)劊依斫獾娜萜魇鞘裁矗约盀槭裁此鼈兡芑鹌饋?lái)。一個(gè)容器鏡像的實(shí)質(zhì)就是程序進(jìn)程加所有運(yùn)行時(shí)環(huán)境及配置依賴的集合。這里再談?wù)勎依斫獾摹6褪悄壳暗娜萜骶幣诺钠脚_(tái)的事實(shí)標(biāo)準(zhǔn)了。 去年換工作后,開(kāi)始真正在生產(chǎn)環(huán)境中接觸容器與Kubernetes。邊惡補(bǔ)相關(guān)知識(shí)的同時(shí),也想把學(xué)到的內(nèi)容和自己的理解整理出來(lái)。學(xué)習(xí)的途徑包括k8s官方文檔...
摘要:微軟本次提出的主要是為服務(wù)網(wǎng)格提供通用接口,以便能讓有更加通用的規(guī)范就像當(dāng)初那樣子這里我不想引起其他問(wèn)題,但生態(tài)中還是存在著各種各樣的選擇,希望大家理性選擇,同時(shí)需要注意的是這個(gè)中公布的廠商中唯獨(dú)沒(méi)有的存在。 「K8S 生態(tài)周報(bào)」內(nèi)容主要包含我所接觸到的 K8S 生態(tài)相關(guān)的每周值得推薦的一些信息。歡迎訂閱知乎專欄「k8s生態(tài)」。 KubeCon EU 舉辦 2019 年第一個(gè) Kube...
摘要:微軟本次提出的主要是為服務(wù)網(wǎng)格提供通用接口,以便能讓有更加通用的規(guī)范就像當(dāng)初那樣子這里我不想引起其他問(wèn)題,但生態(tài)中還是存在著各種各樣的選擇,希望大家理性選擇,同時(shí)需要注意的是這個(gè)中公布的廠商中唯獨(dú)沒(méi)有的存在。 「K8S 生態(tài)周報(bào)」內(nèi)容主要包含我所接觸到的 K8S 生態(tài)相關(guān)的每周值得推薦的一些信息。歡迎訂閱知乎專欄「k8s生態(tài)」。 KubeCon EU 舉辦 2019 年第一個(gè) Kube...
摘要:生態(tài)周報(bào)內(nèi)容主要包含我所接觸到的生態(tài)相關(guān)的每周值得推薦的一些信息。只讀維護(hù)在上周的推送中,有寫(xiě)到用戶隱私數(shù)據(jù)泄漏。建議對(duì)于重要的鏡像或者服務(wù),盡量維護(hù)一個(gè)私有鏡像源,以免在這種宕機(jī)情況下,無(wú)法進(jìn)行正常的使用。 「K8S 生態(tài)周報(bào)」內(nèi)容主要包含我所接觸到的 K8S 生態(tài)相關(guān)的每周值得推薦的一些信息。歡迎訂閱知乎專欄「k8s生態(tài)」。 Docker Hub 只讀維護(hù) 在上周的推送中,有寫(xiě)到 ...
摘要:生態(tài)周報(bào)內(nèi)容主要包含我所接觸到的生態(tài)相關(guān)的每周值得推薦的一些信息。歡迎訂閱知乎專欄生態(tài)。正式發(fā)布是畢業(yè)項(xiàng)目,可用于監(jiān)控系統(tǒng)及服務(wù)狀態(tài)。并且可以通過(guò)配置規(guī)則來(lái)觸發(fā)報(bào)警等。 「K8S 生態(tài)周報(bào)」內(nèi)容主要包含我所接觸到的 K8S 生態(tài)相關(guān)的每周值得推薦的一些信息。歡迎訂閱知乎專欄「k8s生態(tài)」。 Prometheus v2.9.0 正式發(fā)布 Prometheus 是 CNCF 畢業(yè)項(xiàng)目,可用...
閱讀 1261·2021-09-04 16:41
閱讀 2424·2021-09-02 10:18
閱讀 927·2019-08-29 16:40
閱讀 2623·2019-08-29 16:14
閱讀 917·2019-08-26 13:41
閱讀 1309·2019-08-26 12:24
閱讀 739·2019-08-26 10:24
閱讀 2880·2019-08-23 17:54