調(diào)度方式
- 定向調(diào)度
- 親和性調(diào)度
- 污點與容忍
1. 定向調(diào)度
1.1 nodeName
nodeName 用于強(qiáng)制約束將Pod調(diào)度到指定Name的Node節(jié)點上。這種方式持舆,其實是跳過Scheduler的調(diào)度邏輯,直接將Pod調(diào)度到指定名稱的節(jié)點上锥腻。
1.2 nodeSelector
nodeSelector 用于將Pod調(diào)度到指定標(biāo)簽的Node節(jié)點上。它是通過k8s的label-selector機(jī)制實現(xiàn)的母谎,在Pod創(chuàng)建之前旷太,會由Scheduler使用MatchNodeSelector調(diào)度策略進(jìn)行l(wèi)abel匹配,找出目標(biāo)node销睁。然后將Pod調(diào)度到目標(biāo)節(jié)點供璧,該匹配是強(qiáng)制約束
apiVersion: v1
kind: Pod
metadata:
name: podsc
namespace: dev
spec:
#nodeName: 192.168.0.30
# nodeSelector:
# nodename: node20
containers:
- image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
name: podsc
2.親和性調(diào)度
2.1 nodeAffinity node親和性
nodeAffinity 是以node為目標(biāo),解決Pod可以調(diào)度到那些node的問題冻记。
注意:
a. 如果同時設(shè)置了nodeSelector和nodeAffinity那么必須要滿足這兩個條件才能調(diào)度到節(jié)點上睡毒。
b. 如果nodeAffinity指定了多個nodeSelectorTerms,那么只需要滿足一個能夠匹配成功即可調(diào)度冗栗。
c. 如果一個nodeSelectorTerms中有多個matchExpressions演顾,則同一個節(jié)點必須要滿足所有的才能匹配成功。
d. 如果一個pod所在的Node在Pod運(yùn)行期間標(biāo)簽發(fā)生了改變隅居,不再符合Pod的節(jié)點親和性需求钠至,則系統(tǒng)忽略此變化。因為已經(jīng)經(jīng)過scheduler調(diào)度胎源。只有重新部署觸發(fā)scheduler才能重新調(diào)度棉钧。
應(yīng)用場景:
- 特殊資源使用:例如磁盤ssd,pod需要高IO性能涕蚤。
- 特殊場景:重點業(yè)務(wù)需要部署在常年沒有出現(xiàn)過故障的機(jī)器上等宪卿。
2.1.1 requiredDuringSchedulingIgnoredDuringExecution 硬限制,必須要node滿足這些條件才能調(diào)度万栅,否則就調(diào)度不上去, 不經(jīng)過scheduler 這個也屬于定向調(diào)度
apiVersion: v1
kind: Pod
metadata:
name: affinitytest
namespace: dev
spec:
containers:
- name: affinitytest
image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodename
operator: In
values: ["node20", "node21"]
2.1.2 preferredDuringSchedulingIgnoredDuringExecution 軟限制佑钾,非必要滿足這些條件,需要經(jīng)過scheduler烦粒,當(dāng)不滿足這些條件時則選擇其他節(jié)點休溶。
apiVersion: v1
kind: Pod
metadata:
name: affinitytest
namespace: dev
spec:
containers:
- name: affinitytest
image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 10
preference:
matchExpressions:
- key: nodename
operator: In
values: ["node24", "node23"] //沒有這些標(biāo)簽的
2.2 podAffinity pod親和性
podAffinity 是以pod為目標(biāo),解決pod可以和哪些已存在的pod部署在同一個拓?fù)溆蛑械膯栴}。
應(yīng)用場景:
- Pod之間需要頻繁交互兽掰,有必要使用親和性讓兩個應(yīng)用盡可能的靠近芭碍,這樣可以減少因網(wǎng)絡(luò)通信而帶來的性能損耗。
- 高可用場景下禾进,將同一個業(yè)務(wù)的pod將其自動放到部署了相同應(yīng)用pod的機(jī)器上豁跑。
2.2.1 preferredDuringSchedulingIgnoredDuringExecution 軟限制即不滿足也可調(diào)度
# pod親和度參照Pod
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: dev
labels:
kk: vv
spec:
containers:
- name: test
image: 192.168.0.200/public/nginx:v1
# Pod親和度使用軟限制
apiVersion: v1
kind: Pod
metadata:
name: affinitytest
namespace: dev
spec:
containers:
- name: affinitytest
image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution: #硬限制
- weight: 10
podAffinityTerm:
namespaces: #指定參照Pod的名稱空間[]
- "dev"
topologyKey: kubernetes.io/hostname #指定匹配后的調(diào)度作用域
labelSelector:
matchExpressions:
- key: kk
operator: In
values:
- "vv"
- "bb"
2.2.2 requiredDuringSchedulingIgnoredDuringExecution 硬限制不滿足則無法調(diào)度直接報錯
# pod親和度參照Pod
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: dev
labels:
kk: vv
spec:
containers:
- name: test
image: 192.168.0.200/public/nginx:v1
# Pod親和度使用硬限制
apiVersion: v1
kind: Pod
metadata:
name: affinitytest
namespace: dev
spec:
containers:
- name: affinitytest
image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "kk"
operator: In
values:
- "yy"
- "xx"
namespaces:
- "dev"
topologyKey: kubernetes.io/hostname
2.3 podAntiAffinity pod反親性
podAntiAffinity 是以pod為目標(biāo)廉涕,解決pod不能和哪些已存在pod部署在同一個拓?fù)溆蛑械膯栴}
- 當(dāng)應(yīng)用采用多副本部署時泻云,有必要采用反親和性進(jìn)行打散,可以有效提高服務(wù)的高可用性狐蜕。
注意:反親和硬限制情況下宠纯,如果沒有 匹配到指定標(biāo)簽的pod 那么就會按照其他算法來進(jìn)行分配。一般還會搭配其他調(diào)度算法進(jìn)行調(diào)度层释。
2.3.1 Pod反親和性requiredDuringSchedulingIgnoredDuringExecution硬限制
apiVersion: v1
kind: Pod
metadata:
name: affinitytest
namespace: dev
spec:
containers:
- name: affinitytest
image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
affinity:
podAntiAffinity: #Pod反親和性
requiredDuringSchedulingIgnoredDuringExecution: #硬限制
- labelSelector:
matchExpressions: #匹配kk的值在yy 或者 xx 中的標(biāo)簽
- key: "kk"
operator: In
values:
- "yy"
- "vv"
namespaces:
- "dev"
topologyKey: kubernetes.io/hostname #作用域主機(jī)打散
2.3.1 Pod反親和性preferredDuringSchedulingIgnoredDuringExecution軟限制
apiVersion: v1
kind: Pod
metadata:
name: affinitytest
namespace: dev
spec:
containers:
- name: affinitytest
image: 192.168.0.200/public/nginx:v1
imagePullPolicy: Always
affinity:
podAntiAffinity: #Pod反親和性
preferredDuringSchedulingIgnoredDuringExecution: #硬限制
- labelSelector:
matchExpressions: #匹配kk的值在yy 或者 xx 中的標(biāo)簽
- key: "kk"
operator: In
values:
- "yy"
- "vv"
namespaces:
- "dev"
topologyKey: kubernetes.io/hostname #作用域主機(jī)打散
3.污點與容忍
3.1 污點
通過在Node上添加污點屬性婆瓜,決定是否允許Pod調(diào)度過來。
污點的格式為:key=value:effect
key和value是污點的標(biāo)簽贡羔,effect描述污點的作用廉白,支持如下三個選項:
- PreferNoSchedule: Scheduler盡量避免把Pod調(diào)度到具有該污點的Node上,除非沒有其他節(jié)點可調(diào)度乖寒。
- NoSchdule: Scheduler不會把Pod調(diào)度到具有該污點的Node上猴蹂,但是不會影響當(dāng)前Node上已經(jīng)存在的Pod。
- NoExecute: Scheduler不會把Pod調(diào)度到具有該污點的Node上楣嘁,同時也會將Node上已經(jīng)存在的Pod隔離磅轻,除非是容忍程度為NoExecute。
注意:當(dāng)節(jié)點打上污點設(shè)置為NoSchedule時通過指定節(jié)點(nodeName)任然可以設(shè)置運(yùn)行到該節(jié)點,但是使用nodeSelector就不可以逐虚。
- 設(shè)置污點:
kubectl taint node NODENAME KEY=VALUE:EFFECT
- 去除污點
kubectl taint nodes NODENAME KEY:EFFECT-
- 去除所有污點
kubectl taint nodes NODENAME KEY-
3.2 容忍污點
當(dāng)節(jié)點設(shè)置了污點時聋溜,如果允許Pod調(diào)度到該污點上時需要在pod中設(shè)置容忍污點。 pod.spec.toleroations
apiVersion: v1
kind: Pod
metadata:
name: test33
namespace: dev
labels:
kk: vv
spec:
nodeName: 192.168.0.21
containers:
- name: test33
image: 192.168.0.200/public/nginx:v1
tolerations: //容忍污點
- key: "tag" // 對應(yīng)污點KEY叭爱,若為空則意味著匹配所有的鍵
operator: "Equal" // 匹配符撮躁,支持Equal和Exists(默認(rèn))
value: "tagtaint" // 對應(yīng)污點值
effect: "NoExecute" // 對應(yīng)污點的級別,空則匹配所有
#tolerationSeconds: //容忍時間买雾,當(dāng)effect為NoExecute時生效馒胆,表示pod在Node上停留的時間,當(dāng)時間到期時將會從此節(jié)點轉(zhuǎn)移走凝果,若永遠(yuǎn)沒有設(shè)置則永遠(yuǎn)不會被剔除
[root@master10 yaml]# kgpoowiden dev
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test33 1/1 Running 0 9s 172.20.4.223 192.168.0.21 <none> <none>
[root@master10 yaml]# kdno 192.168.0.21 | grep Ta
Taints: tag=tagtaint:NoExecute
4.隔離與驅(qū)逐
- 通常在需要對Node進(jìn)行停機(jī)維護(hù)時祝迂,一般需要進(jìn)行對節(jié)點的隔離拒絕新的Pod調(diào)度到該節(jié)點上。
kubectl describe node NODENAME
程序也是通過對節(jié)點添加不可調(diào)度的污點來進(jìn)行的隔離器净,使用的隔離程度為:NoSchedule型雳,使用nodeName來進(jìn)行指定調(diào)度,依然可以調(diào)度上去,可以避免資源不足導(dǎo)致新的Pod所有節(jié)點不可調(diào)度后導(dǎo)致節(jié)點Pending纠俭。
- 第二步即為對node節(jié)點上的Pod進(jìn)行驅(qū)逐沿量,drain會是一個平滑終止的過程,不會影響業(yè)務(wù)冤荆。
kubectl drain NODENAME --ignore-daemonsets --force
通常情況下需要忽略掉daemonset朴则,此處還有一些沒有被控制器控制的pod需要強(qiáng)制驅(qū)逐
- 查看當(dāng)前節(jié)點上剩余的pod
[root@master10 yaml]# kgpoowideall | grep 0.20
default daemon1-4w2ng 1/1 Running 0 28m 172.20.3.156 192.168.0.20 <none> <none>
kube-system kube-flannel-ds-amd64-wngbj 1/1 Running 0 28m 192.168.0.20 192.168.0.20 <none> <none>
kube-system node-local-dns-7frgs 1/1 Running 8 41d 192.168.0.20 192.168.0.20 <none> <none>
monitoring node-exporter-52rqc 2/2 Running 16 41d 192.168.0.20 192.168.0.20 <none> <none>
- 確認(rèn)沒有后就可以進(jìn)行維護(hù)或者將機(jī)器踢出集群后進(jìn)行維護(hù)。維護(hù)完畢后取消隔離钓简。
kubectl uncordon NODENAME
- 通過scalePod數(shù)量查看節(jié)點是否調(diào)度后完畢乌妒。