溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何理解去docker與k8s

發(fā)布時(shí)間:2021-09-14 14:09:56 來(lái)源:億速云 閱讀:151 作者:柒染 欄目:編程語(yǔ)言

今天就跟大家聊聊有關(guān)如何理解去docker與k8s,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

Kubernetes(簡(jiǎn)稱(chēng)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)的依賴(lài)環(huán)境都一起打包成可分發(fā)及重復(fù)使用的鏡像文件,方便容器能在不同機(jī)器之間移植。這樣,在任何地方,只要能運(yùn)行docker,就能把容器鏡像跑成一個(gè)包含這應(yīng)用進(jìn)程及相關(guān)依賴(lài)環(huán)境的容器實(shí)例。

這里用利用K8S官方文檔的圖,簡(jiǎn)單說(shuō)下生產(chǎn)中的場(chǎng)景,看看容器技術(shù)能解決什么問(wèn)題。

如何理解去docker與k8s

左圖是傳統(tǒng)的物理機(jī)部署應(yīng)用方式的方式,可以看到除了一個(gè)應(yīng)用的運(yùn)行,除了程序本身,離不開(kāi)應(yīng)用配置、庫(kù)、等等依賴(lài)環(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)境依賴(lài)、配置、安全需求不同,可能會(huì)出現(xiàn)各種問(wèn)題。運(yùn)維的同學(xué)忙著在不同的環(huán)境中統(tǒng)一依賴(lài)。不同應(yīng)用各種語(yǔ)言,各種應(yīng)用的特殊依賴(lài)需求,也造成了CI/CD邏輯復(fù)雜,難以統(tǒng)一。

右圖是用了容器技術(shù)之后的場(chǎng)景。一個(gè)容器鏡像的實(shí)質(zhì)就是程序進(jìn)程加所有運(yùn)行時(shí)環(huán)境及配置、依賴(lài)的集合。只要各個(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í)的虛擬化。參看下圖。

如何理解去docker與k8s如何理解去docker與k8s

  • 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才更類(lèi)似傳統(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ù)了。

    看完上述內(nèi)容,你們對(duì)如何理解去docker與k8s有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI