1. 程式人生 > 其它 >Kubernetes之Pod介紹

Kubernetes之Pod介紹

什麼是Pod

Pod是一個或一個以上的 容器(例如Docker容器)組成的,且具有共享儲存/網路/UTS/PID的能力,以及執行容器的規範。並且在Kubernetes中,Pod是最小的可被排程的原子單位。

Pod就像是我們的一個虛擬機器,上面除了執行我們的主應用程式之外,還可以執行一個與該應用緊密相關的程序。如日誌收集工具、Git檔案拉取器、配置檔案更新重啟器等。因為在Kubernetes中,一個Pod裡的所有容器都只會被分配到同一臺主機上執行。

為什麼是Pod

  1. 對於容器來說採用單程序模型,不具備管理多個程序的能力,當我們想實現多個容器被繫結在一起進行管理的時候,容器就不能滿足我們,我們可以製作為映象,顯然這是很麻煩的;
  2. 對於容器來說,與其它容器是完全隔離的,通常情況下,無法與其它容器共享網路、儲存。只能通過暴露的埠進行相互訪問,當容器之間存在共享儲存並且相互依賴的時候,容器就不能滿足我們;

由於容器不能滿足以上情況,因此Kubernetes就設計出來Pod的概念,對於Pod來說可以包含一個或者多個容器,這樣對於多個容器需要一起部署的情況就迎刃而解。此外每個Pod來說都執行著一個特殊的被稱之為Pause的容器,其他容器被稱為業務容器,業務容器共享Pause容器的網路棧和Volume掛載卷,因此他們之間通訊和資料交換更為高效。在設計時可以充分利用這一特性,將一組密切相關的服務程序放入同一個Pod中;同一個Pod裡的容器之間僅需通過localhost就能互相通訊。

此外Pod還可以定義Init Container,如果為一個 Pod 指定了多個 Init 容器,這些Init容器會按順序逐個執行。每個 Init 容器都必須執行成功,下一個才能夠執行。當所有的 Init 容器執行完成時,Kubernetes 才會為 Pod 初始化應用容器。如果Pod的Init容器失敗,Kubernetes會不斷地重啟Pod,直到Init容器成功為止。

Init Container讓我們解決當容器存在依賴關係時候的啟動問題,比較經典的案例就是war和Tomcat之間的依賴問題,我們可以將war定義為Init Container,之後在啟動Tomcat。

Pod配置檔案介紹

Pod相關配置大致分為五類,這裡重點介紹spec、metadata相關配置,關於version其實沒有太多說的,kind會在後面型別介紹說明,status會在Pod的生命週期中介紹。

metadata

關於metadata就是給pod定義一些元資料,方便進行資源管理,大致分為是三種維度:

  1. NameSpace: 名稱空間劃分可以按照業務域或者團隊,當然如果叢集數量太少其實沒必要的;
  2. Labels: 標籤能夠附加於 Kubernetes 的任何資源物件之上,可以在資源建立時指定,也可以隨時按需新增在活動物件之中,由標籤選擇器進行匹配檢查完成資源篩選。一個物件可擁有不止一個標籤,而同一個標籤也可以被新增至多個資源之上。在實踐中可以按照多個不同維度的標籤以實現靈活的資源分組管理功能,可以分為版本標籤、環境標籤、應用標籤等等;
  3. Annotation: 與標籤類似,註解也是“鍵值”型別的資料,不過它不能用於標籤及篩選 Kubernetes 物件,僅可用於為資源提供“元資料”資訊。另外,註解中的元資料不受字元數量的限制,它可大可小,可以為結構化或非結構化形式,也支援使用在標籤中禁止使用的其他欄位;
spec

spec可以分為兩類:一類為pod相關的,另外一類是容器相關的;凡是排程、網路、儲存,以及安全相關的屬性,基本上是 Pod 級別的,主要分為以下六種屬性

  1. NodeSelector: 設定NodeSelector表示將該Pod排程到包含這個label的node上;
  2. NodeName: 將Pod排程到指定的Node節點上,指定了nodeName的Pod會直接跳過Scheduler的排程邏輯,直接寫入PodList列表;
  3. Volumes: 關於容器資料持久化的卷的定義,大致分為三類emptyDir、hostPath和projected,容器上有關於卷的掛載都是和pod相關的,圖上圖已經將每種卷的用途已經寫明白了,大家可以認真閱讀;
  4. RestartPolicy: Pod重啟策略,分為三種Always、OnFailure、Never,後續還會有單獨欄目專門來講解Pod重啟策略,這裡先大致瞭解一下;
  5. 探針: 關於探針部分會在Pod的生命週期篇章中詳細介紹,這裡記住是三種類型:LivenessProbe、ReadinessProbe、StartupProbe;
  6. hostNetwork: 是否使用主機網路模式,預設為false,如果設定為true,表示使用宿主機網路,容器上有關埠的定義與Pod的網路也是不可分割的;

對於容器相關的屬性,其實也離不開容器相關的映象、容器網路、啟動引數、環境、資源限制、掛載目錄,看過之前我Docker介紹應該很容易理解這些配置檔案的定義:

  1. Name: 定義容器的名稱;
  2. Image: 拉取映象名稱;
  3. ImagePullPolicy: 映象拉取的策略,包括Always、ifNotPresent、Never,Always總數拉取映象倉庫的映象,如果標籤是lastest那麼說明每次都是拉取最新映象;ifNotPresent僅當本地映象缺失時方才從目標倉庫下載映象,Never禁止從倉庫下載映象,僅使用本地映象;
  4. ports: 主要定義容器關於網路的引數,控制主要是Pod;
  5. 容器啟動命令引數:command容器的啟動命令列表,args傳入的命名引數,類似於Dockerfile 中 ENTRYPOINT 定義義;
  6. 環境變數: env主要用於指定容器的環境變數;
  7. resources: 現在容器使用的CPU、記憶體相關的資源;
  8. 容器的卷: workingDir指定容器工作的目錄,volumeMounts用於指定掛載到容器內部的儲存卷配置;