▪️k8s - Pod
2024-10-30
| 2025-3-19
字數 995閱讀時間 3 分鐘

概要


k8s 創建的最小部屬單位,是一組容器的集合體。 通常會經由 Deployment, Job, StatefulSet 等工作負載管理器 (workload management) 來創建
 
Pod 有以下核心觀念
  • Pod 在生命週期中綁定調度程序,整個生命週期只會被調度一次
    • 綁定 : 將 Pod 分配到特定 Node
    • 調度 : 選擇要使用的 Node
  • Pod 如果被調度完後,該 Node 因發生問題而無法使用,則該 Pod 會永遠不啟動
  • Pod 如果停止了,就不會對同一個 Pod 重啟,只會創建新的 Pod
  • Pod 會根據配置文檔中的 spec:restartPolicy 的設定來管理容器失敗,順序如下
      1. Initial crash (最初崩潰) ⇒ 根據 restartPolicy 的設定立刻重啟
      1. Repeated crashes (反覆崩潰) ⇒ 在 inital crash 之後崩潰,會根據設定延遲回退, 再根據 restartPolicy 設定重啟來防止一直快速重啟導致系統過載
      1. CrashLoopBackOff state ⇒ 這個狀態表示容器一直反覆失敗,且延遲回退正在生效
      1. 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 : 容器停止會因為失敗而終止
 
  • kubernetes
  • label - 編輯標籤config - 管理 kubeconfig 文件
    Loading...