Kubernetes 理解筆記之 Pod

本文筆記記錄對 Pod 的理解。爲了更好的部署運行應用,Pod 是如何設計的,Pod爲什麼這麼設計,如何更好的使用Pod,以及一些API核心字段的使用實例。


一、Pod 的設計思想

Q:爲什麼要有 Pod ?
爲了更好地在 Kubernetes 中部署運行應用

Q:爲什麼 Pod 能更好的運行應用 ?

  1. 首先看應用:
    一個運行在虛擬機中的應用通常是一組進程,而不是一個進程。同時進程之間可能有密切的“協作關係”,使得他們必須部署在同一臺機器上。這裏就有2個重要的點,即應用是一組進程(或者包含很多組件),同時進程間存在密切關係。
  2. 然後看 Pod :
    Pod 其實是 一組共享了某些資源的容器。這裏也就有2點,“一組容器” 和 “共享了某些資源”。
    (1)爲什麼是“一組容器”
    由於容器受限於“單進程模型”(雖然不是隻能運行一個進程,但卻只能管理一個進程),所以 Kubernetes 中需要一種“進程組”的映射,也就是 Pod,來管理一組相互協作的容器。
    (2)爲什麼“共享了某些資源”
    多個密切合作的進程/應用之所以需要部署在一臺機器上,是因爲他們需要訪問共同的資源(比如網絡、存儲、安全等操作系統層面的資源)。所以 Pod 實際上扮演了傳統基礎設施裏“虛擬機”的角色,讓 Pod 裏的所有容器共享同一個Network Namespace,並且可以聲明共享同一個 Volume 等。

二、Pod 使用的思考方式

  • “應用”從傳統環境到容器環境
    一個運行在虛擬機裏的應用,哪怕再簡單,也是被管理在 systemd 或者 supervisord 之下的一組進程,而不是一個進程。這跟本地物理機上應用的運行方式其實是一樣的。這也是爲什麼,從物理機到虛擬機之間的應用遷移,往往並不困難。
    可是對於容器來說,一個容器永遠只能管理一個進程。更確切地說,一個容器,就是一個進程。這是容器技術的“天性”,不可能被修改。所以,將一個原本運行在虛擬機裏的應用,“無縫遷移”到容器中的想法,實際上跟容器的本質是相悖的。

  • “應用”容器化地描述爲一個 Pod 裏的多個容器
    Pod 組織“超親密關係”容器的設計思想,實際上就是希望,當用戶想在一個容器裏跑多個功能並不相關的應用時,應該優先考慮它們是不是更應該被描述成一個 Pod 裏的多個容器。

  • Pod 扮演着“機器/虛擬機”角色
    Pod,實際上是在扮演傳統基礎設施裏“機器/虛擬機”的角色;而容器,則是這個機器裏運行的用戶程序。所以,當需要把一個運行在虛擬機裏的應用遷移到 Docker 容器中時,一定要仔細分析到底有哪些進程(組件)運行在這個虛擬機裏。
    同時把虛擬機想象成 Pod,所以一些描述”機器“的屬性配置就在 Pod 級別進行設置,而不是 Container。比如,配置這個“機器”的網卡(即:Pod 的網絡定義),配置這個“機器”的磁盤(即:Pod 的存儲定義),配置這個“機器”的防火牆(即:Pod 的安全定義)。更不用說,這臺“機器”運行在哪個服務器之上(即:Pod 的調度)。

三、Pod API 的使用

首先要理解:Pod 既然是 Kubernetes 中實際是一種管理應用的”編排對象“,使用設計會落實到 Pod 的 API 設計上,使用起來也自然是 YAML 文件的形式。所以在瞭解了 Pod 使用的思考方式之後,想要實際使用 Pod 就需要掌握 Pod YAML 字段的含義和用法了。另外,Kubernetes 體系中各種控制器也會利用 API 進行 Pod 管理。

Pod API 核心字段:
(Pod API 對象主要是Metadata、Spec 和 Status 三部分。 可以參考 Kubernetes types.go源碼 中的 type Pod struct)

  • Pod 與 Node 相關:NodeSelector、NodeName
  • Pod 內的容器共享 Linux Namespace相關:shareProcessNamespace、hostNetwork、hostIPC、hostPID
  • 最重要的字段 cantainers 配置多個容器:Image(鏡像)、Command(啓動命令)、workingDir(容器的工作目錄)、Ports(容器要開發的端口),以及 volumeMounts(容器要掛載的 Volume)都是構成 Kubernetes 項目中 Container 的主要字段,還有ImagePullPolicy(鏡像拉取策略)、Lifecycle(定義容器狀態發生變化時觸發一系列“鉤子”,postStart、preStop)、livenessProbe(探針,可以定時執行指定命令進行健康檢查然後反饋)
  • Pod 的 hosts 文件配置 HostAliases
  • Pod 的數據持久化 Volumes:普通的有 emptyDir 或者 hostPath 類型,還有”投射數據卷“ projected 類型(一共四種,secret、configMap、downwardAPI,還有一個特殊的secret,ServiceAccountToken,用來保存授權信息和文件)
  • Pod 的恢復機制:restartPolicy(Pod 中容器異常時的恢復策略)

另外,Pod 預設置:
PodPreset 對象,這其中定義的內容會在 Pod 對象被創建之前追加在這個 Pod YAML 字段之上。


參考:
1、《深入剖析Kubernetes | 極客時間》張磊,容器編排和Kubernetes作業管理 前三講
2 、https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/api/core/v1/types.go

發佈了106 篇原創文章 · 獲贊 111 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章