iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Kubernetes

Kubernetes三十天就上手系列 第 24

Day 24- 深入理解 Kubernetes 的調度器

  • 分享至 

  • xImage
  •  

深入理解 Kubernetes 的調度器

調度器的工作原理和自定義調度

Kubernetes 調度器是 Kubernetes Cluster 的核心組件之一,負責將 Pod 調度到適合的節點上運行。調度器在 Pod 的生命周期中扮演著非常重要的角色,它決定了應用程式如何在 Cluster 中進行分佈,以確保資源利用最大化並滿足特定的部署需求。今天,我們將深入探討 Kubernetes 調度器的工作原理,並了解如何進行自定義調度。

調度器的工作原理

  1. 調度器的基本概念

    • Kubernetes 調度器(Kube-scheduler)是一個獨立的服務,負責將尚未分配到節點的 Pod 分配到適合的節點上。
    • 調度器會考慮多種因素來選擇最合適的節點,包括資源需求(CPU、RAM 等)、節點的健康狀態、Pod 的親和性/反親和性策略、節點的可用性區域等。
  2. 調度流程

    • Pending 階段:當 Pod 被創建後,Kubernetes API 服務器會將該 Pod 標記為 Pending 狀態,並將其放入調度隊列中等待調度。
    • 節點篩選(Filtering):調度器首先根據資源需求和其他硬性約束來篩選出能夠滿足 Pod 需求的節點。
    • 節點打分(Scoring):對於篩選出的節點,調度器會根據一系列打分算法對它們進行評分,評分最高的節點將被選擇來運行該 Pod。
    • 綁定(Binding):調度器將 Pod 綁定到選中的節點,這個過程使得該節點成為 Pod 的運行載體。
  3. 調度策略

    • 資源請求與限制:Pod 的資源請求和限制(如 CPU 和 RAM)是調度器選擇節點時考慮的主要因素之一。調度器會確保節點能夠滿足 Pod 的資源需求。
    • 親和性與反親和性:調度器可以根據 Pod 和節點之間的親和性和反親和性策略來決定 Pod 的調度位置,這對於優化應用程式的性能和可靠性至關重要。
    • 拓撲約束:調度器可以將 Pod 調度到不同的可用區或區域,以提高應用程式的高可用性和容災能力。

Kubernetes的調度流程圖例說明

以下是 Kubernetes 的調度流程圖:

+-----------------------+
|      API Server       |
+-----------------------+
            |
            v
+-----------------------+
|    Scheduler Queue    | <--- 新的 Pod 被放入這裡
+-----------------------+
            |
            v
+-----------------------+
|   Predicate Check     | (判斷 Node 是否適合)
|   - Node Fitness      |
|   - Resource Check    |
|   - Taints/Tolerations|
+-----------------------+
            |
            v
+-----------------------+
|   Priority Scoring    | (給每個符合的 Node 打分)
|   - Node Preference   |
|   - Affinity Rules    |
|   - Custom Scores     |
+-----------------------+
            |
            v
+-----------------------+
|   Select Best Node    | (選擇分數最高的 Node)
+-----------------------+
            |
            v
+-----------------------+
|   Bind Pod to Node    |(將 Pod 綁定到選擇的 Node 上)
+-----------------------+
            |
            v
+-----------------------+
|   Node Execution      | (容器在選擇的 Node 上啟動)
+-----------------------+

流程說明

  1. API Server:

    • 當一個新的 Pod 創建時,它會被 API Server 接收並放入 Scheduler Queue,等待調度。
  2. Scheduler Queue:

    • 這是調度器的工作排程,新的 Pod 會在這裡等待被選擇分配到一個適合的 Node。
  3. Predicate Check (預選階段):

    • 調度器會檢查每個可用的 Node,確保它們符合 Pod 的要求。這包括:
      • 資源檢查:確保 CPU、RAM等資源充足。
      • Node Fitness:檢查 Node 的可用性和健康狀態。
      • Taints/Tolerations:確保 Pod 能夠容忍 Node 上的 taint。
  4. Priority Scoring (優先打分階段):

    • 對符合條件的 Node 進行打分,根據以下因素:
      • Node Preference:Pod 是否偏好某些特定的 Node。
      • Affinity/Anti-Affinity:Pod 與其他 Pod 或 Node 的親和性。
      • 自定義打分邏輯:根據自定義的規則進行打分。
  5. Select Best Node (選擇最佳節點):

    • 調度器選擇分數最高的 Node,這個 Node 將用來執行該 Pod。
  6. Bind Pod to Node (綁定 Pod 到 Node):

    • 調度器將 Pod 與選定的 Node 綁定。這個過程告訴 API Server 這個 Pod 應該在哪個 Node 上運行。
  7. Node Execution (Node 執行):

    • Pod 被綁定後,選定的 Node 會開始準備並執行 Pod 中的容器,進入容器創建和啟動的過程。

這個流程展示了 Kubernetes 如何從接收到一個新的 Pod 開始,經過一系列的判斷和打分,最終選擇最佳的 Node 來執行該 Pod。這有助於確保資源的有效利用和應用的高可用性。

自定義調度器

  1. 自定義調度器的需求

    • 在某些情況下,預設的 Kubernetes 調度器無法滿足特定的調度需求,例如特定的應用需要更加精細的資源分配或特別的優先級處理。這時候,可以通過自定義調度器來實現更複雜的調度策略。
  2. 創建自定義調度器

    • Kubernetes 允許你創建和運行自定義調度器。自定義調度器可以根據業務需求設計獨特的調度算法和策略。
    • 自定義調度器通常是通過編寫 Go 語言程式來實現,並且可以使用 Kubernetes 調度框架(Kubernetes Scheduling Framework)來進行開發。
  3. 自定義調度器的部署

    • 自定義調度器作為一個容器運行在 Kubernetes Cluster 中,與預設的調度器並行運行。
    • 在 Pod 規範中指定 schedulerName 屬性,Pod 會由相應的自定義調度器來處理。例如:
    apiVersion: v1
    kind: Pod
    metadata:
      name: custom-scheduler-pod
    spec:
      schedulerName: my-custom-scheduler
      containers:
      - name: nginx
        image: nginx
    
  4. 調度套件與擴展

    • Kubernetes 調度框架支援調度套件,這使得自定義調度器可以更靈活地擴展和集成。通過編寫套件,你可以插入自定義的過濾器、優化算法或綁定邏輯,以實現特定的調度需求。

調度器性能與調優

  1. 性能考量

    • 當 Cluster 規模擴大時,調度器的性能可能會受到影響。調度器需要在大量 Pod 和節點之間快速計算並做出決策,因此優化調度器的性能至關重要。
    • 可以通過調整調度算法的參數、減少不必要的打分規則來優化調度器的性能。
  2. 調度延遲

    • 調度延遲是指從 Pod 進入 Pending 狀態到被綁定到節點之間的時間。通過分析和優化調度策略,減少 Pod 的調度延遲,可以提高應用程式的響應速度和可靠性。

總結

深入理解 Kubernetes 的調度器有助於更好地掌控應用程式在 Cluster 中的部署和資源利用。預設調度器已經能夠滿足大部分需求,但在特定情況下,自定義調度器可以提供更靈活和強大的調度能力。隨著 Kubernetes 應用的日益複雜,自定義調度和調度器的性能調優將成為 Kubernetes 運維的重要技能之一。

在接下來的課程中,我們將探討 Kubernetes 中的 Operators,自動化應用程式運維的進階技術。這將進一步提升你對 Kubernetes 的掌握和實踐能力。


上一篇
Day 23- Pod 的生命周期與調度策略
下一篇
Day 25- Operators 自動化應用程式運維
系列文
Kubernetes三十天就上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言