k8s中的集群調度

文章目錄

  • k8s中的集群調度
      • Pod 創建流程
    • 通過指定節點來創建pod所在的node節點
    • 通過標簽來指定pod創建在哪個節點上
    • pod 的親和性
    • Pod的親和性和反親和性
      • 親和性(Affinity)
      • 反親和性(Anti-Affinity)
    • 污點與容忍
      • 污點(Taint)
      • 容忍(Tolerations)

k8s中的集群調度

Kubernetes 是通過 List-Watch 的機制進行每個組件的協作,保持數據同步的,每個組件之間的設計實現了解耦

在 Kubernetes 集群中,Pod 是最小的部署單元,它包含一個或多個容器。Pod 的創建和調度是由 Kubernetes 的多個組件共同完成的,包括 API Server、Controller Manager、Scheduler 和 kubelet。本文將帶您深入了解這一過程。

Pod 創建流程

  1. 用戶請求:用戶通過 kubectl 或其他 API 客戶端向 API Server 發送創建 Pod 的請求。
  2. 存儲請求:API Server 將 Pod 的元數據存儲到 etcd 中。一旦存儲成功,API Server 向客戶端確認請求完成。
  3. 事件通知:etcd 在存儲操作完成后,會向 API Server 發送一個創建事件。
  4. Controller Manager 監聽:Controller Manager 通過 List-Watch 機制監聽 API Server 的事件。當它接收到 Pod 創建事件時,會檢查是否有對應的 Replication Controller (RC) 或其他控制器來確保所需的 Pod 副本數量。
  5. 調度準備:如果 Pod 副本數量不足,Controller Manager 會創建新的 Pod 副本,并在 API Server 中記錄詳細信息。
  6. Scheduler 監聽:Scheduler 也通過 List-Watch 機制監聽 API Server 的事件。當它接收到新的 Pod 創建事件時,它將決定將該 Pod 調度到哪個 Node 上。
  7. 調度決策:Scheduler 根據一系列的調度算法和策略(如資源需求、節點親和性等)來選擇最佳的 Node。
  8. 綁定 Pod:Scheduler 更新 Pod 的信息,包括其被調度到的 Node,并將這些信息寫回 API Server,由 API Server 更新到 etcd。
  9. kubelet 監聽:在每個 Node 上運行的 kubelet 通過 List-Watch 機制監聽 API Server,等待被調度到該 Node 上的 Pod 事件。
  10. 容器啟動:當 kubelet 發現有一個新的 Pod 被調度到它所在的 Node 時,它會調用 Docker(或其他容器運行時)來啟動 Pod 中的容器。
  11. 狀態反饋:kubelet 將 Pod 及其容器的狀態反饋給 API Server,API Server 再將這些狀態信息存儲到 etcd 中。

通過指定節點來創建pod所在的node節點

沒有設置指定節點時會通過調度器來進行pod創建的調度

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80

在這里插入圖片描述

可以看到pod節點會平均創建在node01 和 node02 上

通過指定節點來指定創建在node01節點上

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:nodeName: node01                           # 添加nodeName: node01 containers:- name: nginximage: nginx:1.16ports:- containerPort: 80

在這里插入圖片描述

不通過調度器,直接通過指定節點將所有pod節點都部署在了node01節點上了

通過標簽來指定pod創建在哪個節點上

給node節點添標簽

kubectl label nodes node02 pji=a
kubectl label nodes node01 pji=b

在這里插入圖片描述

可以看見node02 的標簽為 pji=a ,node01 的標簽為pji=b

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:nodeSelector:         #添加標簽pji: a              #標簽值pji: acontainers:- name: nginximage: nginx:1.16ports:- containerPort: 80

以上配置可以將pod節點部署到node02節點上

在這里插入圖片描述

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:nodeSelector:       pji: bcontainers:- name: nginximage: nginx:1.16ports:- containerPort: 80

以上配置可以將pod部署到node01上

在這里插入圖片描述

pod 的親和性

在 Kubernetes 中,Pod 親和性(Pod Affinity)是一種調度策略,用于確保 Pod 調度到特定的節點上。這種策略可以通過標簽選擇器(Label Selector)來實現,使得具有特定標簽的 Pod 傾向于調度到具有相同標簽的節點上。
Pod 親和性可以分為以下幾種類型:

  1. 軟親和性(Soft Affinity)
    • podAffinityTerm:指定 Pod 應該調度的節點集合。
    • preferredDuringSchedulingIgnoredDuringExecution:定義 Pod 應該優先調度到哪些節點上。
  2. 硬親和性(Hard Affinity)
    • podAffinityTerm:指定 Pod 必須調度的節點集合。
    • requiredDuringSchedulingIgnoredDuringExecution:定義 Pod 必須調度到哪些節點上。
      例如,如果您有一個包含兩個節點的集群,并且希望將特定的 Pod 調度到具有標簽 node-role.kubernetes.io/master: "" 的節點上,

硬策略 匹配標簽pji=a的node的節點配置如下

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: pjioperator: Invalues:- a

在這里插入圖片描述

若是配置一個不存在的標簽這會如下

在這里插入圖片描述

出現Pending狀態

軟策略

設置標簽為bcde但是此集群沒有標簽bcde的主機

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 20selector:matchLabels:app: web1template:metadata:labels:app: web1spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: pjioperator: Invalues:- bcde

在這里插入圖片描述

則會調度在node01 (b)和 node02?上

Pod的親和性和反親和性

在 Kubernetes 中,親和性(Affinity)和反親和性(Anti-Affinity)是調度策略的一部分,用于影響 Kubernetes 調度器如何將 Pod 調度到集群中的節點上。這些特性可以幫助您確保 Pod 之間或 Pod 與節點之間保持特定的關系。

親和性(Affinity)

親和性是指調度器傾向于將 Pod 調度到滿足特定條件的節點上。它包括以下幾種類型:

  1. 節點親和性(Node Affinity)
    • 軟親和性(Soft Affinity):如果節點不滿足條件,調度器可以忽略親和性。
    • 硬親和性(Hard Affinity):如果節點不滿足條件,調度器將不會調度 Pod。
  2. Pod 親和性(Pod Affinity)
    • 軟親和性:如果其他 Pod 不滿足條件,調度器可以忽略親和性。
    • 硬親和性:如果其他 Pod 不滿足條件,調度器將不會調度 Pod。
  3. Pod 反親和性(Pod Anti-Affinity)
    • 軟反親和性:如果其他 Pod 不滿足條件,調度器可以忽略反親和性。
    • 硬反親和性:如果其他 Pod 不滿足條件,調度器將不會調度 Pod。

反親和性(Anti-Affinity)

反親和性是親和性的對立面。與親和性不同,反親和性用于防止 Pod 調度到某些節點上,或者避免與某些 Pod 一起調度。反親和性通常用于避免資源爭用或實現高可用性。

親和性配置

apiVersion: v1
kind: Pod
metadata:name: web5labels:app: web2
spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- web2                      # 在有pod標簽app=web2的標簽上創建topologyKey: pji                #在擁有pji標簽的節點上創建

在這里插入圖片描述

反親和性

apiVersion: v1
kind: Pod
metadata:name: web5labels:app: web1
spec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: "app"operator: Invalues:- web2topologyKey: "kubernetes.io/hostname"

之前的pod標簽為web2 ,設置非親緣性后 web5創建會避開node02

在這里插入圖片描述

當然可以。

污點與容忍

污點(Taint)

污點是向節點添加的一個標簽,它告訴 Kubernetes 調度器不要將 Pod 調度到具有該污點的節點上。這通常用于防止 Pod 調度到不希望它們運行的節點上,例如,當節點正在進行維護或出現問題時。
污點可以具有以下三個屬性:

  • 鍵(Key):污點的鍵,用于標識污點。
  • 值(Value):與鍵關聯的值。
  • 效果(Effect):當污點匹配時,Pod 應該受到的影響。有效果包括 NoSchedulePreferNoScheduleNoExecute

污點的創建

給node01創建一個鍵值對為ry=87的污點,使用NoSchedule策略

kubectl taint node node01 ry=87:NoSchedule

在這里插入圖片描述

apiVersion: v1
kind: Pod
metadata:name: nginx4labels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80

創建新的Pod都創建在node02下,而不會創建在node01上

在這里插入圖片描述

容忍(Tolerations)

容忍是 Pod 上的一個標簽,它告訴 Kubernetes 調度器,盡管節點具有某個污點,但該 Pod 應該被調度到該節點上。容忍可以有多個鍵值對,并且可以設置不同的效果和時間范圍。

設置容忍

apiVersion: v1
kind: Pod
metadata:name: nginx4labels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80tolerations:- key: "ry"operator: "Equal"value: "87"effect: "NoSchedule"

在這里插入圖片描述

可以看見,node01的污點被無視了

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19379.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19379.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19379.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Cache入門詳解

一、概述 1.1緩存介紹 Spring提供了一套cache緩存抽象(注解/接口),使基于spring緩存的使用與實現解耦 默認實現,Spring JDK ConcurrentMap-based Cache第三方實現,caffeine/Ehcache/Redis等 https://docs.spring.io/spring-framework/do…

Postman快捷功能-快速填寫請求頭

大家好,之前給大家分享關于 Postman 工具的基礎使用,今天給大家介紹一個快捷功能,可以一定程度提高我們使用 Postman 工具的效率,在我們進行接口測試時,幾乎每個接口都需要填寫 Headers,且 Headers 中的參數…

【ai】livekit服務本地開發模式2:模擬1個發布者

是一個會議用軟件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

【Python】 Django 框架如何支持百萬級日訪問量

基本原理 Django 是一個高級的 Python Web 框架,它鼓勵快速開發和干凈、實用的設計。Django 遵循 MVC(模型-視圖-控制器)設計模式,允許開發者通過編寫更少的代碼來構建高質量的 Web 應用程序。Django 自帶了許多內置功能&#xf…

發現沒:隨便搞個B端頁面,就想在客戶那里過關,難啦。

客戶對B端界面要求越來越高的原因可以有以下幾點: 用戶體驗要求提升:隨著用戶對移動應用和網頁的使用經驗增加,他們對于界面的交互、流暢性和易用性要求也越來越高。他們希望能夠在使用B端應用時,能夠快速、方便地完成任務&#…

2024年華為OD機試真題-文本統計分析-C++-OD統一考試(C卷D卷)

題目描述: 有一個文件, 包含以一定規則寫作的文本, 請統計文件中包含的文本數量 規則如下 1. 文本以";"分隔,最后一條可以沒有";",但空文本不能算語句,比如"COMMAND A; ;"只能算一條語句. 注意, 無字符/空白字符/制表符都算作"空&qu…

設計模式詳解(六):適配器模式——Adapter

目錄導航 適配器模式及其作用現實生活舉例 適配器模式的好處適配器模式的實現關系圖實現步驟 適配器模式的適用場景適配器模式示例 適配器模式及其作用 適配器模式是一種結構型設計模式。所謂結構型是指在代碼結構方面的設計模式。適配器模式作為中間層,可以讓交互…

Vue3 圖片或視頻下載跨域或文件損壞的解決方法

Vue3 圖片或視頻下載跨域或文件損壞的解決方法 修改跨域配置文件下載方法 修改跨域配置文件 修改vite.config.ts文件proxy里面寫跨域地址,如下圖,圖片地址就是我們要跨域的目標地址: 下載方法 如下就是我取消上面那句后的報錯 然后調用兩…

【C++風云錄】C++與智能交通:智能交通系統與車聯網

解鎖C的力量:在智能交通系統與車聯網中使用關鍵庫 前言 本文關注于C在智能交通系統與車聯網中的應用,并提供了五個常見庫的簡介和使用方法。這些庫包括:Veins, SUMO-GUI, OMNeT, NS-3和PLEXE,每個庫都有其獨特的功能和優點&…

【Java】Sping Boot中使用Javax Bean Validation

目錄 Javax Bean Validation在Spring Boot中集成Javax Bean Validation使用案例功能測試配置全局異常處理器重新測試返回特定形式的信息方式一方式二 附:常用的注解 Javax Bean Validation Javax Bean Validation是Java平臺的一項規范,旨在提供一種簡單…

想知道股指期貨和期權有什么不同嗎?

市場上目前有中金所的滬深300ETF,中證500和中證1000股指期貨,期權市場有上證50ETF,滬深300etf和中證500ETF期權,股指期貨和期權在買賣雙方的權利義務、風險收益特征、保證金制度、上市合約數量等方面均有較大區別,下文…

每天學點小知識:Windows終端Powershell美化

前言 本章的旨在教會你美化自己的終端,powershell需要以管理員運行 經過我的測試,不同的電腦可能會有不同的報錯,具體操作根據官方為主https://ohmyposh.dev/docs 效果展示 Oh My Posh:提供美觀的 PowerShell 提示符主題 1.安裝…

揭秘CISA:你不知道的信息安全認證,輕松掌握職場先機!

在當今的信息化時代,信息系統的安全和穩定是企業和組織的重要資產。信息系統審計是一項專業的工作,需要具備豐富的知識和經驗,以及敏銳的洞察力和判斷力。信息系統審計師是信息系統審計領域的專業人士,他們負責對信息系統的設計、…

MVVM模式的優點以及與MVC模式的區別?

1.MVVM 模式的優點: 1 、低耦合: 視圖( View )可以獨?于 Model 變化和修改,?個 ViewModel 可以綁定到不同的 "View" 上,當 View 變化的時候 Model 可以不變,當 Model 變化的時…

【OpenGL實踐12】關于緩存區Framebuffer的運用

文章目錄 一、說明二、幀緩沖區三、創建新的幀緩沖區四、附屬裝飾4.1 紋理圖像4.2 渲染緩沖區對象圖像 五、使用幀緩沖區5.1 后期處理5.2 更改代碼 六、后期處理效果6.1 色彩處理6.2 模糊6.3 Sobel算子 七、結論練習 一、說明 關于FrameBuffer的使用,是OpenGL的高級…

橫截面分位數回歸

一、分位數回歸簡介 分位數回歸(英語:Quantile regression)是回歸分析的方法之一。最早由Roger Koenker和Gilbert Bassett于1978年提出。一般地,傳統的回歸分析研究自變量與因變量的條件期望之間的關系,相應得到的回歸…

AI時代的服裝設計師--AIGC

AI時代的服裝設計師--AIGC AIGCAIGC設計能替代真正的設計師嗎森馬T恤設計AIGC優勢、優化 本文記錄于去年參加的一次森馬T恤設計活動的感受。 AIGC 可以說,近期以來,隨著ChatGPT的不斷發展,從ChatGPT-3到ChatGPT-4的飛速發展,AIGC…

Windows和Linux系統部署Docker(2)

目錄 一、Linux系統部署docker 前置環境: 1.安裝需要的軟件包, yum-util 提供yum-config-manager功能 2.添加阿里云 docker-ce 倉庫 3.安裝docker軟件包 4.啟動 docker并設置開機自啟 5.查看版本: 二、windows系統部署docker 1.查看…

Type ‘null‘ is not assignable to type ‘T‘. - ArkTSCheck

設置泛型將參數配置為 null 時拋出了如下異常: Type null is not assignable to type T. T could be instantiated with an arbitrary type which could be unrelated to null. <ArkTSCheck> 解決辦法 在 null 后面添加 ! 即可,以表示該值不會為 null data: T null! 以…

Qt 基于FFmpeg的視頻轉換器 - 轉GIF動圖

Qt 基于FFmpeg的視頻轉換器 - 轉GIF動圖 引言一、設計思路二、核心源碼三、參考鏈接 引言 gif格式的動圖可以通過連續播放一系列圖像或視頻片段來展示動態效果&#xff0c;使信息更加生動形象&#xff0c;可以很方便的嵌入到網頁或者ppt中。上圖展示了視頻的前幾幀轉為gif動圖的…