傲視Kubernetes(三):Kubernetes中的Pod

淡墨痕發表於2020-12-13

從本文開始,將正式開始Kubernetes的核心內容學習。首先要了解的是Pod,總共大約分為六篇左右,本篇是第一篇,相信學完之後,我們會對Pod有一個整體的理解。

本文內容:

1、什麼是Pod

2、Pod的特性

 

一、什麼是Pod

Pod是Kubernetes中最基本的排程、管理單元,其他的Kubernetes物件比如各種controller、svc,都是對Pod的動態管理和使用。可以說,Pod是Kubernetes中最核心的定義,沒有之一。

Kubernetes規定,每個Pod必須執行在一個Node上。Node在Kubernetes中的概念類似於物理主機,而每個Pod就是執行在物理主機上的虛擬機器,這樣的對比雖然不那麼嚴謹,但有助於開始的理解。下面是它們的關係圖:

 

 上圖中每個Pod中都可以有一個至多個容器,此處的容器指的就是docker中的容器(當然也支援其他的容器化技術),容器中執行的就是我們的程式碼。可以看出來,Kubernetes的設計者將容器與對容器的管理分開了,中間加了一層Pod來負責生命週期的管控,如果容器執行過程中由於環境異常導致Pod掛掉,則Kubernetes會建立新的Pod重新執行容器,通過分層達到更好的管控效果。

雖然一個Pod中可以執行多個容器,但通常,還是建議一個Pod同一時間只執行一個容器,分散部署可以更好的利用Pod的擴縮容能力。

二、Pod的特性

既然上面說了Pod類似於執行在宿主機上的虛擬機器,那麼Pod本身有什麼特性呢?它和虛擬機器的區別點又是什麼?

先來看Pod與虛擬機器的區別。在本系列的第二篇文章中,提到過docker容器與虛擬機器的區別與聯絡,其實一個docker容器的體量是比虛擬機器小的,相較而言,Pod更像虛擬機器。它們都能執行多個容器,有獨立的網路名稱空間。最大的區別還是虛擬機器有自己的作業系統。

再來看Pod本身的特性。每個Pod都有獨立的Linux名稱空間和linux控制組(cgroup),前者可以使每個Pod有自己的系統檢視,包括檔案、程式、主機名等,後者可以使每個Pod有自己的系統資源,比如CPU、記憶體、網路頻寬等。Kubernetes會給每個Pod分配一個獨立的虛擬IP,這個IP在當前Kubernetes叢集中是唯一的。

下面是幾個相關問題:

1、Pod中的多個容器問題及解決

對於普通的docker容器來說,每個容器都有自己的PID linux名稱空間,即容器內的程式系列號是獨立的,完全可能與另一個容器內的PID相同。而且每個容器都有獨立的檔案系統

但容器的上述特性,尤其是獨立程式系列號的特性,會給一個Pod中的多個容器產生麻煩。Kubernetes是如何解決的?它通過配置docker來讓一個Pod內的所有容器共享相同的linux名稱空間,所以它們就有了相同程式樹,並且都共享相同的主機名和網路介面。第二個特性【每個容器有獨立的檔案系統】,Kubernetes提供了共享檔案目錄來解決檔案不共享的問題,共享檔案在後面會進行學習。

此處還需注意,由於同一Pod的多個容器共享同一個網路名稱空間,所以埠不能衝突。

2、Pod中的多容器之間以及Pod間的通訊

同一Pod中的多容器具有相同的loopback網路介面,所以可以用localhost+埠進行通訊

Kubernetes的所有Pod處於同一個共享網路地址空間中,所以Pod間可以通過Pod的ip來進行訪問,它們之間沒有網路地址轉換閘道器(NAT),可以像區域網一樣通訊。

 

本篇就到這裡,下一篇將學習Pod的建立及使用。

 

相關文章