前幾天我們深入了解了 Kubernetes 的核心組件,今天要來聊聊當我們 向 Kubernetes 發出建立 Pod 的請求 時,背後到底發生了哪些事情,Pod 是如何被建立出來的。透過認識這個過程,希望能讓讀者在開發或維護 Kubernetes 時,更加順暢且安心。
圖檔來源 Kubernetes 官方文件
當你使用 kubectl 指令時,kubectl 這個指令行工具會在 Client 端進行以下任務:
基本檢核:kubectl 會在本地進行一些基本的檢查,例如語法錯誤或無效的資源名稱,將明顯不會成功的請求在 Client 端返回錯誤訊息,減少 kube-apiserver 的壓力。此外,kubectl 會將可用的資源版本規範,使用 OpenAPI 格式快取在本地 ~/.kube/cache 目錄中,並在操作時根據這些規範進行初步檢查。
客戶端身份憑證:kubectl 會根據以下優先順序來尋找身份憑證,用於後續與 kube-apiserver 進行身份驗證:
將指令封裝成 Http 請求:kubectl 會將操作封裝成 HTTP 請求,透過 RESTful API 發送至 kube-apiserver,完成對 Kubernetes 資源的操作。
如同 Day-02-Kubernetes Architecture 介紹 - Control Plane 所述,所有的 Kubernetes 資源操作都必須通過 kube-apiserver 提供的 RESTful API 來進行,kubectl 也不例外。
圖檔來至: itnext.io/what-happens-when-you-create-a-pod-in-kubernetes
如同先前說明的,kubectl 會透過 OpenAPI 格式找到適合的 API enpint 並進行格式校驗後,將 身份憑證 與 操作資源 的 payload 封裝成 Http Request 送往 kube-apiserver
圖檔來至: itnext.io/what-happens-when-you-create-a-pod-in-kubernetes
當 kube-apiserver 收到 HTTP Request 請求後,會首先從中取得身份憑證,並進行身份認證(Authentication),確認該用戶是否為此 Cluster 的合法用戶。接著,進行授權(Authorization),檢查該用戶是否具備操作該資源的權限。
在通過認證(Authentication)和授權(Authorization)後,請求還必須通過 Admission controllers 的檢查。Admission controllers 是一組處理鏈,它們具備兩種主要功能:
以下是常見的 Admission controllers:
終於通過層層檢查,讓建立 Pod 的請求內容,送到了 Kubernetes 的資料庫:etcd
。
然而 Pod 尚未真的被建立出來,而是處於 Pending
的狀態,代表 Scheduler 尚未幫這個 Pod 找到適合的家。
📘 關於 Pod 的狀態機,能參考官方文件
圖檔來至: itnext.io/what-happens-when-you-create-a-pod-in-kubernetes
當 scheduler 從 kube-apiserver 發現有處於 Pending 狀態的 Pod 時,它會進行兩個主要階段的操作:
最後,scheduler 會使用 kube-apiserver 的 API 將 Pod 與選中的 Node 綁定(Binding)。
📘 這裡的綁定(Binding)是指 scheduler 更新 Pod 的 spec.nodeName
欄位。scheduler 並不是負責實際建立 Pod 的組件,Pod 的實際啟動由該 Node 上的 kubelet 負責。
到目前為止,這個 Pod 的資訊仍只是一筆存在 etcd 中的資料,尚未有任何 container 因為這個操作而被啟動。
今天介紹了 建立 Pod 旅程的前半段,這些事件大多都發生在 Control Plane 中
kubectl
指令送出建立 Pod 的請求到 kube-apiserver
kube-apiserver
中進行 認證、授權、Admission controllers 校驗,最終持久化到 etcd。scheduler
依據調度策略找到最適合該 Pod 的 Node。明天會繼續介紹,建立 Pod 旅程的後半段,關於 worker node 的組件如何接手處理這筆 Pod 的資料。