最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker調度器Kubernetes使用過程

 更新時間:2022年12月12日 10:39:45   作者:Young丶  
Docker和Kubernetes在使用方式上有相似性,初次接觸這兩個技術的同學常常會搞混,但實際上它們并不是解決同一個問題的技術,也沒有辦法用其中一個替代另一個。通俗一點來說,Docker解決的是容器技術直接相關的問題,而Kubernetes更多地關注在集群上調度和部署容器應用

kube-scheduler是 kubernetes 系統(tǒng)的核心組件之一,主要負責整個集群資源的調度功能,根據(jù)特定的調度算法和策略,將 Pod 調度到最優(yōu)的工作節(jié)點上面去,從而更加合理、更加充分的利用集群的資源,這也是我們選擇使用 kubernetes 一個非常重要的理由。如果一門新的技術不能幫助企業(yè)節(jié)約成本、提供效率,我相信是很難推進的。

調度流程

默認情況下,kube-scheduler 提供的默認調度器能夠滿足我們絕大多數(shù)的要求,我們前面和大家接觸的示例也基本上用的默認的策略,都可以保證我們的 Pod 可以被分配到資源充足的節(jié)點上運行。但是在實際的線上項目中,可能我們自己會比 kubernetes 更加了解我們自己的應用,比如我們希望一個 Pod 只能運行在特定的幾個節(jié)點上,或者這幾個節(jié)點只能用來運行特定類型的應用,這就需要我們的調度器能夠可控。

kube-scheduler 是 kubernetes 的調度器,它的主要作用就是根據(jù)特定的調度算法和調度策略將 Pod 調度到合適的 Node 節(jié)點上去,是一個獨立的二進制程序,啟動之后會一直監(jiān)聽 API Server,獲取到 PodSpec.NodeName 為空的 Pod,對每個 Pod 都會創(chuàng)建一個 binding。

這個過程在我們看來好像比較簡單,但在實際的生產環(huán)境中,需要考慮的問題就有很多了:

  • 如何保證全部的節(jié)點調度的公平性?要知道并不是說有節(jié)點資源配置都是一樣的
  • 如何保證每個節(jié)點都能被分配資源?
  • 集群資源如何能夠被高效利用?
  • 集群資源如何才能被最大化使用?
  • 如何保證 Pod 調度的性能和效率?
  • 用戶是否可以根據(jù)自己的實際需求定制自己的調度策略?

考慮到實際環(huán)境中的各種復雜情況,kubernetes 的調度器采用插件化的形式實現(xiàn),可以方便用戶進行定制或者二次開發(fā),我們可以自定義一個調度器并以插件形式和 kubernetes 進行集成。

kubernetes 調度器的源碼位于 kubernetes/pkg/scheduler 中,大體的代碼目錄結構如下所示:(不同的版本目錄結構可能不太一樣)

kubernetes/pkg/scheduler
-- scheduler.go         //調度相關的具體實現(xiàn)
|-- algorithm
|   |-- predicates      //節(jié)點篩選策略
|   |-- priorities      //節(jié)點打分策略
|-- algorithmprovider
|   |-- defaults         //定義默認的調度器

其中 Scheduler 創(chuàng)建和運行的核心程序,對應的代碼在 pkg/scheduler/scheduler.go,如果要查看kube-scheduler的入口程序,對應的代碼在 cmd/kube-scheduler/scheduler.go。

調度主要分為以下幾個部分:

  • 首先是預選過程,過濾掉不滿足條件的節(jié)點,這個過程稱為Predicates
  • 然后是優(yōu)選過程,對通過的節(jié)點按照優(yōu)先級排序,稱之為Priorities
  • 最后從中選擇優(yōu)先級最高的節(jié)點,如果中間任何一步驟有錯誤,就直接返回錯誤

Predicates階段首先遍歷全部節(jié)點,過濾掉不滿足條件的節(jié)點,屬于強制性規(guī)則,這一階段輸出的所有滿足要求的 Node 將被記錄并作為第二階段的輸入,如果所有的節(jié)點都不滿足條件,那么 Pod 將會一直處于 Pending 狀態(tài),直到有節(jié)點滿足條件,在這期間調度器會不斷的重試。

所以我們在部署應用的時候,如果發(fā)現(xiàn)有 Pod 一直處于 Pending 狀態(tài),那么就是沒有滿足調度條件的節(jié)點,這個時候可以去檢查下節(jié)點資源是否可用。

Priorities階段即再次對節(jié)點進行篩選,如果有多個節(jié)點都滿足條件的話,那么系統(tǒng)會按照節(jié)點的優(yōu)先級(priorites)大小對節(jié)點進行排序,最后選擇優(yōu)先級最高的節(jié)點來部署 Pod 應用。

下面是調度過程的簡單示意圖:

更詳細的流程是這樣的:

首先,客戶端通過 API Server 的 REST API 或者 kubectl 工具創(chuàng)建 Pod 資源

API Server 收到用戶請求后,存儲相關數(shù)據(jù)到 etcd 數(shù)據(jù)庫中

調度器監(jiān)聽 API Server 查看為調度(bind)的 Pod 列表,循環(huán)遍歷地為每個 Pod 嘗試分配節(jié)點,這個分配過程就是我們上面提到的兩個階段:

  • 預選階段(Predicates),過濾節(jié)點,調度器用一組規(guī)則過濾掉不符合要求的 Node 節(jié)點,比如 Pod 設置了資源的 request,那么可用資源比 Pod 需要的資源少的主機顯然就會被過濾掉
  • 優(yōu)選階段(Priorities),為節(jié)點的優(yōu)先級打分,將上一階段過濾出來的 Node 列表進行打分,調度器會考慮一些整體的優(yōu)化策略,比如把 Deployment 控制的多個 Pod 副本分布到不同的主機上,使用最低負載的主機等等策略

經過上面的階段過濾后選擇打分最高的 Node 節(jié)點和 Pod 進行 binding 操作,然后將結果存儲到 etcd 中最后被選擇出來的 Node 節(jié)點對應的 kubelet 去執(zhí)行創(chuàng)建 Pod 的相關操作

其中Predicates過濾有一系列的算法可以使用,我們這里簡單列舉幾個:

  • PodFitsResources:節(jié)點上剩余的資源是否大于 Pod 請求的資源
  • PodFitsHost:如果 Pod 指定了 NodeName,檢查節(jié)點名稱是否和 NodeName 匹配
  • PodFitsHostPorts:節(jié)點上已經使用的 port 是否和 Pod 申請的 port 沖突
  • PodSelectorMatches:過濾掉和 Pod 指定的 label 不匹配的節(jié)點
  • NoDiskConflict:已經 mount 的 volume 和 Pod 指定的 volume 不沖突,除非它們都是只讀的
  • CheckNodeDiskPressure:檢查節(jié)點磁盤空間是否符合要求
  • CheckNodeMemoryPressure:檢查節(jié)點內存是否夠用

除了這些過濾算法之外,還有一些其他的算法,更多更詳細的我們可以查看源碼文件:k8s.io/kubernetes/pkg/scheduler/algorithm/predicates/predicates.go。

Priorities優(yōu)先級是由一系列鍵值對組成的,鍵是該優(yōu)先級的名稱,值是它的權重值,同樣,我們這里給大家列舉幾個具有代表性的選項:

  • LeastRequestedPriority:通過計算 CPU 和內存的使用率來決定權重,使用率越低權重越高,當然正??隙ㄒ彩琴Y源是使用率越低權重越高,能給別的 Pod 運行的可能性就越大
  • SelectorSpreadPriority:為了更好的高可用,對同屬于一個 Deployment 或者 RC 下面的多個 Pod 副本,盡量調度到多個不同的節(jié)點上,當一個 Pod 被調度的時候,會先去查找該 Pod 對應的 controller,然后查看該 controller 下面的已存在的 Pod,運行 Pod 越少的節(jié)點權重越高
  • ImageLocalityPriority:就是如果在某個節(jié)點上已經有要使用的鏡像節(jié)點了,鏡像總大小值越大,權重就越高
  • NodeAffinityPriority:這個就是根據(jù)節(jié)點的親和性來計算一個權重值,后面我們會詳細講解親和性的使用方法

除了這些策略之外,還有很多其他的策略,同樣我們可以查看源碼文件:k8s.io/kubernetes/pkg/scheduler/algorithm/priorities/ 了解更多信息。每一個優(yōu)先級函數(shù)會返回一個0-10的分數(shù),分數(shù)越高表示節(jié)點越優(yōu),同時每一個函數(shù)也會對應一個表示權重的值。最終主機的得分用以下公式計算得出:

finalScoreNode = (weight1 * priorityFunc1) + (weight2 * priorityFunc2) + … + (weightn * priorityFuncn)

自定義調度

上面就是 kube-scheduler 默認調度的基本流程,除了使用默認的調度器之外,我們也可以自定義調度策略。

調度器擴展

kube-scheduler在啟動的時候可以通過 --policy-config-file參數(shù)來指定調度策略文件,我們可以根據(jù)我們自己的需要來組裝PredicatesPriority函數(shù)。選擇不同的過濾函數(shù)和優(yōu)先級函數(shù)、控制優(yōu)先級函數(shù)的權重、調整過濾函數(shù)的順序都會影響調度過程。

下面是官方的 Policy 文件示例:

{
  "kind" : "Policy",
  "apiVersion" : "v1",
  "predicates" : [
      {"name" : "PodFitsHostPorts"},
      {"name" : "PodFitsResources"},
      {"name" : "NoDiskConflict"},
      {"name" : "NoVolumeZoneConflict"},
      {"name" : "MatchNodeSelector"},
      {"name" : "HostName"}
  ],
  "priorities" : [
      {"name" : "LeastRequestedPriority", "weight" : 1},
      {"name" : "BalancedResourceAllocation", "weight" : 1},
      {"name" : "ServiceSpreadingPriority", "weight" : 1},
      {"name" : "EqualPriority", "weight" : 1}
  ]
}

多調度器

如果默認的調度器不滿足要求,還可以部署自定義的調度器。并且,在整個集群中還可以同時運行多個調度器實例,通過 podSpec.schedulerName 來選擇使用哪一個調度器(默認使用內置的調度器)。

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  schedulerName: my-scheduler  # 選擇使用自定義調度器 my-scheduler
  containers:
  - name: nginx
    image: nginx:1.10

要開發(fā)我們自己的調度器也是比較容易的,比如我們這里的 my-scheduler:

  • 首先需要通過指定的 API 獲取節(jié)點和 Pod
  • 然后選擇phase=PendingschedulerName=my-scheduler的pod
  • 計算每個 Pod 需要放置的位置之后,調度程序將創(chuàng)建一個Binding
  • 對象然后根據(jù)我們自定義的調度器的算法計算出最適合的目標節(jié)點

優(yōu)先級調度

與前面所講的調度優(yōu)選策略中的優(yōu)先級(Priorities)不同,前面所講的優(yōu)先級指的是節(jié)點優(yōu)先級,而我們這里所說的優(yōu)先級 pod priority 指的是 Pod 的優(yōu)先級,高優(yōu)先級的 Pod 會優(yōu)先被調度,或者在資源不足低情況犧牲低優(yōu)先級的 Pod,以便于重要的 Pod 能夠得到資源部署。

要定義 Pod 優(yōu)先級,就需要先定義PriorityClass對象,該對象沒有 Namespace 的限制:

apiVersion: v1
kind: PriorityClass
metadata:
  name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only."

其中:

  • value為 32 位整數(shù)的優(yōu)先級,該值越大,優(yōu)先級越高
  • globalDefault用于未配置 PriorityClassName 的 Pod,整個集群中應該只有一個PriorityClass將其設置為 true

然后通過在 Pod 的spec.priorityClassName中指定已定義的PriorityClass名稱即可:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  priorityClassName: high-priority

另外一個值得注意的是當節(jié)點沒有足夠的資源供調度器調度 Pod,導致 Pod 處于 pending 時,搶占(preemption)邏輯就會被觸發(fā)。Preemption會嘗試從一個節(jié)點刪除低優(yōu)先級的 Pod,從而釋放資源使高優(yōu)先級的 Pod 得到節(jié)點資源進行部署。

現(xiàn)在我們通過下面的圖再去回顧下 kubernetes 的調度過程是不是就清晰很多了:

kube-scheduler

到此這篇關于Docker調度器Kubernetes使用過程的文章就介紹到這了,更多相關Docker Kubernetes內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Docker Compose環(huán)境變量與配置文件管理全解析

    Docker Compose環(huán)境變量與配置文件管理全解析

    這篇文章主要介紹了Docker Compose環(huán)境變量與配置文件管理全解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-04-04
  • Docker中cgroups資源控制實戰(zhàn)

    Docker中cgroups資源控制實戰(zhàn)

    cgroups是Linux內核的功能,允許用戶管理和限制進程組資源使用,支持資源限制、優(yōu)先級控制、資源記錄等,應用廣泛,Docker和k8s等容器技術,通過cgroups實現(xiàn)精細的資源控制,本文就來詳細的介紹一下
    2024-11-11
  • docker如何安裝帶postgis插件的postgresql數(shù)據(jù)庫

    docker如何安裝帶postgis插件的postgresql數(shù)據(jù)庫

    這篇文章主要介紹了docker如何安裝帶postgis插件的postgresql數(shù)據(jù)庫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 釋放Docker占用的存儲空間的幾種方法

    釋放Docker占用的存儲空間的幾種方法

    隨著Docker的廣泛應用,我們經常會遇到Docker占用過多存儲空間的問題,這可能是由于頻繁的鏡像拉取、容器創(chuàng)建和刪除等操作導致的,本文將介紹幾種方法來有效釋放Docker占用的存儲空間,需要的朋友可以參考下
    2024-06-06
  • Dockerfile文件編寫及構建鏡像命令解析

    Dockerfile文件編寫及構建鏡像命令解析

    這篇文章主要為大家介紹了Dockerfile文件編寫及Dockerfile構建鏡像命令解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Docker命令行入門大全(這18條,你不得不知)

    Docker命令行入門大全(這18條,你不得不知)

    Docker有成千上百萬的命令行。因此Docker文檔內容十分豐富,同時又讓剛入門的新手感到不知所措。在本文中,我將重點介紹運行Docker的關鍵命令。
    2019-09-09
  • docker 搭建基于prometheus的監(jiān)控體系步驟實現(xiàn)

    docker 搭建基于prometheus的監(jiān)控體系步驟實現(xiàn)

    本文主要介紹了docker 搭建基于prometheus的監(jiān)控體系步驟實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • Docker設置日志滾動的解決方案

    Docker設置日志滾動的解決方案

    Docker容器默認將日志寫入同一文件,可能導致磁盤滿,解決方案包括修改全局docker.service配置或針對特定容器修改hostconfig.json,下面給大家介紹Docker設置日志滾動的解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • Docker mysql+nacos單機部署的實現(xiàn)步驟

    Docker mysql+nacos單機部署的實現(xiàn)步驟

    本文主要介紹了Docker mysql+nacos單機部署的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • Docker搭建青龍面板教程(圖文)

    Docker搭建青龍面板教程(圖文)

    青龍面板是一款用于管理和運行腳本的Web界面,廣泛應用于各類自動化腳本的管理,本文主要介紹了Docker搭建青龍面板教程,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

五家渠市| 大厂| 松原市| 成安县| 武汉市| 吐鲁番市| 五大连池市| 同心县| 蓬莱市| 麻栗坡县| 宁海县| 松滋市| 永泰县| 霞浦县| 宝鸡市| 互助| 乐亭县| 西乌珠穆沁旗| 镇康县| 景泰县| 沙雅县| 察雅县| 错那县| 张家界市| 伊春市| 株洲市| 武陟县| 白城市| 五华县| 自治县| 滨海县| 行唐县| 兴业县| 塔河县| 定西市| 民勤县| 竹山县| 股票| 日土县| 博罗县| 景泰县|