簡介: 本文簡單介紹了一下調度的高級策略,在集群資源緊張的時候也能合理調度資源。
作者 | 子譽 螞蟻金服高級技術專家
Kubernetes 調度過程
首先來看第一部分 - Kubernetes 的調度過程。如下圖所示,畫了一個很簡單的 Kubernetes 集群架構,它包括了一個 kube-ApiServer,一組 Web-hook Controllers,以及一個默認的調度器 kube-Scheduler,還有兩臺物理機節點 Node1 和 Node2,分別在上面部署了兩個 kubelet。
我們來看一下,假如要向這個 Kubernetes 集群提交一個 pod,它的調度過程是什麼樣的一個流程?
假設我們已經寫好了一個 yaml 文件,就是下圖中的橙色圓圈 pod1,然後往 kube-ApiServer 裡提交這個 yaml 文件。
此時 ApiServer 會先把這個待創建的請求路由給我們的 webhook Controllers 進行校驗。
通過校驗之後,ApiServer 會在集群裡面生成一個 pod,此時生成的 pod,它的 nodeName 是空的,並且它的 phase 是 Pending 狀態。在生成了這個 pod 之後,kube-Scheduler 以及 kubelet 都能 watch 到這個 pod 的生成事件,kube-Scheduler 發現這個 pod 的 nodeName 是空的之後,會認為這個 pod 是處於未調度狀態。
接下來,它會把這個 pod 拿到自己裡面進行調度,通過一系列的調度算法,包括一系列的過濾和打分的算法後,Schedule 會選出一臺最合適的節點,並且把這一臺節點的名稱綁定在這個 pod 的 spec 上,完成一次調度的過程。
此時我們發現,pod 的 spec 上,nodeName 已經更新成了 Node1 這個 node,更新完 nodeName 之後,在 Node1 上的這臺 kubelet 會 watch 到這個 pod 是屬於自己節點上的一個 pod。
然後它會把這個 pod 拿到節點上進行操作,包括創建一些容器 storage 以及 network,最後等所有的資源都準備完成,kubelet 會把狀態更新為 Running,這樣一個完整的調度過程就結束了。
通過剛剛一個調度過程的演示,我們用一句話來概括一下調度過程:它其實就是在做一件事情,即把 pod 放到<strong>合適的 node 上。
這裡有個關鍵字“合適”,什麼是合適呢?下面給出幾點合適定義的特點:
- 首先要滿足 pod 的資源要求;
- 其次要滿足 pod 的一些特殊關係的要求;
- 再次要滿足 node 的一些限制條件的要求;
- 最後還要做到整個集群資源的合理利用。
做到以上的要求後,可以認為我們把 pod 放到了一個合適的節點上了。
接下來我會為大家介紹 Kubernetes 是怎麼做到滿足這些 pod 和 node 的要求的。
Kubernetes 基礎調度力
下面為大家介紹一下 Kubernetes 的基礎調度能力,Kubernetes 的基礎調度能力會以兩部分來展開介紹:
- 第一部分是資源調度——介紹一下 Kubernetes 基本的一些 Resources 的配置方式,還有 Qos 的概念,以及 Resource Quota 的概念和使用方式;
- 第二部分是關係調度——在關係調度上,介紹兩種關係場景:pod 和 pod 之間的關係場景,包括怎麼去親和一個 pod,怎麼去互斥一個 pod?pod 和 node 之間的關係場景,包括怎麼去親和一個 node,以及有一些 node 怎麼去限制 pod 調度上來。
如何滿足 Pod 資源要求
點擊鏈接,查看更多內容
關鍵字:kubernetes 調度 入門 Pod Node
閱讀更多 有隻黑白貓 的文章