溫馨提示×

溫馨提示×

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

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

8 分鐘入門 K8s | 詳解容器基本概念

發(fā)布時間:2020-07-21 09:34:19 來源:網(wǎng)絡(luò) 閱讀:248 作者:阿里系統(tǒng)軟件技術(shù) 欄目:云計算

作者| 阿里巴巴高級開發(fā)工程師 傅偉

一、容器與鏡像

什么是容器?

在介紹容器的具體概念之前,先簡單回顧一下操作系統(tǒng)是如何管理進程的。

首先,當(dāng)我們登錄到操作系統(tǒng)之后,可以通過?ps?等操作看到各式各樣的進程,這些進程包括系統(tǒng)自帶的服務(wù)和用戶的應(yīng)用進程。那么,這些進程都有什么樣的特點?

  • 第一,這些進程可以相互看到、相互通信;
  • 第二,它們使用的是同一個文件系統(tǒng),可以對同一個文件進行讀寫操作;
  • 第三,這些進程會使用相同的系統(tǒng)資源。

這樣的三個特點會帶來什么問題呢?

  • 因為這些進程能夠相互看到并且進行通信,高級權(quán)限的進程可以破壞其他進程;
  • 因為它們使用的是同一個文件系統(tǒng),因此會帶來兩個問題:這些進程可以對于已有的數(shù)據(jù)進行增刪改查,具有高級權(quán)限的進程可能會將其他進程的數(shù)據(jù)刪除掉,破壞掉其他進程的正常運行;此外,進程與進程之間的依賴可能會存在沖突,如此一來就會給運維帶來很大的壓力;
  • 因為這些進程使用的是同一個宿主機的資源,應(yīng)用之間可能會存在資源搶占的問題,當(dāng)一個應(yīng)用需要消耗大量?CPU?和內(nèi)存資源的時候,就可能會破壞其他應(yīng)用的運行,導(dǎo)致其他應(yīng)用無法正常地提供服務(wù)。

針對上述的三個問題,如何為進程提供一個獨立的運行環(huán)境呢?

  • 針對不同進程使用同一個文件系統(tǒng)所造成的問題而言,Linux?和?Unix?操作系統(tǒng)可以通過?chroot 系統(tǒng)調(diào)用將子目錄變成根目錄,達到視圖級別的隔離;進程在?chroot?的幫助下可以具有獨立的文件系統(tǒng),對于這樣的文件系統(tǒng)進行增刪改查不會影響到其他進程;
  • 因為進程之間相互可見并且可以相互通信,使用 Namespace?技術(shù)來實現(xiàn)進程在資源的視圖上進行隔離。在?chroot?和 Namespace?的幫助下,進程就能夠運行在一個獨立的環(huán)境下了;
  • 但在獨立的環(huán)境下,進程所使用的還是同一個操作系統(tǒng)的資源,一些進程可能會侵蝕掉整個系統(tǒng)的資源。為了減少進程彼此之間的影響,可以通過 Cgroup?來限制其資源使用率,設(shè)置其能夠使用的?CPU?以及內(nèi)存量。

那么,應(yīng)該如何定義這樣的進程集合呢?

其實,容器就是一個視圖隔離、資源可限制、獨立文件系統(tǒng)的進程集合。所謂“視圖隔離”就是能夠看到部分進程以及具有獨立的主機名等;控制資源使用率則是可以對于內(nèi)存大小以及?CPU?使用個數(shù)等進行限制。容器就是一個進程集合,它將系統(tǒng)的其他資源隔離開來,具有自己獨立的資源視圖。

容器具有一個獨立的文件系統(tǒng),因為使用的是系統(tǒng)的資源,所以在獨立的文件系統(tǒng)內(nèi)不需要具備內(nèi)核相關(guān)的代碼或者工具,我們只需要提供容器所需的二進制文件、配置文件以及依賴即可。只要容器運行時所需的文件集合都能夠具備,那么這個容器就能夠運行起來。

什么是鏡像?

綜上所述,我們將這些容器運行時所需要的所有的文件集合稱之為容器鏡像。

那么,一般都是通過什么樣的方式來構(gòu)建鏡像的呢?通常情況下,我們會采用?Dockerfile?來構(gòu)建鏡像,這是因為?Dockerfile?提供了非常便利的語法糖,能夠幫助我們很好地描述構(gòu)建的每個步驟。當(dāng)然,每個構(gòu)建步驟都會對已有的文件系統(tǒng)進行操作,這樣就會帶來文件系統(tǒng)內(nèi)容的變化,我們將這些變化稱之為?changeset。當(dāng)我們把構(gòu)建步驟所產(chǎn)生的變化依次作用到一個空文件夾上,就能夠得到一個完整的鏡像。
?
changeset?的分層以及復(fù)用特點能夠帶來幾點優(yōu)勢:

  • 第一,能夠提高分發(fā)效率,簡單試想一下,對于大的鏡像而言,如果將其拆分成各個小塊就能夠提高鏡像的分發(fā)效率,這是因為鏡像拆分之后就可以并行下載這些數(shù)據(jù);
  • 第二,因為這些數(shù)據(jù)是相互共享的,也就意味著當(dāng)本地存儲上包含了一些數(shù)據(jù)的時候,只需要下載本地沒有的數(shù)據(jù)即可,舉個簡單的例子就是?golang?鏡像是基于?alpine?鏡像進行構(gòu)建的,當(dāng)本地已經(jīng)具有了?alpine?鏡像之后,在下載?golang?鏡像的時候只需要下載本地?alpine?鏡像中沒有的部分即可;
  • 第三,因為鏡像數(shù)據(jù)是共享的,因此可以節(jié)約大量的磁盤空間,簡單設(shè)想一下,當(dāng)本地存儲具有了?alpine?鏡像和?golang?鏡像,在沒有復(fù)用的能力之前,alpine?鏡像具有?5M?大小,golang?鏡像有?300M?大小,因此就會占用?305M?空間;而當(dāng)具有了復(fù)用能力之后,只需要?300M?空間即可。

如何構(gòu)建鏡像?

如下圖所示的?Dockerfile?適用于描述如何構(gòu)建?golang?應(yīng)用的。
8 分鐘入門 K8s | 詳解容器基本概念

如圖所示:

  1. FROM 行表示以下的構(gòu)建步驟基于什么鏡像進行構(gòu)建,正如前面所提到的,鏡像是可以復(fù)用的;
  2. WORKDIR 行表示會把接下來的構(gòu)建步驟都在哪一個相應(yīng)的具體目錄下進行,其起到的作用類似于?Shell?里面的?cd;
  3. COPY 行表示的是可以將宿主機上的文件拷貝到容器鏡像內(nèi);
  4. RUN 行表示在具體的文件系統(tǒng)內(nèi)執(zhí)行相應(yīng)的動作。當(dāng)我們運行完畢之后就可以得到一個應(yīng)用了;
  5. CMD?行表示使用鏡像時的默認(rèn)程序名字。

當(dāng)有了?Dockerfile?之后,就可以通過?docker build?命令構(gòu)建出所需要的應(yīng)用。構(gòu)建出的結(jié)果存儲在本地,一般情況下,鏡像構(gòu)建會在打包機或者其他的隔離環(huán)境下完成。

那么,這些鏡像如何運行在生產(chǎn)環(huán)境或者測試環(huán)境上呢?這時候就需要一個中轉(zhuǎn)站或者中心存儲,我們稱之為?docker registry,也就是鏡像倉庫,其負責(zé)存儲所有產(chǎn)生的鏡像數(shù)據(jù)。我們只需要通過?docker push?就能夠?qū)⒈镜冂R像推動到鏡像倉庫中,這樣一來,就能夠在生產(chǎn)環(huán)境上或者測試環(huán)境上將相應(yīng)的數(shù)據(jù)下載下來并運行了。

如何運行容器?

運行一個容器一般情況下分為三步:

  • 第一步:從鏡像倉庫中將相應(yīng)的鏡像下載下來;
  • 第二步:當(dāng)鏡像下載完成之后就可以通過?docker images?來查看本地鏡像,這里會給出一個完整的列表,我們可以在列表中選中想要的鏡像;
  • 第三步:當(dāng)選中鏡像之后,就可以通過?docker run?來運行這個鏡像得到想要的容器,當(dāng)然可以通過多次運行得到多個容器。一個鏡像就相當(dāng)于是一個模板,一個容器就像是一個具體的運行實例,因此鏡像就具有了一次構(gòu)建、到處運行的特點。

小結(jié)

簡單回顧一下,容器就是和系統(tǒng)其它部分隔離開來的進程集合,這里的其他部分包括進程、網(wǎng)絡(luò)資源以及文件系統(tǒng)等。而鏡像就是容器所需要的所有文件集合,其具備一次構(gòu)建、到處運行的特點。
?

二、容器的生命周期

容器運行時的生命周期

容器是一組具有隔離特性的進程集合,在使用?docker run?的時候會選擇一個鏡像來提供獨立的文件系統(tǒng)并指定相應(yīng)的運行程序。這里指定的運行程序稱之為?initial?進程,這個?initial?進程啟動的時候,容器也會隨之啟動,當(dāng)?initial?進程退出的時候,容器也會隨之退出。

因此,可以認(rèn)為容器的生命周期和?initial?進程的生命周期是一致的。當(dāng)然,因為容器內(nèi)不只有這樣的一個?initial?進程,initial?進程本身也可以產(chǎn)生其他的子進程或者通過?docker exec?產(chǎn)生出來的運維操作,也屬于?initial?進程管理的范圍內(nèi)。當(dāng)?initial?進程退出的時候,所有的子進程也會隨之退出,這樣也是為了防止資源的泄漏。
?
但是這樣的做法也會存在一些問題,首先應(yīng)用里面的程序往往是有狀態(tài)的,其可能會產(chǎn)生一些重要的數(shù)據(jù),當(dāng)一個容器退出被刪除之后,數(shù)據(jù)也就會丟失了,這對于應(yīng)用方而言是不能接受的,所以需要將容器所產(chǎn)生出來的重要數(shù)據(jù)持久化下來。容器能夠直接將數(shù)據(jù)持久化到指定的目錄上,這個目錄就稱之為數(shù)據(jù)卷。

數(shù)據(jù)卷有一些特點,其中非常明顯的就是數(shù)據(jù)卷的生命周期是獨立于容器的生命周期的,也就是說容器的創(chuàng)建、運行、停止、刪除等操作都和數(shù)據(jù)卷沒有任何關(guān)系,因為它是一個特殊的目錄,是用于幫助容器進行持久化的。簡單而言,我們會將數(shù)據(jù)卷掛載到容器內(nèi),這樣一來容器就能夠?qū)?shù)據(jù)寫入到相應(yīng)的目錄里面了,而且容器的退出并不會導(dǎo)致數(shù)據(jù)的丟失。

通常情況下,數(shù)據(jù)卷管理主要有兩種方式:

  • 第一種是通過?bind?的方式,直接將宿主機的目錄直接掛載到容器內(nèi);這種方式比較簡單,但是會帶來運維成本,因為其依賴于宿主機的目錄,需要對于所有的宿主機進行統(tǒng)一管理。
  • 第二種是將目錄管理交給運行引擎。

三、容器項目架構(gòu)

moby?容器引擎架構(gòu)

moby?是目前最流行的容器管理引擎,moby
daemon?會對上提供有關(guān)于容器、鏡像、網(wǎng)絡(luò)以及?Volume的管理。moby daemon?所依賴的最重要的組件就是?containerd,containerd?是一個容器運行時管理引擎,其獨立于?moby daemon?,可以對上提供容器、鏡像的相關(guān)管理。

containerd?底層有?containerd shim?模塊,其類似于一個守護進程,這樣設(shè)計的原因有幾點:

  • 首先,containerd?需要管理容器生命周期,而容器可能是由不同的容器運行時所創(chuàng)建出來的,因此需要提供一個靈活的插件化管理。而?shim?就是針對于不同的容器運行時所開發(fā)的,這樣就能夠從?containerd?中脫離出來,通過插件的形式進行管理。
  • 其次,因為 shim 插件化的實現(xiàn),使其能夠被?containerd?動態(tài)接管。如果不具備這樣的能力,當(dāng)?moby
    daemon?或者?containerd daemon?意外退出的時候,容器就沒人管理了,那么它也會隨之消失、退出,這樣就會影響到應(yīng)用的運行。
  • 最后,因為隨時可能會對?moby?或者?containerd?進行升級,如果不提供?shim?機制,那么就無法做到原地升級,也無法做到不影響業(yè)務(wù)的升級,因此?containerd
    shim?非常重要,它實現(xiàn)了動態(tài)接管的能力。

本節(jié)課程只是針對于?moby?進行一個大致的介紹,在后續(xù)的課程也會詳細介紹。
?

四、容器?VS VM

容器和?VM?之間的差異

VM?利用?Hypervisor?虛擬化技術(shù)來模擬?CPU、內(nèi)存等硬件資源,這樣就可以在宿主機上建立一個?Guest OS,這是常說的安裝一個虛擬機。

每一個?Guest OS?都有一個獨立的內(nèi)核,比如?Ubuntu、CentOS?甚至是?Windows?等,在這樣的?Guest OS?之下,每個應(yīng)用都是相互獨立的,VM?可以提供一個更好的隔離效果。但這樣的隔離效果需要付出一定的代價,因為需要把一部分的計算資源交給虛擬化,這樣就很難充分利用現(xiàn)有的計算資源,并且每個?Guest OS?都需要占用大量的磁盤空間,比如?Windows?操作系統(tǒng)的安裝需要?10~30G?的磁盤空間,Ubuntu?也需要?5~6G,同時這樣的方式啟動很慢。正是因為虛擬機技術(shù)的缺點,催生出了容器技術(shù)。
?
容器是針對于進程而言的,因此無需?Guest OS,只需要一個獨立的文件系統(tǒng)提供其所需要文件集合即可。所有的文件隔離都是進程級別的,因此啟動時間快于?VM,并且所需的磁盤空間也小于?VM。當(dāng)然了,進程級別的隔離并沒有想象中的那么好,隔離效果相比?VM?要差很多。

總體而言,容器和?VM?相比,各有優(yōu)劣,因此容器技術(shù)也在向著強隔離方向發(fā)展。
?

本文總結(jié)

  • 容器是一個進程集合,具有自己獨特的視圖視角;
  • 鏡像是容器所需要的所有文件集合,其具備一次構(gòu)建、到處運行的特點;
  • 容器的生命周期和?initial?進程的生命周期是一樣的;
  • 容器和?VM?相比,各有優(yōu)劣,容器技術(shù)在向著強隔離方向發(fā)展。
向AI問一下細節(jié)

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

AI