新聞中心
概述
什么是 kube-scheduler ?

專注于為中小企業(yè)提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)德江免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千多家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Kubernetes 集群的核心組件之一,它負(fù)責(zé)為新創(chuàng)建的 Pods 分配節(jié)點(diǎn)。它根據(jù)多種因素進(jìn)行決策,包括:
1. 資源需求和限制:考慮每個(gè) Pod 請(qǐng)求的資源量(如 CPU 和內(nèi)存)以及節(jié)點(diǎn)上可用的資源。
2. 親和性和反親和性規(guī)則:根據(jù) Pod 的親和性設(shè)置選擇最適合的節(jié)點(diǎn)。
3. 健康檢查:確保選擇的節(jié)點(diǎn)健康且能夠運(yùn)行 Pod。
4. 負(fù)載均衡:盡量平衡集群中各個(gè)節(jié)點(diǎn)的負(fù)載。
使用
limits 和 reuqests
在部署對(duì)象中的 spec 中常常會(huì)見(jiàn)到關(guān)于 limits 和 requests 的聲明 ,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: 1Gi
cpu: 1
requests:
memory: 256Mi
cpu: 100m這里的 limits 和 requests 是與 Pod 容器資源管理相關(guān)的兩個(gè)關(guān)鍵概念:
? Limits:指定容器運(yùn)行時(shí)能夠使用的最大資源量
? Requests:指定容器啟動(dòng)時(shí)最低需要的資源量
limits 和 requests 跟 scheduler 有什么關(guān)系 ?
在集群中 kube-scheduler 一直是默默無(wú)聞的幕后工作者,它主要工作內(nèi)容如下:
1. 當(dāng)你創(chuàng)建一個(gè) Deployment,如這個(gè) nginx,是由 kube-scheduler 決策將其調(diào)度到哪個(gè) Node 上運(yùn)行的
2. kube-scheduler 會(huì)監(jiān)聽(tīng) apiserver 獲取集群全局視圖,然后根據(jù) Pod 的資源請(qǐng)求(requests 和 limits)分析
3. 最終 kube-scheduler 會(huì)結(jié)合資源請(qǐng)求和集群的實(shí)際情況來(lái)調(diào)度 Pod
總之,kube-scheduler 會(huì)保證 Pod 會(huì)調(diào)度到滿足其運(yùn)行資源需求的 Node 節(jié)點(diǎn)上。
LimitRange
描述
LimitRange 是資源描述對(duì)象,主要用于限制命名空間內(nèi)資源的使用。它可以設(shè)置默認(rèn)的資源請(qǐng)求和限制,以及資源使用的最大和最小值。它可以確保每個(gè) Pod 或容器在資源使用上遵循特定的策略,從而避免單個(gè) Pod 或容器占用過(guò)多資源。使用示例如下:
創(chuàng)建一個(gè) YAML 文件保存 LimitRange 內(nèi)容,例如:mem-limit-range.yaml:
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 512Mi
defaultRequest:
memory: 256Mi
type: Container應(yīng)用到集群:
$ kubectl apply -f mem-limit-range.yaml查看創(chuàng)建的 LimitRange 對(duì)象:
$ kubectl describe limitrange mem-limit-range輸出:
Name: mem-limit-range
Namespace: default
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Container memory - - 256Mi 512Mi -說(shuō)明:
? Kind:設(shè)置為 LimitRange,用于限制命名空間內(nèi)資源的使用。
? Metadata:設(shè)置資源的名稱
? Spec:
Limits:
default:指定沒(méi)有明確資源限制的容器的默認(rèn)內(nèi)存限制為 512Mi
defaultRequest:指定沒(méi)有明確資源請(qǐng)求的容器的默認(rèn)內(nèi)存請(qǐng)求。這里設(shè)置為 256Mi
type:應(yīng)用這些限制的資源類型,在這里是 Container
驗(yàn)證
定義一個(gè)沒(méi)有聲明資源請(qǐng)求的部署對(duì)象,文件命名為: nginx-without-resource.yaml ,如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx應(yīng)用部署到集群:
$ kubectl apply -f nginx-without-resource.yaml等 Pod 創(chuàng)建后,可以通過(guò)檢查它們的配置來(lái)確認(rèn) LimitRange 是否生效。
$ kubectl describe pod [POD_NAME]輸出:
Containers:
#.. ignore
Limits:
memory: 512Mi
Requests:
memory: 256MiinitContainers
initContainers 用于在主應(yīng)用容器啟動(dòng)之前執(zhí)行一些預(yù)備任務(wù)。常見(jiàn)于以下場(chǎng)景:
- 1. 準(zhǔn)備工作:設(shè)置需要的配置文件、數(shù)據(jù)庫(kù)遷移、等待其他服務(wù)就緒等。
- 2. 安全性:權(quán)限提升操作,如改變文件權(quán)限或者執(zhí)行特定的安全檢查。
- 3. 服務(wù)依賴性:等待其他服務(wù)或數(shù)據(jù)庫(kù)可用。
initContainers 在執(zhí)行完其任務(wù)后會(huì)停止,且必須成功完成才能啟動(dòng)主容器。非常適合用于啟動(dòng)前的初始化任務(wù)。
示例:
在部署對(duì)象中聲明 initContainers 屬性:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 10']
containers:
- name: nginx
image: nginx將部署對(duì)象應(yīng)用到集群:
$ kubectl apply -f init-container.yaml當(dāng) Pod 啟動(dòng)后,可以通過(guò)查看事件日志驗(yàn)證容器的加載順序:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m20s default-scheduler Successfully assigned default/nginx-deployment-6445f86ddc-fmmzw to docker-desktop
Normal Pulling 2m20s kubelet Pulling image "busybox:1.28"
Normal Pulled 116s kubelet Successfully pulled image "busybox:1.28" in 23.099396719s (23.099404677s including waiting)
Normal Created 116s kubelet Created container init-myservice
Normal Started 116s kubelet Started container init-myservice
Normal Pulling 106s kubelet Pulling image "nginx"
Normal Pulled 88s kubelet Successfully pulled image "nginx" in 18.382000675s (18.382006008s including waiting)
Normal Created 88s kubelet Created container nginx
Normal Started 88s kubelet Started container nginx可以看到 initContainers 聲明的容器已經(jīng)加載,然后查看特定的日志,來(lái)檢查 Pod 日志輸出:
$ kubectl logs [POD_NAME] -c init-myservice輸出:
The app is running!驗(yàn)證完成。
initContainers 和 kube-scheduler 的關(guān)系 ?
如果 initContainers 沒(méi)有聲明資源需求,默認(rèn)也會(huì)使用 LimitRange 聲明的默認(rèn)資源,這也意味著,initContainers 也是由 kube-scheduler 來(lái)調(diào)度創(chuàng)建的。所以在 initContainers 中加上資源需求也會(huì)影響著 kube-scheduler 的調(diào)度決策。
nodeSelector
在部署對(duì)象中,nodeSelector 屬性的作用是用于把指定 Pod 調(diào)度到具有特定標(biāo)簽的節(jié)點(diǎn)上。如果沒(méi)有滿足要求的 Node 節(jié)點(diǎn),則 Pod 會(huì)持續(xù)等待,示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disktype: ssd在這個(gè)例子中 nodeSelector 屬性值為:disktype: ssd 。這表明這個(gè) Pod 應(yīng)該被調(diào)度到標(biāo)簽為 disktype=ssd 的 Node 節(jié)點(diǎn)上。kube-scheduler 在調(diào)度時(shí),會(huì)選擇合適的節(jié)點(diǎn)以運(yùn)行這個(gè) Pod 時(shí)。
先將部署對(duì)象應(yīng)用到集群中:
$ kubectl apply -f node-selector.yaml然后查看 Pod 狀態(tài):
$ kubectl get pod輸出:
NAME READY STATUS RESTARTS AGE
nginx-deployment-f5bc98d57-pmq9v 0/1 Pending 0 2m17s可以看到創(chuàng)建的 Pod 一直保持在 "Pending" 狀態(tài)。通過(guò)事件日志查看具體原因:
$ kubectl describe pod [POD_NAME]輸出:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 4m38s default-scheduler 0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..從事件日志可以看出,這個(gè) Pod 不能被調(diào)度,因?yàn)闆](méi)有節(jié)點(diǎn)滿足其設(shè)定的節(jié)點(diǎn)選擇條件。因?yàn)槲业募褐写_實(shí)沒(méi)有任何標(biāo)記為 disktype: ssd 的節(jié)點(diǎn)在運(yùn)行。
Affinity 親和性
NodeSelector 的演進(jìn)版本,提供了更復(fù)雜的選擇規(guī)則。除了簡(jiǎn)單的匹配,它們還支持更豐富的條件表達(dá)式,如 "存在"、"不等于"、"在集合中" 等,并且支持對(duì) Pod 之間(Pod Affinity/Anti-Affinity)以及 Pod 與節(jié)點(diǎn)之間(Node Affinity)的親和性/反親和性設(shè)置。在 Kubernetes 后續(xù)版本中 Affinity 也逐漸替代了 NodeSelector。
podAffinity
podAffinity 用于定義 Pods 之間的親和性。使得某個(gè) Pod 被調(diào)度到與其他特定標(biāo)簽的 Pod 相同的節(jié)點(diǎn)上。
使用場(chǎng)景:當(dāng)希望一組服務(wù)緊密地協(xié)同工作時(shí),比如一個(gè)應(yīng)用的不同組件需要低延遲通訊。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-anti
spec:
replicas: 2
selector:
matchLabels:
app: anti-nginx
template:
metadata:
labels:
app: anti-nginx
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: a
operator: In
values:
- b
topologyKey: kubernetes.io/hostname
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- anti-nginx
topologyKey: kubernetes.io/hostname
containers:
- name: with-pod-affinity
image: nginx部署文件展示親和性(Affinity)設(shè)置:
- ? PodAffinity:要求調(diào)度的 Pod 必須與具有特定標(biāo)簽(鍵 a,值 b)的 Pod 在相同的節(jié)點(diǎn)上。
- ? PodAntiAffinity:要求調(diào)度的 Pod 不能與具有相同標(biāo)簽(鍵 app,值 anti-nginx)的 Pod 在相同的節(jié)點(diǎn)上。
將上面部署文件應(yīng)用到集群后,查看 Pods 的分布情況:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-anti-5656fcbb98-62mds 0/1 Pending 0 5s
nginx-anti-5656fcbb98-wxphs 0/1 Pending 0 5s 可以 Pod 因?yàn)橛H和性規(guī)則無(wú)法調(diào)度一直處于等待狀態(tài),查看特定 Pod 的事件日志可以驗(yàn)證:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 27s default-scheduler 0/1 nodes are available: 1 node(s) didn't match pod affinity rules. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..利用 Pod 親和性和反親和性規(guī)則來(lái)控制 Pod 的調(diào)度位置,以實(shí)現(xiàn)特定的調(diào)度需求和負(fù)載分布。
nodeAffinity
用于定義 Pod 與節(jié)點(diǎn)之間的親和性??刂?Pod 被調(diào)度到具有特定標(biāo)簽或?qū)傩缘墓?jié)點(diǎn)上。
適用場(chǎng)景:當(dāng)您需要根據(jù)硬件特性(如 GPU、高性能存儲(chǔ))或其他自定義標(biāo)簽(如環(huán)境標(biāo)簽)調(diào)度 Pod 時(shí)。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx部署文件的親和性(Affinity)設(shè)置:
? nodeAffinity 被設(shè)置為要求 Pod 被調(diào)度到具有 disktype: ssd 標(biāo)簽的節(jié)點(diǎn)上。
將上面部署文件應(yīng)用到集群后,查看 Pod 的運(yùn)行情況:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-565d7797dc-jf5nk 0/1 Pending 0 14s 可以 Pod 因?yàn)橛H和性規(guī)則無(wú)法調(diào)度一直處于等待狀態(tài),查看特定 Pod 的事件日志可以驗(yàn)證:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 89s default-scheduler 0/1 nodes are available: 1 node(s) didn't match Pod's node affinity/selector. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..preferredDuringSchedulingIgnoredDuringExecution
和之前的 requiredDuringScheduling 調(diào)度類型不同,preferredDuringScheduling 表明其是一個(gè)偏好性的調(diào)度,調(diào)度器會(huì)根據(jù)偏好優(yōu)先選擇滿足對(duì)應(yīng)規(guī)則的節(jié)點(diǎn)來(lái)調(diào)度Pod。但如果找不到滿足規(guī)則的節(jié)點(diǎn),調(diào)度器則會(huì)選擇其他節(jié)點(diǎn)來(lái)調(diào)度Pod。
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
containers:
- name: nginx
image: nginx配置說(shuō)明:這里使用的是 preferredDuringSchedulingIgnoredDuringExecution 類型,這意味著調(diào)度器會(huì)盡量但不強(qiáng)制將 Pod 調(diào)度到具有 disktype: ssd 標(biāo)簽的節(jié)點(diǎn)上。
將上面部署文件應(yīng)用到集群后,查看 Pod 的運(yùn)行情況:
NAME READY STATUS RESTARTS AGE
nginx-deployment-69c654d896-7qh8t 1/1 Running 0 28s可以看到雖然我本地沒(méi)有滿足親和性規(guī)則的 Node 節(jié)點(diǎn),但是 Pod 依然可以調(diào)度起來(lái)了。
總結(jié):
? podAffinity 關(guān)注的是 Pod 之間的關(guān)系不同
? nodeAffinity 更關(guān)注 Pod 與節(jié)點(diǎn)特性之間的關(guān)系
requiredDuringScheduling:硬親和,強(qiáng)制型調(diào)度規(guī)則,必須滿足親和性設(shè)置,否則不能調(diào)度
preferredDuringScheduling:軟親和,偏好型調(diào)度規(guī)則,首先找到滿足設(shè)置的節(jié)點(diǎn),沒(méi)有則會(huì)調(diào)度到其他節(jié)點(diǎn)
Taints 污點(diǎn)
Taints 和 Tolerations 是 Kubernetes 中用于控制 Pod 調(diào)度到特定節(jié)點(diǎn)的一種機(jī)制,相比 Affinity 親和性 **相似性 **的機(jī)制,Taints 的規(guī)則是屬于 排斥性 的機(jī)制,用來(lái)“排斥”不滿足特定條件的 Pod。
Taints 有三種效果:
? NoSchedule(不會(huì)調(diào)度新 Pod)
? PreferNoSchedule(盡量避免調(diào)度新 Pod)
? NoExecute(新 Pod 不會(huì)調(diào)度且已存在 Pod 可能會(huì)被遷移)
Taints 常見(jiàn)的應(yīng)用場(chǎng)景:
? 對(duì)于集群中不想共享的 Node,可以加上 Taints 標(biāo)簽表示獨(dú)享
? 用于多租戶 Kubernetes 計(jì)算資源隔離
? Kubernetes 本身使用 Taints 機(jī)制驅(qū)除不可用的 Node
使用示例:
給節(jié)點(diǎn)添加 Taint,防止所有 Pod 自動(dòng)調(diào)度到該節(jié)點(diǎn),除非它們具有匹配的 Tolerations:
$ kubectl taint nodes docker-desktop for-special-user=cadmin:NoSchedule先定義一個(gè)沒(méi)有任何 Tolerations 的 Pod 來(lái)驗(yàn)證:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx將它應(yīng)用到集群,查看 Pod 狀態(tài)會(huì)一直處于 Pending:
NAME READY STATUS RESTARTS AGE
nginx-deployment-77b4fdf86c-wm5f9 0/1 Pending 0 23s從事件日志可以看到是 Taints 在發(fā)揮作用:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 56s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {for-special-user: cadmin}. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..然后再 Pod 定義中添加 Tolerations,允許它被調(diào)度到帶有特定 Taint 的節(jié)點(diǎn)上:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
tolerations:
- key: "for-special-user"
operator: "Equal"
value: "docker-desktop"
effect: "NoSchedule"這個(gè)部署文件設(shè)置了一個(gè) 容忍度 (Tolerations) 規(guī)則:允許 Pod 被調(diào)度到標(biāo)記為 for-special-user=docker-desktop 并且具有 NoSchedule 效果的節(jié)點(diǎn)上。
將它應(yīng)用到集群,查看 Pod 狀態(tài):
NAME READY STATUS RESTARTS AGE
nginx-deployment-dd7d69c9c-77qlf 1/1 Running 0 31sPod 已經(jīng)正常調(diào)度,這也是 Taints 發(fā)揮作用。
如果節(jié)點(diǎn)不在需要 Tanints 作為排除,可以移除 :
$ kubectl taint nodes docker-desktop for-special-user=cadmin:NoSchedule-輸出:
node/docker-desktop untaintedPriorityClass
PriorityClass 用于定義 Pod 的調(diào)度優(yōu)先級(jí)。常見(jiàn)的場(chǎng)景包括:
1. 確保關(guān)鍵服務(wù)優(yōu)先調(diào)度:對(duì)于關(guān)鍵組件,如數(shù)據(jù)庫(kù)、核心應(yīng)用服務(wù),可以設(shè)置更高的優(yōu)先級(jí)。
2. 管理資源爭(zhēng)用:在資源有限的環(huán)境中,通過(guò)設(shè)置不同的優(yōu)先級(jí),管理不同 Pod 的調(diào)度順序。
使用 PriorityClass 的步驟:
1. 創(chuàng)建 PriorityClass:apiVersion: scheduling.k8s.io/v1kind: PriorityClassmetadata: name: high-priorityvalue: 1000000globalDefault: falsedescription: "This priority class should be used for XYZ service pods only."
說(shuō)明:
? value:這是一個(gè)整數(shù),表示該 PriorityClass 的優(yōu)先級(jí)。較高的數(shù)值表示更高的優(yōu)先級(jí)。
? globalDefault:表示為集群中所有沒(méi)有指定優(yōu)先級(jí)的 Pod 的默認(rèn)優(yōu)先級(jí)。
1. 在 Pod 中指定 PriorityClass:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
priorityClassName: high-priority
containers:
- name: mycontainer
image: myimage通過(guò) priorityClassName 應(yīng)用剛才創(chuàng)建的 PriorityClass,從而確保該 Pod 具有更高的調(diào)度優(yōu)先級(jí)。
自定義 scheduler
默認(rèn)的調(diào)度器是面向通用的使用場(chǎng)景設(shè)計(jì)的,如果默認(rèn)的 Kubernetes 調(diào)度器無(wú)法滿足需求,也可以通過(guò)自定義的調(diào)度器來(lái)滿足更加個(gè)性化的需求,示例:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
schedulerName: my-custom-scheduler
containers:
- name: mycontainer
image: myimage社區(qū)也有很多成熟開(kāi)源的自定義調(diào)度器,例如:
? 騰訊 TKE 的調(diào)度器
? 華為 volcano 調(diào)度器
另外也可以參考 kube-scheduler 源碼實(shí)現(xiàn)一個(gè)自己的調(diào)度器。
當(dāng)前題目:Kubernetes漫游:Kube-Scheduler
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/djgdoee.html


咨詢
建站咨詢
