序言
做一件事并不難,難的是在于堅持。堅持一下也不難,難的是堅持到底。
文章標記顏色說明:
- 黃色:重要標題
- 紅色:用來標記結論
- 綠色:用來標記論點
- 藍色:用來標記論點
Kubernetes (k8s) 是一個容器編排平臺,允許在容器中運行應用程序和服務。今天學習一下k8s調(diào)度相關知識
希望這篇文章能讓你不僅有一定的收獲,而且可以愉快的學習,如果有什么建議,都可以留言和我交流
?專欄介紹
這是這篇文章所在的專欄,歡迎訂閱:【深入解析k8s】專欄
簡單介紹一下這個專欄要做的事:
- 主要是深入解析每個知識點,幫助大家完全掌握k8s,以下是已更新的章節(jié)
- 這是專欄介紹文章地址:【深入解析K8S專欄介紹】
Kubernetes是一個分布式系統(tǒng),能夠管理和編排容器化應用程序。其中,調(diào)度(Scheduling)是Kubernetes最重要的功能之一,它能夠?qū)⑷萜骰膽贸绦颍碢od)自動分配到集群中的適當節(jié)點上。
在本文中,將詳細介紹Kubernetes調(diào)度的
- 工作原理
- 調(diào)度算法
- 調(diào)度器組件
- 調(diào)度示例
1 基礎介紹
1.1 什么是k8s調(diào)度
Kubernetes調(diào)度(Scheduling):是指將未調(diào)度的Pod自動分配到集群中的節(jié)點的過程。
Pod是Kubernetes中最小的可部署單元,它通常包括一個或多個容器。
在Kubernetes中,容器可以在集群中的任何節(jié)點上運行,調(diào)度器可以根據(jù)節(jié)點的資源使用情況、Pod的資源需求、親和性和反親和性等因素,將Pod分配到最合適的節(jié)點上運行。
每個Pod都有一個調(diào)度器(Scheduler)負責將其分配到一個可用的節(jié)點上。
調(diào)度器是Kubernetes集群中的一個核心組件,它監(jiān)視未調(diào)度的Pod對象,并為其選擇最佳的節(jié)點。
2 Kubernetes調(diào)度的工作原理
2.1 原理詳解
Kubernetes調(diào)度的工作原理可以概括為以下幾個步驟:
創(chuàng)建Pod:用戶通過Kubernetes API創(chuàng)建Pod對象,并在其中指定Pod的資源需求、容器鏡像等信息。
調(diào)度器監(jiān)視Pod:Kubernetes調(diào)度器監(jiān)視集群中的未調(diào)度Pod對象,并為其選擇最佳的節(jié)點。
選擇節(jié)點:調(diào)度器通過算法選擇最佳的節(jié)點,并將Pod綁定到該節(jié)點上。調(diào)度器選擇節(jié)點的依據(jù)包括節(jié)點的資源使用情況、Pod的資源需求、親和性和反親和性等。
綁定Pod到節(jié)點:調(diào)度器將Pod和節(jié)點之間的綁定信息保存在etcd數(shù)據(jù)庫中,以便節(jié)點可以獲取Pod的調(diào)度信息。
節(jié)點啟動Pod:節(jié)點定期檢查etcd數(shù)據(jù)庫中的Pod調(diào)度信息,并啟動相應的Pod。如果節(jié)點故障或資源不足,調(diào)度器會重新調(diào)度Pod,并將其綁定到其他節(jié)點上運行。
?2.2 其他因素
調(diào)度器選擇節(jié)點的過程中,有以下一些因素需要考慮:
節(jié)點資源:調(diào)度器需要考慮節(jié)點的資源使用情況,如CPU、內(nèi)存、磁盤等。
Pod資源需求:調(diào)度器需要考慮Pod的資源需求,如CPU、內(nèi)存、磁盤等。
親和性和反親和性:調(diào)度器可以根據(jù)Pod指定的親和性和反親和性規(guī)則來選擇節(jié)點。
節(jié)點污點(Taints)和容忍度(Tolerations):節(jié)點可以設置污點,表示節(jié)點上不允許運行特定類型的Pod。Pod可以設置容忍度,以容忍節(jié)點上的污點。
節(jié)點標簽:調(diào)度器可以根據(jù)節(jié)點的標簽來選擇最佳的節(jié)點。
3 調(diào)度算法
調(diào)度算法是指決定Pod應該調(diào)度到哪個節(jié)點上的算法。Kubernetes提供了多種調(diào)度算法,可以根據(jù)實際情況選擇合適的算法。以下是Kubernetes常用的調(diào)度算法:
- ?隨機算法
- 最小負載算法
- 貪心算法
- 最佳適應算法
- 加權最小平均負載算法?
3.1 隨機算法?
隨機算法是最簡單的調(diào)度算法之一。
- 規(guī)則:它會隨機選擇一個可用節(jié)點,并將Pod調(diào)度到該節(jié)點上。
- 效率:這種算法簡單、快速,適用于不需要考慮資源利用率和負載均衡的場景。
- 缺點:隨機算法可能會導致節(jié)點資源的不均衡分配和資源浪費。
3.2 最小負載算法?
最小負載算法會選擇當前負載最低的節(jié)點,并將Pod調(diào)度到該節(jié)點上。
這種算法可以避免節(jié)點資源的不均衡分配,但是可能會導致某些節(jié)點的資源利用率過高,從而影響其他Pod的運行。
3.2.1 優(yōu)點?
優(yōu)點在于可以避免節(jié)點資源的不均衡分配和負載過高的問題,從而提高Kubernetes集群的資源利用率和穩(wěn)定性。同時,最小負載算法可以與其他調(diào)度算法結合使用,例如可以與負載均衡算法結合使用,以進一步優(yōu)化節(jié)點的資源利用率和負載均衡。
3.2.2 缺點?
缺點在于可能會導致某些節(jié)點的資源利用率過低,從而浪費資源。此外,最小負載算法不能保證Pod被調(diào)度到最優(yōu)的節(jié)點上,無法滿足一些特殊的需求。
3.3 貪心算法?
貪心算法是一種基于啟發(fā)式的算法,它嘗試在當前狀態(tài)下找到最優(yōu)解。
在Pod調(diào)度中,貪心算法會嘗試選擇最優(yōu)節(jié)點,并將Pod調(diào)度到該節(jié)點上。
貪心算法的核心思想是:在每一步選擇中都采取在當前狀態(tài)下最優(yōu)的選擇,從而希望最終能夠得到全局最優(yōu)解。
優(yōu)點?
優(yōu)點在于速度快,可以快速找到局部最優(yōu)解,適用于大規(guī)模的Kubernetes集群。
同時,貪心算法可以與其他調(diào)度算法結合使用,例如可以與最小負載算法或最佳適應算法結合使用,以實現(xiàn)更好的負載均衡和資源利用率。
缺點
貪心算法的缺點在于不能保證找到全局最優(yōu)解,有可能會陷入局部最優(yōu)解而無法跳出。
此外,貪心算法也可能會導致某些節(jié)點的資源利用率過高,從而影響其他Pod的運行。
使用?
在實際使用中,貪心算法可以與其他調(diào)度算法結合使用,例如可以與最小負載算法或最佳適應算法結合使用,以實現(xiàn)更好的負載均衡和資源利用率。同時,調(diào)度器還可以使用親和性/反親和性規(guī)則來篩選節(jié)點,以進一步優(yōu)化貪心算法的效果。
3.4 最佳適應算法?
最佳適應算法(Best Fit Algorithm),它會選擇當前可用節(jié)點中最適合Pod的節(jié)點,并將Pod調(diào)度到該節(jié)點上。
最佳適應算法考慮節(jié)點的資源利用率情況,避免將Pod調(diào)度到資源利用率不高的節(jié)點上,從而實現(xiàn)負載均衡和資源利用率最大化的目的。
優(yōu)點
最佳適應算法的優(yōu)點在于可以避免節(jié)點資源的不均衡分配和資源浪費,從而提高Kubernetes集群的資源利用率和穩(wěn)定性。同時,最佳適應算法可以與其他調(diào)度算法結合使用,例如可以與貪心算法或最小負載算法結合使用,以進一步優(yōu)化節(jié)點的資源利用率和負載均衡。
缺點
最佳適應算法的缺點在于可能會導致節(jié)點資源利用率的不穩(wěn)定性,從而影響Pod的運行。如果節(jié)點資源利用率變化較快,最佳適應算法可能會導致Pod頻繁地遷移,從而影響Pod的穩(wěn)定性和性能。
3.5 加權最小平均負載算法?
加權最小平均負載算法(Weighted Least-Connection Algorithm)是一種調(diào)度算法,它會選擇當前負載最低且權重最高的節(jié)點,并將Pod調(diào)度到該節(jié)點上。加權最小平均負載算法考慮節(jié)點的負載情況和權重,避免將Pod調(diào)度到負載過高或權重過低的節(jié)點上,從而實現(xiàn)負載均衡和資源利用率最大化的目的。
優(yōu)點
加權最小平均負載算法的優(yōu)點在于可以避免節(jié)點資源的不均衡分配和負載過高的問題,從而提高Kubernetes集群的資源利用率和穩(wěn)定性。同時,加權最小平均負載算法可以根據(jù)節(jié)點的權重分配資源,以滿足不同節(jié)點的需求。
缺點
加權最小平均負載算法的缺點在于可能會陷入局部最優(yōu)解而無法跳出。如果節(jié)點資源利用率變化較快,加權最小平均負載算法可能會導致Pod頻繁地遷移,從而影響Pod的穩(wěn)定性和性能。
4 調(diào)度組件
Kubernetes的調(diào)度組件是Kubernetes集群中的一個核心組件,它負責將Pod調(diào)度到Kubernetes集群中的節(jié)點上,以實現(xiàn)負載均衡和資源利用率最大化的目的。
調(diào)度組件通常由以下兩個組件組成:
調(diào)度器(Scheduler):負責對新創(chuàng)建的Pod進行調(diào)度,選擇合適的節(jié)點,并將Pod調(diào)度到該節(jié)點上。調(diào)度器會根據(jù)節(jié)點的資源利用率、親和性/反親和性規(guī)則、Pod的資源需求等因素來選擇節(jié)點,并確保Pod能夠被成功地調(diào)度和運行。
調(diào)度器擴展器(Scheduler Extender):負責對調(diào)度器進行擴展,并提供額外的調(diào)度策略和規(guī)則。調(diào)度器擴展器可以通過插件的形式進行擴展,例如可以添加自定義的親和性/反親和性規(guī)則、節(jié)點選擇器、調(diào)度器過濾器等,以實現(xiàn)更靈活和多樣化的調(diào)度策略。
調(diào)度器實現(xiàn)
Kubernetes還提供了多種調(diào)度器實現(xiàn),包括:
默認調(diào)度器(Default Scheduler):是Kubernetes中的默認調(diào)度器,負責對新創(chuàng)建的Pod進行調(diào)度,并將Pod調(diào)度到合適的節(jié)點上。
自定義調(diào)度器(Custom Scheduler):是一種自定義的調(diào)度器實現(xiàn),可以根據(jù)實際需求來定義調(diào)度策略和規(guī)則,以實現(xiàn)更靈活和多樣化的調(diào)度功能。
擴展調(diào)度器(Extended Scheduler):是一種支持調(diào)度器擴展器的調(diào)度器實現(xiàn),可以通過調(diào)度器擴展器來添加自定義的調(diào)度規(guī)則和策略,以實現(xiàn)更靈活和多樣化的調(diào)度功能。
總之,Kubernetes的調(diào)度組件是Kubernetes集群中的一個核心組件,可以實現(xiàn)負載均衡和資源利用率最大化的目的。在實際使用中,需要根據(jù)實際情況和需求來選擇合適的調(diào)度器實現(xiàn)和調(diào)度策略,以確保Kubernetes集群的資源利用率最大化。
5 調(diào)度示例
5.1 如何實現(xiàn)pod的調(diào)度
當我們創(chuàng)建一個Pod時,Pod會被加入到調(diào)度器的無調(diào)度隊列中等待被調(diào)度。調(diào)度器會定期輪詢無調(diào)度隊列,檢查每個Pod的調(diào)度需求,然后將它們調(diào)度到最適合的節(jié)點上。調(diào)度器的調(diào)度決策是基于節(jié)點的資源利用率、Pod的資源需求和親和性/反親和性規(guī)則等因素。
以下是Pod的調(diào)度流程的詳細步驟:
- 獲取Pod的?調(diào)度需求
- 選擇適合的節(jié)點
- 分配Pod到節(jié)點
- 保存調(diào)度信息
- 啟動Pod
1 獲取Pod的?調(diào)度需求
調(diào)度器首先獲取Pod的調(diào)度需求,包括Pod的容器鏡像、資源需求和親和性/反親和性規(guī)則等。
2 選擇適合的節(jié)點?
調(diào)度器會根據(jù)Pod的調(diào)度需求和集群的資源情況,在可用的節(jié)點中選擇最適合的一個。調(diào)度器會根據(jù)節(jié)點的資源利用率、Pod的資源需求和親和性/反親和性規(guī)則等因素來進行選擇。如果沒有可用的節(jié)點滿足Pod的需求,Pod就會一直處于等待調(diào)度的狀態(tài)。
3 分配Pod到節(jié)點?
調(diào)度器會將Pod分配到選擇的節(jié)點上,并將Pod對象的
spec.nodeName
字段設置為節(jié)點的名稱。這樣,kubelet就可以知道Pod被分配到了哪個節(jié)點上。
4 保存調(diào)度信息?
調(diào)度器會將Pod和節(jié)點之間的綁定信息保存在etcd數(shù)據(jù)庫中。這些信息包括Pod的名稱、命名空間、調(diào)度時間戳和節(jié)點名稱等。kube-scheduler會周期性地檢查這些綁定信息,以確保Pod已經(jīng)被分配到了正確的節(jié)點上。
5 啟動Pod?
當Pod被分配到節(jié)點上時,kubelet會從etcd數(shù)據(jù)庫中獲取Pod的配置信息,并根據(jù)這些信息啟動Pod中的容器。容器啟動后,Pod就可以開始運行了。
總之,Pod的調(diào)度流程是由調(diào)度器來完成的。調(diào)度器會根據(jù)節(jié)點的資源利用率、Pod的資源需求和親和性/反親和性規(guī)則等因素來選擇最適合的節(jié)點,并將Pod分配到節(jié)點上運行。一旦Pod被分配到節(jié)點上,kubelet就會從etcd數(shù)據(jù)庫中獲取Pod的配置信息,并啟動Pod中的容器。
5.2 調(diào)度器如何選擇最適合的節(jié)點?
調(diào)度器在選擇最適合的節(jié)點時,會根據(jù)一定的策略和算法進行選擇。以下是調(diào)度器選擇節(jié)點的一些主要考慮因素:
- ?資源利用率
- Pod的資源需求
- 親和性和反親和性規(guī)則
- 節(jié)點的標簽和注釋
- 節(jié)點的負載均衡?
資源利用率?
調(diào)度器會檢查集群中各個節(jié)點的資源使用情況,包括CPU、內(nèi)存、磁盤和網(wǎng)絡等方面的使用情況。調(diào)度器會選擇資源利用率最低的節(jié)點,以確保Pod能夠得到足夠的資源。
Pod的資源需求?
調(diào)度器會檢查Pod的資源需求,包括CPU和內(nèi)存等方面的需求。調(diào)度器會選擇可以滿足Pod資源需求的節(jié)點,以避免Pod因為資源不足而無法正常運行。
親和性和反親和性規(guī)則?
調(diào)度器會檢查Pod的親和性和反親和性規(guī)則。親和性規(guī)則指定了Pod應該調(diào)度到哪些節(jié)點上,而反親和性規(guī)則指定了Pod不應該調(diào)度到哪些節(jié)點上。調(diào)度器會根據(jù)這些規(guī)則來選擇節(jié)點,以確保Pod被調(diào)度到最合適的節(jié)點上。
節(jié)點的標簽和注釋?
調(diào)度器會檢查節(jié)點的標簽和注釋。節(jié)點的標簽可以用來標識節(jié)點的特性和屬性,而注釋可以提供節(jié)點的附加信息。調(diào)度器可以使用這些信息來選擇最適合的節(jié)點。
節(jié)點的負載均衡?
調(diào)度器會嘗試在集群中平衡負載,避免某個節(jié)點過度負載,而其他節(jié)點資源利用率太低。調(diào)度器會選擇負載均衡最優(yōu)的節(jié)點,以確保集群中的資源利用率最大化。
總之,調(diào)度器在選擇最適合的節(jié)點時,會考慮多個因素,包括資源利用率、Pod的資源需求、親和性和反親和性規(guī)則、節(jié)點的標簽和注釋以及負載均衡等。調(diào)度器會使用這些信息來選擇最優(yōu)的節(jié)點,以確保Pod被調(diào)度到最合適的節(jié)點上。
5.3 調(diào)度器如何檢查Pod的資源需求?
調(diào)度器在檢查Pod的資源需求時,會查看Pod的定義中
spec.containers[*].resources.requests spec.containers[*].resources.limits
字段中指定的資源需求和資源限制。
resources.requests
字段指定了Pod啟動時所需的最小資源量。例如,CPU和內(nèi)存等資源的需求量。如果Pod的實際資源使用量超過了請求量,Kubernetes會殺死該Pod并重新啟動。
resources.limits
字段指定了Pod最大可以使用的資源量。例如,CPU和內(nèi)存等資源的限制量。如果Pod的實際資源使用量超過了限制量,Kubernetes會限制該Pod的資源使用,并可能導致Pod無法正常運行。調(diào)度器會根據(jù)這些資源需求和限制來選擇最適合的節(jié)點來調(diào)度Pod。調(diào)度器在選擇節(jié)點時會考慮節(jié)點的資源利用率和Pod的資源需求,以確保Pod可以得到足夠的資源來正常運行。
5.2?如何設置Pod的親和性和反親和性規(guī)則
在Kubernetes中,親和性(Affinity)和反親和性(Anti-Affinity)是用來指定Pod和Node之間關系的規(guī)則。通過設置親和性和反親和性規(guī)則,可以讓調(diào)度器將Pod分配到最合適的節(jié)點上。
親和性規(guī)則用于指示Pod應該被調(diào)度到哪些節(jié)點上,而反親和性規(guī)則用于指示Pod不應該被調(diào)度到哪些節(jié)點上。下面是如何設置Pod的親和性和反親和性規(guī)則:
通過標簽(Labels)設置親和性和反親和性規(guī)則?
可以通過標簽來設置Pod的親和性和反親和性規(guī)則。首先,需要在Pod中定義標簽選擇器(Label Selector),然后使用Node Affinity和Pod Affinity來指定親和性規(guī)則,使用Node Anti-Affinity和Pod Anti-Affinity來指定反親和性規(guī)則。例如,以下是一個使用標簽選擇器和親和性規(guī)則的Pod定義:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: my-label operator: In values: - my-value
在上面的示例中,Pod選擇器使用
matchExpressions
指定了一個標簽選擇器,該選擇器選擇my-label=my-value
的節(jié)點。然后,使用nodeAffinity
指定了一個親和性規(guī)則,該規(guī)則要求Pod被調(diào)度到擁有該標簽的節(jié)點上。
通過拓撲域(Topology)設置親和性和?反親和性規(guī)則
可以使用Topology來指定Pod的親和性和反親和性規(guī)則。Topology是指節(jié)點的拓撲結構,如拓撲域、區(qū)域、機架等。使用Topology可以確保Pod被調(diào)度到拓撲結構相似的節(jié)點上。例如,以下是一個使用Topology和親和性規(guī)則的Pod定義:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: my-app topologyKey: rack
在上面的示例中,Pod選擇器使用
matchLabels
指定了一個標簽選擇器,該選擇器選擇app=my-app
的Pod。然后,使用topologyKey
指定了一個親和性規(guī)則,該規(guī)則要求Pod被調(diào)度到與已經(jīng)調(diào)度了app=my-app
的Pod在同一個rack中的節(jié)點上。總之,通過設置親和性和反親和性規(guī)則,可以讓調(diào)度器將Pod分配到最合適的節(jié)點上??梢允褂脴撕灮蛲負溆騺碓O置Pod的親和性和反親和性規(guī)則。注意,正確的設置親和性和反親和性規(guī)則需要了解集群的拓撲結構和資源使用情況,否則可能會導致Pod無法正確調(diào)度。
5.2?如何設置Pod的資源限制和請求
在Kubernetes中,可以通過設置Pod的資源限制和請求來控制Pod使用的資源量。資源限制(Resource Limits)指定了Pod最大可以使用的資源量,而資源請求(Resource Requests)則指定了Pod啟動時所需的最小資源量。設置Pod的資源限制和請求可以確保Pod在運行時不會使用過多的資源,并且可以提高Pod在集群中的調(diào)度成功率。
以下是如何設置Pod的資源限制和請求的示例:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image resources: limits: cpu: "1" memory: "500Mi" requests: cpu: "0.5" memory: "250Mi"
在上面的示例中,Pod中的容器
my-container
設置了資源限制和請求。容器的資源限制是1個CPU核心和500MiB內(nèi)存,而容器的資源請求是0.5個CPU核心和250MiB內(nèi)存。可以通過以下方式設置資源限制和請求:
CPU和內(nèi)存?
可以使用CPU和內(nèi)存來設置資源限制和請求。CPU的單位是CPU核心,內(nèi)存的單位是字節(jié)??梢允褂靡韵赂袷街付–PU和內(nèi)存:
- CPU:使用分數(shù)或整數(shù)表示CPU核心數(shù)量。例如,0.5表示一半核心,1表示一個核心,2表示兩個核心。
- 內(nèi)存:使用字節(jié)、千字節(jié)、兆字節(jié)或吉字節(jié)表示內(nèi)存大小。例如,1Gi表示1個吉字節(jié),500Mi表示500兆字節(jié)。
其他資源?
除了CPU和內(nèi)存之外,還可以使用其他資源來設置資源限制和請求,如GPU、存儲等。不同的資源可以使用不同的單位,具體取決于資源類型??梢栽贙ubernetes文檔中查看各種資源類型的詳細信息。
總之,設置Pod的資源限制和請求可以控制Pod使用的資源量??梢允褂肅PU和內(nèi)存來設置資源限制和請求,也可以使用其他資源類型。在設置資源限制和請求時,需要考慮Pod所需的資源量以及集群的資源使用情況,以避免Pod無法正常運行或影響其他Pod的運行。文章來源:http://www.zghlxwxcb.cn/news/detail-510033.html
6 總結
總之,Kubernetes調(diào)度是Kubernetes的核心功能之一,它能夠自動將Pod分配到最合適的節(jié)點上,并確保Pod在所選節(jié)點上正常運行。調(diào)度器通過算法選擇最佳的節(jié)點,并將Pod綁定到該節(jié)點上。調(diào)度器選擇節(jié)點的依據(jù)包括節(jié)點的資源使用情況、Pod的資源需求、親和性和反親和性等。管理員可以根據(jù)自己的需求選擇不同的調(diào)度算法,并監(jiān)視調(diào)度器的日志以確保集群的正常運行。?文章來源地址http://www.zghlxwxcb.cn/news/detail-510033.html
7 投票
到了這里,關于【K8S系列】深入解析K8S調(diào)度的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!