iT邦幫忙

2024 iThome 鐵人賽

DAY 25
1
Kubernetes

都什麼年代了,還在學 Kubernetes系列 第 25

學 Kubernetes 的第二十五天 - Scheduling - 概述

  • 分享至 

  • xImage
  •  

Kubernetes 作為現代應用程序的主要編排工具,能夠幫助開發者和運維團隊高效地管理和調度容器化工作負載。為了確保集群的資源分配和管理更加靈活、穩定,Kubernetes 提供了一系列調度機制。

本章節將深入介紹這些核心概念及其相關功能,幫助你更好地理解 Kubernetes 的調度機制。或許有些艱深難懂,但它們真的很重要,建議耐心看下去。

Kubernetes 調度概念

Kubernetes 為了實現高效且可靠的資源管理,主要使用以下三種機制:

  1. 調度(Scheduling):由 kube-scheduler 負責,根據 Pod 的資源需求和節點狀況,將 Pod 調度到最合適的節點上。調度過程包括資源過濾、節點打分和最終的節點選擇。
  2. 搶占(Preemption):當高優先級的 Pod 無法找到合適的節點時,kube-scheduler 可以搶占低優先級的 Pod,將其從節點上移除,以釋放資源給高優先級的 Pod 使用。
  3. 驅逐(Eviction):由 kubeletkube-controller-manager 負責,當節點資源不足(如內存或磁盤空間壓力)或節點健康狀況異常時,kubelet 會觸發 Pod 的驅逐操作,以釋放資源。當節點宕機或不可用時,kube-controller-manager 也會根據策略進行 Pod 的驅逐。

kube-scheduler 調度流程

kube-scheduler 的主要作用是根據特定的調度算法和策略,將 Pod 調度到合適的節點上。它持續監聽 API 服務,獲取尚未分配節點的 Pod,並為每個 Pod 建立一個綁定(binding)。默認情況下,調度器能夠滿足大多數需求,確保 Pod 被分配到資源充足的節點上運行。

然而,在生產環境中,我們可能需要更精細的控制。例如,希望某個 Pod 只能運行在特定的節點上,或者某些節點只能運行特定類型的應用。為此,Kubernetes 提供了豐富的調度策略和機制,讓我們可以靈活地控制 Pod 的調度。

在實際的生產環境中,需要考慮的問題包括:

  • 如何保證節點調度的公平性,特別是在節點資源配置不均衡的情況下?
  • 如何確保每個節點都能被合理地分配資源,以實現資源的高效利用?
  • 如何最大化地利用集群資源,同時保證調度的性能和效率?
  • 使用者是否可以根據實際需求定制調度策略?

常用的調度功能

為了滿足不同的調度需求,Kubernetes 提供了多種調度功能:

1. 資源請求和限制(Resource Requests and Limits)

Kubernetes 支持為 Pod 配置 CPU 和內存等資源的請求限制。調度器根據這些配置,確定 Pod 應該被調度到哪些有足夠資源的節點上。

resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"

2. 節點親和性和反親和性(Node Affinity and Anti-affinity)

Node 親和性允許用戶指定 Pod 對某些節點的偏好,反親和性則避免 Pod 被調度到特定的節點上。這有助於控制 Pod 的部署位置,確保應用運行在最適合的環境中。

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: disktype
          operator: In
          values:
          - ssd

3. Taints 和 Tolerations

Taints 允許在節點上設置標記,阻止不符合要求的 Pod 被調度到這些節點。Tolerations 則使 Pod 能夠“容忍”這些 Taints,從而被調度到相應的節點。

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  tolerations:
  - key: "key1"
    operator: "Equal"
    value: "value1"
    effect: "NoSchedule"

4. Pod 優先級(Pod Priority)

PriorityClass 是一種資源,允許定義 Pod 的優先級。當高優先級的 Pod 無法被調度時,可以搶占低優先級的 Pod 所佔用的資源,確保關鍵應用得到優先處理。

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000
globalDefault: false
description: "This priority class is for high-priority Pods."

5. 拓撲分佈約束(Topology Spread Constraints)

TopologySpreadConstraints 控制 Pod 在集群中的分佈方式,防止 Pod 過度集中在某些節點或區域,從而提高應用的高可用性和容錯性。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: nginx
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: myapp

6. Pod 中斷預算(Pod Disruption Budget, PDB)

PDB 用於確保在進行 Pod 驅逐(例如節點維護或升級)時,保持應用程序的可用性。PDB 指定了在任何時刻應保持運行的最少 Pod 數量或允許中斷的最大 Pod 數量。

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: my-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: myapp

小結

通過合理利用這些調度功能,使 Kubernetes 能夠靈活應對不同工作負載的需求。使用者也可以確保集群資源被高效利用,同時滿足業務需求,保持應用的穩定和高可用。

在接下來的章節中,我們將實作上述提到的調度功能,以便能更清晰地理解這些概念。


上一篇
學 Kubernetes 的第二十四天 - Deployment strategy - 實作 (2)
下一篇
學 Kubernetes 的第二十六天 - Scheduling - 指派 Pod 到節點
系列文
都什麼年代了,還在學 Kubernetes32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言