Kubernetes第101課:基本概念介紹

原文鏈接:https://medium.com/google-cloud/kubernetes-101-pods-nodes-containers-and-clusters-c1509e409e16

在云技術(shù)領(lǐng)域,Kubernetes飛快地成為了配置和管理軟件的新標(biāo)準(zhǔn)。然而強(qiáng)大的功能意味著陡峭的學(xué)習(xí)曲線,學(xué)習(xí)官方文檔對于初學(xué)者來說是一項十分艱巨的任務(wù)。整個系統(tǒng)由許多不同的部分組成,很難說清楚哪些部分與你的項目相關(guān)。這篇文章試圖從一個高度概括的視角介紹大部分重要的概念以及它們之間的關(guān)系。

首先,我們來看一下硬件是怎樣表示的。

硬件

節(jié)點

節(jié)點是Kubernetes中計算硬件的最小單元,它代表集群中的一臺機(jī)器。在大多數(shù)生產(chǎn)環(huán)境中,節(jié)點是一個數(shù)據(jù)中心中的物理機(jī),或者架設(shè)在云平臺上(例如Google Cloud Platform)的一臺虛擬機(jī)。但不管怎么樣,不要被慣性思維所拘束。理論上來講,一個節(jié)點幾乎可以是任何東西。

將一臺機(jī)器看做一個“節(jié)點”可以讓我們對這些抽象概念產(chǎn)生新的理解?,F(xiàn)在,我們不再考慮任何一臺機(jī)器的個體特征,而是簡單的將每臺機(jī)器看作一組可以利用的CPU和RAM。這樣的話,一個Kubernetes集群中的任意兩臺機(jī)器都可以彼此代替。

集群

盡管單獨處理某個節(jié)點會十分有效,但這并不是Kubernetes的工作方式。一般我們會把整個集群看作一個整體,而不去單獨考慮每個節(jié)點的狀態(tài)。

在Kubernetes中,節(jié)點中所包含的資源聚集在一起,共同形成一臺更強(qiáng)大的機(jī)器。當(dāng)你把程序部署到集群上時,它會將任務(wù)智能地分配到不同的節(jié)點上。如果某些節(jié)點被添加或者移除,集群會在必要時將任務(wù)轉(zhuǎn)移給其它節(jié)點。究竟是哪些機(jī)器實際在運行代碼不會對程序或者程序員產(chǎn)生任何影響,

如果這種像蜂群思維一樣的系統(tǒng)讓你聯(lián)想到星際迷航中的Borg,那你就對了:“Borg”是Google的內(nèi)部項目,是Kubernetes構(gòu)建的基礎(chǔ)。

持久卷

由于運行在集群上的程序不能保證始終運行在一個特定的節(jié)點上,所以數(shù)據(jù)不能存儲在文件系統(tǒng)中一個任意的位置上。設(shè)想這樣的場景,如果一個程序想要稍后把數(shù)據(jù)存儲到某個文件中,但這個文件隨即遷移到了一個新的節(jié)點上,程序便不能再把數(shù)據(jù)存儲到預(yù)想的位置了?;谶@種原因,數(shù)據(jù)無法永久的存儲在本地,所以每個節(jié)點的本地存儲都被視為臨時緩存,用來運行程序。

為了可以永久性的存儲數(shù)據(jù),Kubernetes使用持久卷。雖然所有節(jié)點的CPU和RAM都由集群進(jìn)行有效地集中和管理,但持久性的文件存儲并不如此。無論是本地還是云端的驅(qū)動都可以依附在集群上作為持久卷使用,我們可以將它們看作插入集群的外部硬件驅(qū)動。持久卷提供了一個可以安裝在集群上的文件系統(tǒng),而且它不會與任何特定的節(jié)點產(chǎn)生聯(lián)系。

軟件

容器

在Kubernetes上運行的程序都會被打包成Linux容器。容器已經(jīng)是一個被廣泛接受的標(biāo)準(zhǔn),所以有很多預(yù)構(gòu)建的鏡像可以直接在Kubernetes上進(jìn)行部署。

使用容器進(jìn)行集裝箱化管理可以創(chuàng)建出像Linux一樣獨立的執(zhí)行環(huán)境。任何程序及其依賴都可以打包到一個文件中,并在云端進(jìn)行共享。所有人都可以下載這個容器,通過非常簡單的配置就可以將它部署到自己的設(shè)備上。容器可以通過程序來創(chuàng)建,這就為持續(xù)集成與流水線化發(fā)布創(chuàng)造了條件。

多個程序可以被添加到同一個容器中,但是一個容器應(yīng)該盡可能只運行一個進(jìn)程。讓多個容器分別運行多個進(jìn)程比一個容器同時運行很多個進(jìn)程要好得多。這樣每個容器都更容易被監(jiān)控,部署更新和診斷錯誤也將變得更加容易。

Pods

Kubernetes不像你過去用過的其它系統(tǒng),它不直接運行容器,而是將一個或多個容器打包在一個更高的結(jié)構(gòu)中,這個結(jié)構(gòu)就是pod。同一個pod中的所有容器共享資源和局域網(wǎng),它們可以像在同一臺機(jī)器中一樣方便地交流,同時也能保持彼此獨立。

Pods是Kubernetes中的最小單元。如果你的應(yīng)用非常受歡迎,以至于一個pod實例無法承載這么大的負(fù)荷,這時可以通過配置Kubernetes在集群中為你的pod部署新的副本。即使不是在超負(fù)荷的情況下,通常也會在生產(chǎn)環(huán)境中同時運行多個pod,來平衡負(fù)載量和避免錯誤的發(fā)生。

一個pod可以容納多個容器,但盡可能不要容納太多。在按比例增加或減少pod的時候,不會考慮到內(nèi)部的某個容器,而是會一起進(jìn)行縮放。這會導(dǎo)致資源的浪費和高昂的成本。為了避免這個問題,應(yīng)該盡可能讓pod保持輕量級,一般來說,一個pod中只運行一個主進(jìn)程和與之緊密耦合的幫助型容器(這些幫助容器像“助力車的輪子一樣”)。

部署

盡管pod是Kubernetes的基本計算單元,但它們并不直接在集群上啟動,而是通常由部署控制器進(jìn)行管理。

部署的主要目的是聲明一次性運行pod副本的個數(shù)。當(dāng)一個部署被加到集群中后,它會自動啟動相應(yīng)數(shù)量的pod,然后對它們進(jìn)行監(jiān)控。如果一個pod消亡了,部署會自動重新創(chuàng)建一個。

通過部署,可以不用手動管理pods。只需要聲明一個系統(tǒng)的理想狀態(tài),它就會自動進(jìn)行管理。

Ingress

通過上文所介紹的概念,你可以創(chuàng)建一個包含多個節(jié)點的集群,然后在集群上啟動部署,實現(xiàn)對pod的管理?,F(xiàn)在只剩下最后一個問題:如何讓你的應(yīng)用可以對外通信。

默認(rèn)情況下,Kubernetes為pod和pod之間,pod和外部環(huán)境提供隔離。如果你想要和pod中運行的服務(wù)進(jìn)行通信,你需要開啟一個交流通道,即ingress。

有很多種方式為你的集群添加ingress,最常用的方法是添加Ingress controller或者LoadBalancer(負(fù)載均衡)。如何在這兩種方法中進(jìn)行選擇超出了本文的討論范圍,但在你開始試用Kubernetes之前,需要先解決ingress的問題。

下一步

本文所討論的概念是簡化后的Kubernetes,但它可以幫助你快速開始試用?,F(xiàn)在你已經(jīng)了解了構(gòu)成系統(tǒng)的組件,是時候用它們來部署一個實際的應(yīng)用了。你可以通過閱讀我的下一篇文章《Kubernetes第110課:第一次部署》來起步。

當(dāng)你在本地使用Kubernetes時,Minikube會在你的硬盤上創(chuàng)建一個虛擬的集群。如果你想要嘗試使用云端服務(wù),可以參考Google Kubernetes Engine提供的一系列新手教程。

如果你剛開始接觸容器化和網(wǎng)絡(luò)基礎(chǔ)架構(gòu),我建議你熟讀“應(yīng)用的12個要素”。它介紹了一些設(shè)計應(yīng)用過程中的最佳實踐方法,幫助你的應(yīng)用在諸如Kubernetes這樣的環(huán)境中運行。

最后,如果你想獲取更多相似內(nèi)容,可以在Medium上關(guān)注Daniel Sanche或者在Twitter上關(guān)注@DanSanche21。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容