前言
本篇是Kubernetes第四篇,大家一定要把環境搭建起來,看是解決不了問題的,必須實戰。從現在開始都是重要的核心概念,此篇偏一些Pod的概念介紹,后續每篇都會有實戰。
Kubernetes系列文章:
什么是Pod
Pod是一個或一個以上的 容器(例如Docker容器)組成的,且具有共享存儲/網絡/UTS/PID的能力,以及運行容器的規范。並且在Kubernetes中,Pod是最小的可被調度的原子單位。

Pod就像是我們的一個虛擬機,上面除了運行我們的主應用程序之外,還可以運行一個與該應用緊密相關的進程。如日志收集工具、Git文件拉取器、配置文件更新重啟器等。因為在Kubernetes中,一個Pod里的所有容器都只會被分配到同一台主機上運行。
為什么是Pod
-
對於容器來說采用單進程模型,不具備管理多個進程的能力,當我們想實現多個容器被綁定在一起進行管理的時候,容器就不能滿足我們,我們可以制作為鏡像,顯然這是很麻煩的; -
對於容器來說,與其它容器是完全隔離的,通常情況下,無法與其它容器共享網絡、存儲。只能通過暴露的端口進行相互訪問,當容器之間存在共享存儲並且相互依賴的時候,容器就不能滿足我們;
由於容器不能滿足以上情況,因此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定義一些元數據,方便進行資源管理,大致分為是三種維度:
-
NameSpace: 命名空間划分可以按照業務域或者團隊,當然如果集群數量太少其實沒必要的; -
Labels: 標簽能夠附加於 Kubernetes 的任何資源對象之上,可以在資源創建時指定,也可以隨時按需添加在活動對象之中,由標簽選擇器進行匹配檢查完成資源篩選。一個對象可擁有不止一個標簽,而同一個標簽也可以被添加至多個資源之上。在實踐中可以按照多個不同維度的標簽以實現靈活的資源分組管理功能,可以分為版本標簽、環境標簽、應用標簽等等; -
Annotation: 與標簽類似,注解也是“鍵值”類型的數據,不過它不能用於標簽及篩選 Kubernetes 對象,僅可用於為資源提供“元數據”信息。另外,注解中的元數據不受字符數量的限制,它可大可小,可以為結構化或非結構化形式,也支持使用在標簽中禁止使用的其他字段;
spec

spec可以分為兩類:一類為pod相關的,另外一類是容器相關的;凡是調度、網絡、存儲,以及安全相關的屬性,基本上是 Pod 級別的,主要包括分為以下六種屬性,可能漏掉的大家可以留言,我補充:
-
NodeSelector: 設置NodeSelector表示將該Pod調度到包含這個label的node上; -
NodeName: 將Pod調度到指定的Node節點上,指定了nodeName的Pod會直接跳過Scheduler的調度邏輯,直接寫入PodList列表; -
Volumes: 關於容器數據持久化的卷的定義,大致分為三類emptyDir、hostPath和projected,容器上有關於卷的掛載都是和pod相關的,圖上圖已經將每種卷的用途已經寫明白了,大家可以認真閱讀; -
RestartPolicy: Pod重啟策略,分為三種Always、OnFailure、Never,后續還會有單獨欄目專門來講解Pod重啟策略,這里先大致了解一下; -
探針: 關於探針部分會在Pod的生命周期篇章中詳細介紹,這里記住是三種類型:LivenessProbe、ReadinessProbe、StartupProbe; -
hostNetwork: 是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡,容器上有關端口的定義與Pod的網絡也是不可分割的;
對於容器相關的屬性,其實也離不開容器相關的鏡像、容器網絡、啟動參數、環境、資源限制、掛載目錄,看過之前我Docker介紹應該很容易理解這些配置文件的定義:
-
Name: 定義容器的名稱; -
Image: 拉取鏡像名稱; -
ImagePullPolicy: 鏡像拉取的策略,包括Always、ifNotPresent、Never,Always總數拉取鏡像倉庫的鏡像,如果標簽是lastest那么說明每次都是拉取最新鏡像;ifNotPresent僅當本地鏡像缺失時方才從目標倉庫下載鏡像,Never禁止從倉庫下載鏡像,僅使用本地鏡像; -
ports: 主要定義容器關於網絡的參數,控制主要是Pod; -
容器啟動命令參數:command容器的啟動命令列表,args傳入的命名參數,類似於Dockerfile 中 ENTRYPOINT 定義義; -
環境變量: env主要用於指定容器的環境變量; -
resources: 現在容器使用的CPU、內存相關的資源; -
容器的卷: workingDir指定容器工作的目錄,volumeMounts用於指定掛載到容器內部的存儲卷配置;
結束
歡迎大家點點關注,點點贊!