# K8s 建立 Pod 詳細流程 ## 直接產生一個裸 pod 流程圖 ![image](https://hackmd.io/_uploads/By3Wn7gf-x.png) 1. 使用者通過 kubectl run 命令發起一個 pod 創建請求。 2. API server 接收到創建 pod 的請求,並且經過身分驗證、授權以及 admission phase 處理後儲存到 etcd。 3. API server 回傳給使用者產生了一個 pod,但此時 pod 並還沒有真正建立。 4. Scheduler 透過 Watch 機制持續監聽 API server,發現有一個新的 Pod 尚未分配節點,並且根據資源需求和調度策略,決定將 pod 分配到哪個 Worker 節點。 5. Scheduler 將調度結果送回 API server,API server 將節點綁定訊息更新到 etcd。 6. 目標節點上的 Kubelet 透過 Watch 機制持續監聽 API server,發現有新的 Pod 被分配給自己。 7. kubelet 開始進行 Pod 的創建流程。 8. kubelet 呼叫 Container Runtime(docker, containerd 或 CRI-O)來創建 Container,並確保 Container 會建立在 pod 裡面。 9. Container Runtime 找到 Image Registry 下載 image。 10. Container Runtime 將下載的 image 解壓縮到 worker 上(unpack image 變成 bundle)。 11. Container Runtime 使用 OCI Runtime (runc, crun ...等) 來啟動 Container。 12. runc 設置 Container 的 namespace、cgroup、chroot 和 capabilities。 13. runc 執行 App Container 運作的命令。 14. kubelet 會持續監控 pod 的運行狀態。 15. kubelet 將 pod 的狀態(如運行中、失敗等)報告給 API server。 16. API server 將 pod 的最新狀態訊息持續儲存到 etcd 中。 ## kubectl get pod 流程圖 ![image](https://hackmd.io/_uploads/rkrGqxVzlx.png) 1. 使用者通過 kubectl get 命令發起一個 get pod 請求。 2. API server 接收到 get pod 的請求,並且經過身分驗證、授權後跟 etcd 查詢資料。 3. etcd 回傳 pod 資訊給 API server。 4. API server 排版並顯示,回傳給使用者。 ## 創建 deployment 流程圖 ![image](https://hackmd.io/_uploads/HJSCo7xMbg.png) 1. 使用者通過 kubectl create deploy 命令發起一個 deployment 創建請求。 2. API server 接收到創建 deployment 的請求,並且經過身分驗證、授權以及 admission phase 處理後儲存到 etcd。 3. API server 回傳給使用者產生了一個 deployment,但此時 pod 並還沒有真正建立。 4. Controller-Manager 透過 Watch 機制持續監聽 API server,發現有一個新的 deployment 需要創建,此時創建 deployment 後 deployment 還會再去創建自己的 replicaset。 5. Controller-Manager 將創建的結果送回 API server,API server 將會將訊息更新到 etcd。 6. Scheduler 透過 Watch 機制持續監聽 API server,發現有一個新的 Pod 尚未分配節點,並且根據資源需求和調度策略,決定將 pod 分配到哪個 Worker 節點。 7. Scheduler 將調度結果送回 API server,API server 將節點綁定訊息更新到 etcd。 8. 目標節點上的 Kubelet 透過 Watch 機制持續監聽 API server,發現有新的 Pod 被分配給自己。 9. kubelet 創建一個 pod。 10. kubelet 呼叫 Container Runtime(docker, containerd 或 CRI-O)來創建 Container,並確保 Container 會建立在 pod 裡面。 11. Container Runtime 找到 Image Registry 下載 image。 12. Container Runtime 將下載的 image 解壓縮到 worker 上(unpack image 變成 bundle)。 13. Container Runtime 使用 OCI Runtime (runc, crun ...等) 來啟動 Container。 14. runc 設置 Container 的 namespace、cgroup、chroot 和 capabilities。 15. runc 執行 App Container 運作的命令。 16. kubelet 會持續監控 pod 的運行狀態。 17. kubelet 將 pod 的狀態(如運行中、失敗等)報告給 API server。 18. API server 將 pod 的最新狀態訊息持續儲存到 etcd 中。 ### 創建一個 test deployment,並查看 Controller-Manager 的 log * 可以看到 Controller-Manager 產生了 deployment controller ,然後 deployment controller 再去 update 了 replicaset controller。 ![image](https://hackmd.io/_uploads/BybS5SVGel.png) ``` I0528 08:01:29.555150 1 deployment_controller.go:189] "Adding deployment" logger="deployment-controller" deployment="default/test" I0528 08:01:29.555175 1 deployment_controller.go:599] "Started syncing deployment" logger="deployment-controller" deployment="default/test" startTime="2025-05-28 08:01:29.555171072 +0000 UTC m=+807.051773838" I0528 08:01:29.555350 1 deployment_util.go:262] "Updating replica set revision" logger="deployment-controller" replicaSet="default/test-56744d8b7b" newRevision="1" ``` ## 參考 https://kubernetes.io/docs/concepts/architecture/ https://community.veeam.com/kubernetes-korner-90/components-and-processes-for-creating-a-kubernetes-pod-6335