一、創(chuàng)建一個(gè)Pod的工作流程
二袜炕、Pod中影響調(diào)度的主要屬性
三本谜、資源限制對(duì)Pod調(diào)度的影響
四、nodeSelector &?nodeAffinity
五偎窘、Taint(污點(diǎn)) &?Tolerations(污點(diǎn)容忍)
六乌助、nodeName
一、創(chuàng)建一個(gè)Pod的工作流程
? ? ? kubernetes基于list-watch機(jī)制的控制器架構(gòu)陌知,實(shí)現(xiàn)組建間交互的解耦他托。其他組件監(jiān)控自己負(fù)責(zé)的資源,當(dāng)這些資源發(fā)生變化時(shí)仆葡,kube-apiserver會(huì)通知這些組件赏参,這個(gè)過程類似于發(fā)布與訂閱。
創(chuàng)建流程:
1沿盅、kubectl?run/apply創(chuàng)建一個(gè)pod把篓,向apiserver發(fā)起請(qǐng)求
2、apiserver會(huì)將請(qǐng)求的配置寫到etcd
3腰涧、etcd響應(yīng)處理結(jié)果給apiserver韧掩,apiserver響應(yīng)處理結(jié)果給kubectl
4、scheduler收到需要?jiǎng)?chuàng)建pod的請(qǐng)求窖铡,根據(jù)自己調(diào)度算法選擇一個(gè)合適的節(jié)點(diǎn)分配疗锐,并將結(jié)果反饋給apiserver
5、kubelet收到需要?jiǎng)?chuàng)建這個(gè)節(jié)點(diǎn)的pod费彼,在調(diào)度容器引擎創(chuàng)建容器滑臊,容器引擎將結(jié)果反饋給kubelet,kubelet匯總pod狀態(tài)反饋給apiserver
工作流程圖:少了controller-manager和kube-proxy組件箍铲,創(chuàng)建pod是不需要這兩個(gè)組件的简珠。
controller-manager是創(chuàng)建工作負(fù)載控制器才會(huì)用到
kube-proxy創(chuàng)建service才使用的
二、Pod中影響調(diào)度的主要屬性
三、資源限制對(duì)Pod調(diào)度的影響
容器資源限制:
1聋庵、resources.limits.cpu
2膘融、resources.limits.memory
容器使用的最小資源需求,作為容器調(diào)度事資源分配的依據(jù):
1祭玉、resources.requests.cpu
2氧映、resources.requests.memory
cpu單位:可以寫m也可以寫浮點(diǎn)數(shù)。如:0.5=500m脱货,1=1000m
資源配額注:
1岛都、request必須小于limits。
2振峻、requests配置建議低于limits的20%-30%
3臼疫、m是cpu的一個(gè)計(jì)量單位,稱為毫核扣孟,如節(jié)點(diǎn)2C4G烫堤,2C=2*1000m。
4凤价、如果設(shè)置cpu的值是浮點(diǎn)數(shù)鸽斟,會(huì)自動(dòng)轉(zhuǎn)m單位
5、如果沒有節(jié)點(diǎn)滿足requests配置要求利诺,pod不會(huì)被創(chuàng)建
問題:
1富蓄、如果request配置超出節(jié)點(diǎn)配置會(huì)怎么樣?
pod無法分配慢逾,pendding狀態(tài)
2立倍、如果只是limits超出節(jié)點(diǎn)配置會(huì)怎么樣?
pod正常分配侣滩,可以超賣
3帐萎、如果limits設(shè)置太大(超出節(jié)點(diǎn)配置)會(huì)怎樣?
pod正常分配胜卤,可以超賣疆导,但是如果超出節(jié)點(diǎn)配置比較多,出現(xiàn)節(jié)點(diǎn)資源打滿的幾率就比較大
4葛躏、怎么查看節(jié)點(diǎn)資源分配情況澈段?
# kubectl describe node? ? <所有node>
#?kubectl get nodes? ? ? ? <獲取所有node>
#?# kubectl describe node hs-develop-560? ? <獲取指定node資源分布>
四、node Selector & nodeAffinity
1舰攒、nodeSelector:?
用于將pod調(diào)度到匹配label的Node上败富,如果沒有匹配的標(biāo)簽會(huì)調(diào)度失敗。
作用:
a摩窃、約束Pod到特定的節(jié)點(diǎn)運(yùn)行
b兽叮、完全匹配節(jié)點(diǎn)標(biāo)簽
應(yīng)用場景:
a芬骄、專用節(jié)點(diǎn):根據(jù)業(yè)務(wù)線將Node分組管理
b、配備特殊硬件:部分Node配有ssd硬盤鹦聪、GPU
示例:
第一步账阻、給節(jié)點(diǎn)添加標(biāo)簽
格式:# kubectl? label nodes? <node-name>? <label-key>=<label-value>
例如:# kubectl label nodes k8s-node1 disktype=ssd
驗(yàn)證:# kubectl get nodes --show-labels
第二步、添加nodeSelector字段到Pod配置中
最后驗(yàn)證:
# kubectl get pods -o wide
2泽本、nodeAffinity:
節(jié)點(diǎn)親和性淘太,與nodeSelector作用一樣,但相比更靈活规丽,滿足更多條件蒲牧。如:
1、匹配有更多的邏輯組合赌莺,不只是字符串的完全相等冰抢,支持的操作符:In,Notln艘狭,Exists挎扰,DoesNotExist,Gt缓升,Lt
2鼓鲁、電鍍分為軟策略和硬策略蕴轨,而不是硬性要求
a港谊、硬<required>:?必須滿足
b、軟<preferred>:?嘗試滿足橙弱,但不保證
查看標(biāo)簽為gpu的node:
# kubectl? get? node? -l? gpu=yes
硬性配置:
軟性配置:
注:weight:1-100歧寺,值越大,權(quán)重越大棘脐,pod調(diào)度到符合標(biāo)簽的節(jié)點(diǎn)概率越高
五斜筐、Taint(污點(diǎn)) &?Tolerations(污點(diǎn)容忍)
Taints:避免Pod調(diào)度到特定Node上
Tolerations:允許Pod調(diào)度到持有Taints的Node上
應(yīng)用場景:
1、專用節(jié)點(diǎn):根據(jù)業(yè)務(wù)線將Node分組管理蛀缝,希望在默認(rèn)情況下不調(diào)度該節(jié)點(diǎn)顷链,只有配置了污點(diǎn)容忍才允許分配。
2屈梁、配備特殊硬件:部分Node配有ssd硬盤嗤练、GPU,希望在more情況下不調(diào)度該節(jié)點(diǎn),只有配置了污點(diǎn)容忍才允許分配
3在讶、基于Taint的驅(qū)逐
第一步:給節(jié)點(diǎn)添加污點(diǎn)
格式:# kubectl taint? node? [node]? key=value:[effect]
例如:# kubectl taint node k8s-node1 gpu=yes:NoSchedule
驗(yàn)證: # kubectl describe node k8s-node1 | grep Taint
其中[effect]可取值:
1煞抬、NoSchedule:一定不能被調(diào)度
2、PreferNoChedule:盡量不要調(diào)度构哺,非必須配置容忍
3革答、NoExecute:不僅不會(huì)調(diào)度,還會(huì)驅(qū)逐Node上已有的pod
第二步、添加污點(diǎn)容忍(tolrations)字段到pod配置中
去掉污點(diǎn):
# kubectl taint node [node] key:[effect] -
小結(jié):
# nodeSelector:節(jié)點(diǎn)做好分組残拐,希望pod根據(jù)配置調(diào)度到部分節(jié)點(diǎn)
#?Taints:節(jié)點(diǎn)做特殊用途途茫,不希望正常pod分配過來
容忍所有污點(diǎn):
調(diào)度失敗原因分析:# kubectl describe pod xxx
1、pod配置的requests.cpu沒有滿足
2蹦骑、pod配置的nodeSelector沒有節(jié)點(diǎn)滿足
3慈省、節(jié)點(diǎn)都有污點(diǎn),pod沒有配置污點(diǎn)容忍
六眠菇、nodeName
指定節(jié)點(diǎn)名稱边败,用于將pod調(diào)度到指定的Node上,不經(jīng)過調(diào)度器捎废。