集群調(diào)度:
Scheduler的調(diào)度算法:
預(yù)算策略
過濾出合適的節(jié)點(diǎn)
優(yōu)先策略
選擇部署的節(jié)點(diǎn)
NodeName:硬策略,不走調(diào)度策略,node1
nodeSelector:根據(jù)節(jié)點(diǎn)的標(biāo)簽選擇,會(huì)走一個(gè)調(diào)度算法
只要是走調(diào)度算法,在不滿足預(yù)算策略的情況下,所有的pod都是pending
Node節(jié)點(diǎn)的親和性:
硬策略:必須滿足的條件。匹配原則根據(jù)節(jié)點(diǎn)的標(biāo)簽
軟策略:盡量滿足,而不是一定滿足
以上說的都是node節(jié)點(diǎn)
接下來我們來說pod的
親和性和反親和性:
調(diào)度策略: ?????匹配標(biāo)簽 ????????操作符 ?????????????????????拓?fù)溆???調(diào)度目標(biāo)
Node的親和性: 主機(jī)標(biāo)簽 ???????in?in exists doesNotExist Gt Lt 不支持 ???指定主機(jī)
Pod 的親和性 ???pod的標(biāo)簽 ?????in notin exists doesnotexist ??????支持 ????pod和指定標(biāo)簽的pod部署在同一拓?fù)鋱D
Pod的反親和性 ?pod的標(biāo)簽 ?????in notin exists doesnotexist ??????支持
拓?fù)溆颍?/h3>
k8s集群節(jié)點(diǎn)當(dāng)中的一個(gè)組織結(jié)構(gòu),可以根據(jù)節(jié)點(diǎn)的物理關(guān)系或者邏輯關(guān)系進(jìn)行劃分,可以用來表示節(jié)點(diǎn)之間的空間關(guān)系,網(wǎng)絡(luò)關(guān)系或者其他類型的關(guān)系
標(biāo)簽,主機(jī)標(biāo)簽
Pod
注意點(diǎn):
Pod的親和性和策略,在配置時(shí),必須加上拓?fù)溆虻年P(guān)鍵字topologykey,指向節(jié)點(diǎn)標(biāo)簽
Pod親和性的策略分為硬策略和軟策略
Pod親和性的notin可以替代反親和性
Pod親和性主要是為了把相關(guān)聯(lián)的pod部署在同一節(jié)點(diǎn)
你在進(jìn)行部署的時(shí)候怎么考慮node節(jié)點(diǎn):
污點(diǎn)和容忍可以配合node節(jié)點(diǎn)一塊使用
演示:
演示:
解析:
添加標(biāo)簽
另外一種方式:
硬策略:
軟策略寫法:
反親和性:
軟策略:
硬策略:
污點(diǎn):
是node的調(diào)度機(jī)制,不是pod
被設(shè)為污點(diǎn)的節(jié)點(diǎn),不會(huì)部署pod
污點(diǎn)和親和性相反,親和性是盡量選擇和一定選擇
污點(diǎn)的節(jié)點(diǎn)一定不被選擇嗎?
Taint三種:
- NoSchedule:k8s不會(huì)把pod調(diào)度到這個(gè)節(jié)點(diǎn)上
- preferNoSchedule:如果污點(diǎn)類型是他,只是盡量避免把pod部署在該節(jié)點(diǎn)上,而不是一定
- NoExecute:如果污點(diǎn)類型是它的話,k8s將會(huì)把該節(jié)點(diǎn)pod驅(qū)逐出去,而且也不會(huì)調(diào)度到這個(gè)節(jié)點(diǎn),基于控制器創(chuàng)建的pod,雖然被驅(qū)逐,會(huì)在其他節(jié)點(diǎn)部署,自主pod會(huì)被直接殺死
注意點(diǎn):節(jié)點(diǎn)服務(wù)器需要維護(hù)時(shí),服務(wù)器關(guān)機(jī),節(jié)點(diǎn)上的pod將會(huì)失效,在工作中我們主要部署pod的方式控制控制器部署,deployment最多的,一旦節(jié)點(diǎn)設(shè)置被驅(qū)逐,控制器創(chuàng)建的pod會(huì)在其他節(jié)點(diǎn)繼續(xù)部署
所有的pod都會(huì)被驅(qū)逐,更命名空間無關(guān),所有的一切都會(huì)被驅(qū)逐,不論你的創(chuàng)建方式是什么,都會(huì)被驅(qū)逐,系統(tǒng)集群組件不會(huì)被驅(qū)逐
查看污點(diǎn)命令:
kubectl describe nodes node01 | grep -i taints
清緩存命令
echo 1 > /proc/sys/vm/drop_caches
污點(diǎn)演示三種情況:
第一種:
設(shè)置污點(diǎn)
刪除污點(diǎn)
第二種:
盡量不調(diào)度
第三種:
如果污點(diǎn)類型是它的話,k8s將會(huì)把該節(jié)點(diǎn)pod驅(qū)逐出去,而且也不會(huì)調(diào)度到這個(gè)節(jié)點(diǎn)
容忍:
即使集群節(jié)點(diǎn)上設(shè)置了污點(diǎn),有了容忍機(jī)制,依然可以在設(shè)置為污點(diǎn)的節(jié)點(diǎn)上部署pod
特殊情況,NoExecute依然可以部署pod,但是是有生命周期,時(shí)間一到,pod被銷毀然后重新拉起。生命周期結(jié)束之后,會(huì)驅(qū)逐一部分pod到其他節(jié)點(diǎn)上,有點(diǎn)節(jié)點(diǎn)還是會(huì)保留在污點(diǎn)節(jié)點(diǎn)上。
該節(jié)點(diǎn)維護(hù)完畢,測試一下節(jié)點(diǎn)的工作是否正常
刪除所有污點(diǎn):
設(shè)置污點(diǎn):
kubectl taint node master01 key=1:NoSchedule
配置容忍:
設(shè)置為驅(qū)逐類型
kubectl describe nodes node01 | grep -i taints
kubectl taint node master01 key=1:NoExecute
kubectl taint node node02 key=1:NoSchedule-
設(shè)置容忍時(shí)間
apiVersion: apps/v1
kind: Deployment
metadata:
??labels:
????app: nginx2
??name: nginx2
spec:
??replicas: 3
??selector:
????matchLabels:
??????app: nginx2
??template:
????metadata:
??????labels:
????????app: nginx2
????spec:
??????containers:
??????- image: nginx:1.22
????????name: nginx2
??????tolerations:
??????- key: key
????????operator: Equal
????????value: "1"
????????effect: NoExecute
????????tolerationSeconds: 36
36秒之后,被驅(qū)逐之后,也會(huì)出現(xiàn)
演示污點(diǎn)容忍機(jī)制
kubectl describe nodes node01 | grep -i taints
kubectl taint node node02 key=1:NoExecute-
kubectl taint node node01 key=1:NoSchedule
第二種情況
解析:
指定key的值,指標(biāo)節(jié)點(diǎn)的標(biāo)簽,但是不指定污點(diǎn)的類型,那么所有節(jié)點(diǎn)上只要包含了這個(gè)指定的標(biāo)簽,可以容忍所有的污點(diǎn)
沒有key,不匹配節(jié)點(diǎn)標(biāo)簽,容忍所有污點(diǎn),但是類型是指定的類型
總結(jié):
Node的親和性
Pod的親和性和反親和性
污點(diǎn)和容忍
總結(jié)起來就是如何選擇節(jié)點(diǎn)部署pod,選擇一個(gè)期望的節(jié)點(diǎn)部署pod
舉例:
我有多個(gè)master節(jié)點(diǎn):
Kubectl taint node master節(jié)點(diǎn)名稱
盡量不往master節(jié)點(diǎn)上部署pod,但是不是一定的,防止資源浪費(fèi),自定義一個(gè)標(biāo)簽
業(yè)務(wù)維護(hù):
Node02需要維護(hù)兩個(gè)小時(shí),但是這個(gè)節(jié)點(diǎn)上還有業(yè)務(wù)pod在運(yùn)行
就需要把這個(gè)節(jié)點(diǎn)的污點(diǎn)設(shè)置為驅(qū)逐
我們部署pod,一般都是使用deployment部署的pod,會(huì)在其他節(jié)點(diǎn)重新部署,并不是被殺死,自主試的pod會(huì)被殺死
一旦節(jié)點(diǎn)恢復(fù),一定要把污點(diǎn)去除
Cordon和drain
Cordon:可以直接把節(jié)點(diǎn)標(biāo)記為不可用狀態(tài)
Drain:排水,把該節(jié)點(diǎn)下的pod全部轉(zhuǎn)移到其他的node節(jié)點(diǎn)上云霄
一旦執(zhí)行了drain,被執(zhí)行的節(jié)點(diǎn)就會(huì)變成不可調(diào)度狀態(tài)
會(huì)驅(qū)逐該節(jié)點(diǎn)上的所有pod
清空污點(diǎn)
kubectl taint node node02 key=1:NoExecute-
kubectl describe nodes master01 | grep -i taints
演示Drain
解析:
kubectl drain node02 --ignore-daemonsets --delete-emptydir-data --force
Drain:排水,標(biāo)記node節(jié)點(diǎn)為不可調(diào)度,然后驅(qū)逐pod
--ignore-daemonsets:忽視daemonset部署的pod,daemonset部署的pod還在節(jié)點(diǎn)
--delete-local-data:有本地掛載卷的pod會(huì)被強(qiáng)制殺死
--force:強(qiáng)制釋放,不是控制器管理的pod
如何改回來
重點(diǎn):
node親和性
Pod親和性
污點(diǎn):NoExeccute(驅(qū)逐)
Cordon和drain
--ignore-daemonset daemonset部署的一般是重要后臺(tái)運(yùn)行的,系統(tǒng)pod,所以不動(dòng)
總結(jié):
Node親和性
Pod親和性
Pod反親和性
污點(diǎn):NoExecute
容忍
Cordon
Drain文章來源:http://www.zghlxwxcb.cn/news/detail-792780.html
如何部署pod時(shí)比較重要的集群調(diào)度機(jī)制,合理的配置pod的調(diào)度機(jī)制可以是資源最大化應(yīng)用文章來源地址http://www.zghlxwxcb.cn/news/detail-792780.html
到了這里,關(guān)于k8s的策略的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!