前言
默認(rèn)情況下乞榨,Pod的調(diào)度完全由Master節(jié)點的Scheduler組件經(jīng)過一系列的算法計算得出的颤难,這個過程是不能人工干預(yù)的斋枢。但是實際情況中我們的業(yè)務(wù)非常復(fù)雜,可能需要自己控制Pod到達(dá)某個節(jié)點玄货,于是k8s也給我們提供了一些更加細(xì)粒度的調(diào)度策略設(shè)置皇钞。如NodeSelector,NodeAffinity,PodAffinity,污點和容忍等。
本文主要介紹定向調(diào)度 NodeSelector 松捉,其它調(diào)度后續(xù)文章更新夹界。
定向調(diào)度可以將Pod調(diào)度到指定的Node上,這個過程是強制的隘世,如果調(diào)度的目標(biāo)節(jié)點不存在可柿,那么Pod會運行失敗,并不會調(diào)度到其它節(jié)點丙者。
定向調(diào)度有兩種方式
- nodeName 調(diào)度到指定名稱的節(jié)點复斥,這種方式跳過了Scheduler的調(diào)度邏輯
- nodeSelector 通過 label-selector機制 將Pod調(diào)度到指定標(biāo)簽的Node節(jié)點上
nodeName
查看當(dāng)前集群的所有節(jié)點
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 49d v1.23.9
node01 Ready <none> 49d v1.23.9
node02 Ready <none> 49d v1.23.9
編寫 nginx-nodename.yaml 內(nèi)容如下,通過nodeName調(diào)度到node01節(jié)點
apiVersion: v1
kind: Pod
metadata:
name: nginx-nodename
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeName: node01
啟動Pod械媒,查看Pod詳情注意觀察NODE信息
# 啟動
[root@master scheduler]# kubectl create -f nginx-nodename.yaml
pod/nginx-nodename created
# 查看Pod詳情 已經(jīng)運行成功并且調(diào)度到了node01
[root@master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-nodename 1/1 Running 0 11s 10.244.1.69 node01 <none> <none>
上面是正常流程永票,前面我們提到,這個調(diào)度是強制性的滥沫,如果沒有該node節(jié)點是否運行不成功侣集,下面我們來驗證下,修改上面yaml兰绣,將 nodeName: node01修改為 nodeName: node03
啟動Pod世分,觀察詳情
# 查看pod看到Node雖然在node03但是并沒有運行成功
[root@master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-nodename 0/1 Pending 0 14s <none> node03 <none> <none>
# 等待一會,因為沒有節(jié)點的原因缀辩,該pod會自動刪除
[root@master scheduler]# kubectl get pod -o wide
No resources found in default namespace.
nodeSelector
在Pod創(chuàng)建之前臭埋,會通過 MatchNodeSelector 調(diào)度策略進(jìn)行節(jié)點標(biāo)簽匹配,如果找到對應(yīng)節(jié)點含有此標(biāo)簽臀玄,則調(diào)度到該節(jié)點瓢阴,如果找到多個挑選一個即可,如果沒有找到則Pod運行失斀∥蕖(前面提到了該機制是強制性的)
通過kubectl label命令給node01打上北京機房的標(biāo)簽荣恐,給node02打上上海機房的標(biāo)簽
kubectl label nodes node01 area=bj
kubectl label nodes node02 area=shanghai
# 查看標(biāo)簽是否設(shè)置成功
kubectl get nodes --show-labels
編寫 nginx-nodeselector.yaml 內(nèi)容如下 通過 nodeSelector指定調(diào)度到bj機房
apiVersion: v1
kind: Pod
metadata:
name: nginx-nodeselector
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
area: bj #指定調(diào)度到北京機房
北京機房測試
啟動Pod,查看Pod詳情注意觀察NODE信息
# 啟動Pod
[root@master scheduler]# kubectl create -f nginx-nodeselector.yaml
pod/nginx-nodeselector created
# 查看詳情累贤,調(diào)度到了node01
[root@master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-nodeselector 1/1 Running 0 41s 10.244.1.70 node01 <none> <none>
上海機房測試
修改area為shanghai 再次啟動Pod叠穆,查看Pod詳情注意觀察NODE信息
# 刪除之前的pod
[root@master scheduler]# kubectl delete -f nginx-nodeselector.yaml
pod "nginx-nodeselector" deleted
# 啟動修改后的Pod
[root@master scheduler]# kubectl create -f nginx-nodeselector.yaml
pod/nginx-nodeselector created
# 查看詳情,調(diào)度到了node02
[root@master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-nodeselector 1/1 Running 0 5s 10.244.2.23 node02 <none> <none>
無匹配機房測試
修改area為changsha 再次啟動Pod,查看Pod詳情
# 刪除之前的pod
[root@master scheduler]# kubectl delete -f nginx-nodeselector.yaml
pod "nginx-nodeselector" deleted
# 啟動修改后的Pod
[root@master scheduler]# kubectl create -f nginx-nodeselector.yaml
pod/nginx-nodeselector created
# 查看詳情臼膏,并沒有啟動成功
[root@master scheduler]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-nodeselector 0/1 Pending 0 12s <none> <none> <none> <none>
# 查看啟動過程硼被,報錯了
[root@master scheduler]# kubectl describe pod nginx-nodeselector|grep -A 100 Event
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 64s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match Pod's node affinity/selector.
由于找不到匹配的node幾點,前面提到了該機制是強制性的渗磅,所以pod是運行不起來的嚷硫,這種方式調(diào)度失敗了是不會刪除pod检访,我們需要手動刪除下。
如果需要刪除節(jié)點標(biāo)簽仔掸,執(zhí)行如下命令
kubectl label node node01 area-
kubectl label node node02 area-
Pod的定向調(diào)度就介紹到這里脆贵,該方式只是一個簡單的限制了Pod所在節(jié)點的方法,后面我們介紹親和性調(diào)度嘉汰,它極大的擴展了Pod的調(diào)度能力丹禀。
歡迎關(guān)注,學(xué)習(xí)不迷路鞋怀!