原文地址:

Kubernetes 101: Pods, Nodes, Containers, and Clusters?

medium.com

Kubernetes正在迅速成為在雲中部署和管理軟體的新標準。 然而,Kubernetes提供的所有功能都帶來了陡峭的學習曲線。 作為一個新手,試圖解析官方文檔可能被壓倒。 組成系統有許多不同的部分,很難說哪些部分與你的用例相關。 這篇博文將提供Kubernetes的簡化視圖,但描述他的最重要的組件以及他們如何組合在一起。

首先,讓我們看一下硬體的表示方式

硬體(Hardware)

節點(Nodes)

節點是Kubernetes中計算硬體的最小單元。 它表示集群(cluster)中的單台計算機。 在大多數生產系統中,節點可能是數據中心中的物理機,也可能是託管在雲提供商(如Google Cloud Platform、阿里雲等)上的虛擬機。 但是,不要讓約定限制你; 從理論上講,你幾乎可以使用任何東西創造一個節點。

將機器視為「節點」允許我們插入一個抽象層。 現在,我們可以簡單地將每台機器視為一組可以使用的CPU和RAM資源,而不必擔心任何單個機器的獨特特性。 這樣,任何機器都可以替換Kubernetes集群中的任何其他機器。

集群(The Cluster)

雖然使用單個節點可能很有用,但它不是Kubernetes方式。 通常,您應該將集群視為一個整體,而不是擔心單個節點的狀態。

在Kubernetes中,節點將它們的資源集中在一起以形成更強大的機器。 將程序部署到集群時,它會智能地為您分配工作到各個節點。 如果添加或刪除任何節點,集群將根據需要轉移工作。 對於程序或程序員來說,單個機器實際運行代碼並不重要。

持久卷(Persistent Volumes)

由於無法保證在集群上運行的程序在特定節點上運行,因此無法將數據保存到文件系統中的任何位置。 如果程序試圖將數據保存到文件中以供日後使用,但隨後重新定位到新節點上,則該文件將不再是程序所期望的數據文件。 因此,與每個節點關聯的傳統本地存儲被視為用於保存程序的臨時高速緩存,但是不能期望本地保存的任何數據都保持不變。

為了永久存儲數據,Kubernetes使用持久卷。 雖然所有節點的CPU和RAM資源都由集群有效地池化和管理,但持久性文件存儲卻沒有。 相反,本地或雲驅動器可以作為持久卷附加到集群。 這可以被認為是將外部硬碟插入集群。 持久卷提供可以掛載到集群的文件系統,而不與任何特定節點關聯。

軟體(Software)

容器(Containers)

在Kubernetes上運行的程序打包為Linux容器。 容器是一種被廣泛接受的標準,因此已經有許多可以在Kubernetes上部署的預構建映像(pre-built images)。

容器化(Containerization)允許您創建自包含(self-contained)的Linux執行環境。 任何程序及其所有依賴項都可以捆綁到一個文件中,然後在Internet上共享。 任何人都可以下載容器並將其部署在他們的基礎設施上,只需要很少的配置。 可以通過編程方式創建容器,從而形成強大的CI和CD管道。

可以將多個程序添加到單個容器中,但是如果可能的話,您應該將自己限制為每個容器一個進程。 擁有許多小容器比一個大容器更好。 如果每個容器都具有緊密關注(tight focus),則更新更易於部署,並且問題更易於診斷

Pods

與您過去使用的其他系統不同,Kubernetes不直接運行容器;相反,它將一個或多個容器包裝到稱為pod的更高級的結構中。同一pod中的任何容器將共享相同的資源和本地網路。容器可以輕鬆地與同一個容器中的其他容器進行通信,就像它們位於同一台機器上一樣,同時保持與其他容器的隔離程度。

Pod用作Kubernetes中的複製單元。如果您的應用程序變得過於流行並且單個pod實例無法承載負載,則可以將Kubernetes配置為根據需要將pod的新副本部署到集群中。即使在不負載的情況下,在生產系統中隨時運行多個pod的副本也是標準的,以允許負載平衡和抵抗故障。

Pod可以容納多個容器,但是你應該儘可能限制自己。由於pod是作為一個擴容和縮容的單元,因此pod中的所有容器必須一起擴展,無論其個人需求如何。這導致資源浪費和昂貴的賬單。為了解決這個問題,pod應該保持儘可能小,通常只保持一個主進程及其緊密耦合的輔助容器(這些輔助容器通常稱為「side-cars(側車)」)。

部署(Deployments)

儘管pod是Kubernetes中的基本計算單元,但它們通常不直接在集群上啟動。 相反,pod通常由另一層抽象管理:deployment(部署)。

deployment部署的主要目的是聲明一次應該運行多少個pod副本。 將deployment部署添加到集群後,它將自動啟動請求的pod數量,然後監視它們。 如果pod死亡,deployment部署將自動重新創建它。

使用deployment部署,您不必手動處理pod。 您只需聲明所需的系統狀態,即可自動為您管理。

入口(Ingress)

使用上述概念,您可以創建節點集群,並將pod的deployments部署啟動到集群上。 但是,還有一個問題需要解決:允許外部流量到您的應用程序。

默認情況下,Kubernetes提供pod和外部世界之間的隔離。 如果要與在pod中運行的服務進行通信,則必須打開通信通道。 這被稱為ingress入口。

有多種方法可以向集群添加入口。 最常見的方法是添加入口控制器或負載均衡器。 這兩個選項之間的確切權衡超出了這篇文章的範圍,但是你必須意識到在你使用Kubernetes之前需要處理入口。


推薦閱讀:
相关文章