Kubernetes 調度和資源管理

簡介: 本文簡單介紹了一下調度的高級策略,在集群資源緊張的時候也能合理調度資源。

作者 | 子譽 螞蟻金服高級技術專家

Kubernetes 調度過程

首先來看第一部分 - Kubernetes 的調度過程。如下圖所示,畫了一個很簡單的 Kubernetes 集群架構,它包括了一個 kube-ApiServer,一組 Web-hook Controllers,以及一個默認的調度器 kube-Scheduler,還有兩臺物理機節點 Node1 和 Node2,分別在上面部署了兩個 kubelet。

從零開始入門 K8s | Kubernetes 調度和資源管理

我們來看一下,假如要向這個 Kubernetes 集群提交一個 pod,它的調度過程是什麼樣的一個流程?

假設我們已經寫好了一個 yaml 文件,就是下圖中的橙色圓圈 pod1,然後往 kube-ApiServer 裡提交這個 yaml 文件。

從零開始入門 K8s | Kubernetes 調度和資源管理

此時 ApiServer 會先把這個待創建的請求路由給我們的 webhook Controllers 進行校驗。

從零開始入門 K8s | Kubernetes 調度和資源管理

通過校驗之後,ApiServer 會在集群裡面生成一個 pod,此時生成的 pod,它的 nodeName 是空的,並且它的 phase 是 Pending 狀態。在生成了這個 pod 之後,kube-Scheduler 以及 kubelet 都能 watch 到這個 pod 的生成事件,kube-Scheduler 發現這個 pod 的 nodeName 是空的之後,會認為這個 pod 是處於未調度狀態。

從零開始入門 K8s | Kubernetes 調度和資源管理

接下來,它會把這個 pod 拿到自己裡面進行調度,通過一系列的調度算法,包括一系列的過濾和打分的算法後,Schedule 會選出一臺最合適的節點,並且把這一臺節點的名稱綁定在這個 pod 的 spec 上,完成一次調度的過程。

此時我們發現,pod 的 spec 上,nodeName 已經更新成了 Node1 這個 node,更新完 nodeName 之後,在 Node1 上的這臺 kubelet 會 watch 到這個 pod 是屬於自己節點上的一個 pod。

從零開始入門 K8s | Kubernetes 調度和資源管理

然後它會把這個 pod 拿到節點上進行操作,包括創建一些容器 storage 以及 network,最後等所有的資源都準備完成,kubelet 會把狀態更新為 Running,這樣一個完整的調度過程就結束了。

通過剛剛一個調度過程的演示,我們用一句話來概括一下調度過程:它其實就是在做一件事情,即把 pod 放到<strong>合適的 node 上。

這裡有個關鍵字“合適”,什麼是合適呢?下面給出幾點合適定義的特點:

  • 首先要滿足 pod 的資源要求;
  • 其次要滿足 pod 的一些特殊關係的要求;
  • 再次要滿足 node 的一些限制條件的要求;
  • 最後還要做到整個集群資源的合理利用。

做到以上的要求後,可以認為我們把 pod 放到了一個合適的節點上了。

接下來我會為大家介紹 Kubernetes 是怎麼做到滿足這些 pod 和 node 的要求的。

Kubernetes 基礎調度力

下面為大家介紹一下 Kubernetes 的基礎調度能力,Kubernetes 的基礎調度能力會以兩部分來展開介紹:

  1. 第一部分是資源調度——介紹一下 Kubernetes 基本的一些 Resources 的配置方式,還有 Qos 的概念,以及 Resource Quota 的概念和使用方式;
  2. 第二部分是關係調度——在關係調度上,介紹兩種關係場景:pod 和 pod 之間的關係場景,包括怎麼去親和一個 pod,怎麼去互斥一個 pod?pod 和 node 之間的關係場景,包括怎麼去親和一個 node,以及有一些 node 怎麼去限制 pod 調度上來。

如何滿足 Pod 資源要求

點擊鏈接,查看更多內容

關鍵字:kubernetes 調度 入門 Pod Node


分享到:


相關文章: