‣
概要
k8s 創建的最小部屬單位,是一組容器的集合體。
通常會經由 Deployment, Job, StatefulSet 等工作負載管理器 (workload management) 來創建
Pod 有以下核心觀念
- Pod 在生命週期中有
綁定
跟調度
程序,整個生命週期只會被調度一次 - 綁定 : 將 Pod 分配到特定 Node
- 調度 : 選擇要使用的 Node
- Pod 如果被調度完後,該 Node 因發生問題而無法使用,則該 Pod 會永遠不啟動
- Pod 如果停止了,就不會對同一個 Pod 重啟,只會創建新的 Pod
- Pod 會根據配置文檔中的
spec:restartPolicy
的設定來管理容器失敗,順序如下 - Initial crash (最初崩潰)
⇒ 根據
restartPolicy
的設定立刻重啟 - Repeated crashes (反覆崩潰)
⇒ 在 inital crash 之後崩潰,會根據設定延遲回退,
再根據
restartPolicy
設定重啟來防止一直快速重啟導致系統過載 - CrashLoopBackOff state ⇒ 這個狀態表示容器一直反覆失敗,且延遲回退正在生效
- Backoff reset ⇒ 如果容器成功運行一段時間,則容器會重製機制,將接下來新的崩潰設定為 initial crash
- Pod 終止一開始會使用 SIGTEAM 訊號來嘗試停止容器,如果停止容器超過時限(預設 30 秒)時,才會用 KILL 來終止容器
網路
- 同一 Pod 中的 container 可以相互通信
- 同一 node 中的 不同 Pod 可以相互通信
- 不同 node 中的 不同 Pod 可以相互通信
- 在同一叢集中,任意 node 都可以相互通信 Pod
創建
通常會藉由 workload management 來創建,但如果要單獨創建可使用以下
run - 創建 Pod使用 Kind : Pod 的方式應用
apply - 根據配置文件創建或更新資源apply
配置
定義
Static Pod
- 由 kubelet 創建,kubelet 會自動創建和重啟這些pod
- Static Pod 不會出現在 Kubernetes API 伺服器中,因此無法通過
kubectl
指令進行管理
- Static Pod 的配置文件放置在 kubelet 的配置目錄中(
/etc/kubernetes/manifests
) 所以在這目錄底下配置的 yaml 文件就會以 static pod 創建
Pod Phase (Pod 階段)
Pod 階段 (phase) 跟 狀態 (status) 不同,不要搞混
Pod 生命週期可根據宏觀還簡單分類成以下階段
Pending
(等待中)- Pod 已被創建但還未完全運行
- 可能正在下載鏡像或等待調度
Running
(運行中)- Pod 已經被綁定到節點
- 所有容器都已被創建
- 至少有一個容器仍在運行或正在啟動/重啟
Succeeded
(成功)- Pod 中所有容器都已成功終止
- 容器不會再重啟
Failed
(失敗)- Pod 中所有容器都已終止
- 至少有一個容器是以失敗狀態終止
Unknown
(未知)- 無法獲取 Pod 的狀態
- 通常是因為節點通信問題
如果我們刪除 Pod ,k8s 會將 Pod 轉換到終止階段 (Succeeded or Failed) ,
然後才從 api-server 中刪除。
Pod Status (Pod 狀態)
Pod 階段 (phase) 跟 狀態 (status) 不同,不要搞混
Pod Status 提供了更詳細的容器狀態信息:
- PodScheduled
- Pod 已被調度到節點上
- ContainersReady
- Pod 中所有容器都準備就緒
- Initialized
- 所有 init 容器都已完成
- Ready
- Pod 可以提供服務
- 已被添加到負載均衡池中
Container Status (容器狀態)
一旦調度器將 Pod 調度給特定節點時,kubelet 會通過 container runtime 追蹤 Pod 中的容器狀態
容器狀態分為以下幾種
Waiting
: 等待容器啟動前所需的操作執行完畢等。
Running
: 容器正在運行
Terminated
: 容器停止會因為失敗而終止