默認(rèn)的情況下,一個(gè)pod在哪個(gè)node節(jié)點(diǎn)上運(yùn)行,是由scheduler組件采取對(duì)應(yīng)的算法計(jì)算出來(lái)的,這個(gè)過(guò)程是不受人工控制的,在實(shí)際的使用過(guò)程中,這不能夠滿(mǎn)足客觀的場(chǎng)景,針對(duì)這樣的情況,k8s 提供了四大類(lèi)調(diào)度方式:
- 自動(dòng)調(diào)度: 運(yùn)行在哪個(gè)node節(jié)點(diǎn)上完全由scheduler 經(jīng)過(guò)一些里的算法計(jì)算出來(lái)
- 定向調(diào)度:NodeName、NodeSelector
- 親和性調(diào)度:NodeAffinity、PodAffinity、PodAntiAffinity
- 污點(diǎn)(容忍)調(diào)度:taints、Toleration
- 定向調(diào)度
定向調(diào)度,指的是利用在 Pod 上聲明的 nodeName 或 nodeSelector ,以此將 Pod 調(diào)度到期望的 Node 節(jié)點(diǎn)上。這里的調(diào)度是強(qiáng)制的,這就意味著即使要調(diào)度的目標(biāo) Node 不存在,也會(huì)向上面進(jìn)行調(diào)度,只不過(guò) Pod 運(yùn)行失敗而已。
NodeName方式調(diào)度
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
nodeName: k8s-node1 # 指定調(diào)度到k8s-node1節(jié)點(diǎn)上
containers:
- name: nginx
image: nginx:1.20.2
resources:
limits:
cpu: 200m
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
ports:
- containerPort: 80
name: http
volumeMounts:
- name: localtime
mountPath: /etc/localtime
volumes:
- name: localtime
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
restartPolicy: Always
NodeSelector方式調(diào)度
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: default
labels:
app: nginx
spec:
nodeSelector:
nodeevn: pro # 指定調(diào)度到 nodeevn = pro 標(biāo)簽的 Node 節(jié)點(diǎn)上
containers:
- name: nginx
image: nginx:1.20.2
resources:
limits:
cpu: 200m
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
ports:
- containerPort: 80
name: http
volumeMounts:
- name: localtime
mountPath: /etc/localtime
volumes:
- name: localtime
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
restartPolicy: Always
- 親和性調(diào)度
雖然定向調(diào)度的兩種方式,使用起來(lái)非常方便,但是也有一定的問(wèn)題,那就是如果沒(méi)有滿(mǎn)足條件的 Node,那么 Pod 將不會(huì)被運(yùn)行,即使在集群中還有可用的 Node 列表也不行,這就限制了它的使用場(chǎng)景?;谏厦娴膯?wèn)題,Kubernetes 還提供了一種親和性調(diào)度(Affinity)。它在 nodeSelector 的基礎(chǔ)之上進(jìn)行了擴(kuò)展,可以通過(guò)配置的形式,實(shí)現(xiàn)優(yōu)先選擇滿(mǎn)足條件的 Node 進(jìn)行調(diào)度,如果沒(méi)有,也可以調(diào)度到不滿(mǎn)足條件的節(jié)點(diǎn)上,使得調(diào)度更加靈活。
● Affinity 主要分為三類(lèi):
○ nodeAffinity(node親和性):以 Node 為目標(biāo),解決 Pod可 以調(diào)度到那些 Node 的問(wèn)題。
○ podAffinity(pod親和性):以 Pod 為目標(biāo),解決 Pod 可以和那些已存在的 Pod 部署在同一個(gè)拓?fù)溆蛑械膯?wèn)題。
○ podAntiAffinity(pod反親和性):以 Pod 為目標(biāo),解決 Pod 不能和那些已經(jīng)存在的 Pod 部署在同一拓?fù)溆蛑械膯?wèn)題。
關(guān)于親和性和反親和性的使用場(chǎng)景的說(shuō)明:
● 親和性:如果兩個(gè)應(yīng)用頻繁交互,那么就有必要利用親和性讓兩個(gè)應(yīng)用盡可能的靠近,這樣可以較少因網(wǎng)絡(luò)通信而帶來(lái)的性能損耗。
● 反親和性:當(dāng)應(yīng)用采用多副本部署的時(shí)候,那么就有必要利用反親和性讓各個(gè)應(yīng)用實(shí)例打散分布在各個(gè) Node 上,這樣可以提高服務(wù)的高可用性。
pod.spec.affinity.nodeAffinity
requiredDuringSchedulingIgnoredDuringExecution # Node節(jié)點(diǎn)必須滿(mǎn)足指定的所有規(guī)則才可以,硬性過(guò)濾
nodeSelectorTerms # 節(jié)點(diǎn)選擇列表
matchFields # 按節(jié)點(diǎn)字段列出的節(jié)點(diǎn)選擇器要求列表
matchExpressions # 按節(jié)點(diǎn)標(biāo)簽列出的節(jié)點(diǎn)選擇器要求列表(推薦)
key # 鍵
values # 值
operator # 關(guān)系符 支持Exists, DoesNotExist, In, NotIn, Gt, Lt
preferredDuringSchedulingIgnoredDuringExecution # 優(yōu)先調(diào)度到滿(mǎn)足指定的規(guī)則的Node,軟性評(píng)分 (傾向)
preference # 一個(gè)節(jié)點(diǎn)選擇器項(xiàng),與相應(yīng)的權(quán)重相關(guān)聯(lián)
matchFields # 按節(jié)點(diǎn)字段列出的節(jié)點(diǎn)選擇器要求列表
matchExpressions # 按節(jié)點(diǎn)標(biāo)簽列出的節(jié)點(diǎn)選擇器要求列表(推薦)
key # 鍵
values # 值
operator # 關(guān)系符 支持In, NotIn, Exists, DoesNotExist, Gt, Lt
weight # 傾向權(quán)重,在范圍1-100。
● podAffinity 主要實(shí)現(xiàn)以運(yùn)行的 Pod 為參照,實(shí)現(xiàn)讓新創(chuàng)建的 Pod 和參照的 Pod 在一個(gè)區(qū)域的功能。
● podAntiAffinity 主要實(shí)現(xiàn)以運(yùn)行的 Pod 為參照,讓新創(chuàng)建的 Pod 和參照的 Pod 不在一個(gè)區(qū)域的功能。
● PodAffinity 的可選配置項(xiàng):
pod.spec.affinity.podAffinity
requiredDuringSchedulingIgnoredDuringExecution 硬限制
namespaces 指定參照pod的namespace
topologyKey 指定調(diào)度作用域
labelSelector 標(biāo)簽選擇器
matchExpressions 按節(jié)點(diǎn)標(biāo)簽列出的節(jié)點(diǎn)選擇器要求列表(推薦)
key 鍵
values 值
operator 關(guān)系符 支持In, NotIn, Exists, DoesNotExist.
matchLabels 指多個(gè)matchExpressions映射的內(nèi)容
preferredDuringSchedulingIgnoredDuringExecution 軟限制
podAffinityTerm 選項(xiàng)
namespaces
topologyKey
labelSelector
matchExpressions
key 鍵
values 值
operator
matchLabels
weight 傾向權(quán)重,在范圍1-1
- 污點(diǎn)和容忍
● 前面的調(diào)度方式都是站在 Pod 的角度上,通過(guò)在 Pod 上添加屬性,來(lái)確定 Pod 是否要調(diào)度到指定的 Node 上,其實(shí)我們也可以站在 Node 的角度上,通過(guò)在 Node 上添加污點(diǎn)屬性,來(lái)決定是否運(yùn)行 Pod 調(diào)度過(guò)來(lái)。
● Node 被設(shè)置了污點(diǎn)之后就和 Pod 之間存在了一種相斥的關(guān)系,進(jìn)而拒絕 Pod 調(diào)度進(jìn)來(lái),甚至可以將已經(jīng)存在的 Pod 驅(qū)逐出去。
污點(diǎn)的格式為:
key=value:effect
key 和 value 是污點(diǎn)的標(biāo)簽及對(duì)應(yīng)的值
effect 描述污點(diǎn)的作用
● effect 支持如下的三個(gè)選項(xiàng):
○ PreferNoSchedule:Kubernetes 將盡量避免把 Pod 調(diào)度到具有該污點(diǎn)的 Node 上,除非沒(méi)有其他節(jié)點(diǎn)可以調(diào)度;換言之,盡量不要來(lái),除非沒(méi)辦法。
○ NoSchedule:Kubernets 將不會(huì)把 Pod 調(diào)度到具有該污點(diǎn)的 Node 上,但是不會(huì)影響當(dāng)前 Node 上已經(jīng)存在的 Pod ;換言之,新的不要來(lái),在這的就不要?jiǎng)印?br> ○ NoExecute:Kubernets 將不會(huì)將 Pod 調(diào)度到具有該污點(diǎn)的 Node 上,同時(shí)會(huì)將 Node 上已經(jīng)存在的 Pod 驅(qū)逐;換言之,新的不要來(lái),這這里的趕緊走。
- 新增污點(diǎn)
kubectl taint node xxx key=value:effect
- 去除污點(diǎn)
kubectl taint node xxx key:effect-
- 去除所有污點(diǎn)
kubectl taint node xxx key-
- 查看污點(diǎn)
kubectl describe node xxx | grep -i taints
容忍:
● 上面介紹了污點(diǎn)的作用,我們可以在 Node上 添加污點(diǎn)用來(lái)拒絕 Pod 調(diào)度上來(lái),但是如果就是想讓一個(gè) Pod 調(diào)度到一個(gè)有污點(diǎn)的 Node 上去,這時(shí)候應(yīng)該怎么做?這就需要使用到容忍。
污點(diǎn)就是拒絕,容忍就是忽略,Node 通過(guò)污點(diǎn)拒絕 Pod 調(diào)度上去,Pod 通過(guò)容忍忽略拒絕。
kubectl explain pod.spec.tolerations
…
FIELDS:
key # 對(duì)應(yīng)著要容忍的污點(diǎn)的鍵,空意味著匹配所有的鍵
value # 對(duì)應(yīng)著要容忍的污點(diǎn)的值
operator # key-value的運(yùn)算符,支持Equal和Exists(默認(rèn))
effect # 對(duì)應(yīng)污點(diǎn)的effect,空意味著匹配所有影響
tolerationSeconds # 容忍時(shí)間, 當(dāng)effect為NoExecute時(shí)生效,表示pod在Node上的停留時(shí)間文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-718554.html
● 污點(diǎn)和容忍的匹配:
○ 當(dāng)滿(mǎn)足如下條件的時(shí)候,Kubernetes 認(rèn)為污點(diǎn)和容忍匹配:
■ 鍵(key)相同。
■ 效果(effect)相同。
■ 污點(diǎn)的 operator 為:
● Exists ,此時(shí)污點(diǎn)中不應(yīng)該指定 value 。
● Equal,此時(shí)容忍的 value 應(yīng)該和污點(diǎn)的 value 相同。
○ 如果不指定 operator ,默認(rèn)為 Equal 。
● 特殊情況:
○ 容忍中沒(méi)有定義 key ,但是定義了 operator 為 Exists ,Kubernetes 則認(rèn)為此容忍匹配所有的污點(diǎn),如:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-718554.html
tolerations:
- operator: Exists
# 最終,所有有污點(diǎn)的機(jī)器我們都能容忍,Pod 都可以調(diào)度。
tolerations: # 容忍
- key: "tag" # 要容忍的污點(diǎn)的key
operator: Exists # 操作符
# 最終,有這個(gè)污點(diǎn)的機(jī)器我們可以容忍,Pod 都可以調(diào)度。
到了這里,關(guān)于k8s資源調(diào)度的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!