[kubernetes] Schedule --- Node调度与隔离
目錄
1. NodeSelector
2. 親和與反親和? Affinity and Anti-affinity
節(jié)點(diǎn)Node 親和性
pod 親和性和反親和性
3. 污點(diǎn)(Taints)與容忍(tolerations)
1、設(shè)置污點(diǎn):
2、去除污點(diǎn):
3、Pod 容忍污點(diǎn)示例:
4. effect的類型
5. 使用場景
1. NodeSelector
如果需要限制Pod到指定的Node上運(yùn)行,則可以給Node打標(biāo)簽并給Pod配置NodeSelector。
給Node打標(biāo)簽
給Pod設(shè)置NodeSelector
apiVersion: v1 kind: Pod metadata:name: nginxlabels:env: test spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector:gputype: p4 #對應(yīng)Node的Label?
這是一種強(qiáng)規(guī)則,沒有妥協(xié),必須遵守。
特點(diǎn):簡單,容易配置
缺點(diǎn):強(qiáng)規(guī)則,沒有妥協(xié),若不存在符合條件的node,則無法部署。
nodeSelector 將會在后續(xù)的版本中廢除,還是建議大家使用使用親和性策略。
kubectl label nodes kube-node node=kube-node kubectl get node -a -l "node=kube-node"sepc.nodeSelector中指定:
?
Label selector
Label是附著到object上(例如Node, Pod)的鍵值對。可以在創(chuàng)建object的時(shí)候指定,也可以在object創(chuàng)建后隨時(shí)指定。Labels的值對系統(tǒng)本身并沒有什么含義,只是對用戶才有意義。
"labels": {"key1" : "value1","key2" : "value2" }?
Label selector有兩種類型:
equality-based :可以使用=、==、!=操作符,可以使用逗號分隔多個(gè)表達(dá)式
set-based :可以使用in、notin、! 操作符,另外還可以沒有操作符,直接寫出某個(gè)label的key,表示過濾有某個(gè)key的object而不管該key的value是何值,!表示沒有該label的object
在API object中設(shè)置label selector
在service、replicationcontroller等object中有對pod的label selector,使用方法只能使用等于操作,例如:
selector:component: redis在Job、Deployment、ReplicaSet和DaemonSet這些object中,支持set-based的過濾,例如:
selector:matchLabels:component: redismatchExpressions:- {key: tier, operator: In, values: [cache]}- {key: environment, operator: NotIn, values: [dev]}?
2. 親和與反親和? Affinity and Anti-affinity
nodeSelector的調(diào)度方式略顯簡單,通過親和和反親和配置,能夠?yàn)檎{(diào)度提供更靈活的策略,主要有以下幾點(diǎn)增強(qiáng):
- 匹配有更多的邏輯組合,不只是字符的完全相等
- 調(diào)度分成軟策略(soft)和硬策略(hard),在軟策略的情況下,如果沒有滿足調(diào)度條件的節(jié)點(diǎn),pod 會忽略這條規(guī)則,繼續(xù)完成調(diào)度過程
軟策略和硬策略的區(qū)分是有用處的,硬策略適用于 pod 必須運(yùn)行在某種節(jié)點(diǎn),否則會出現(xiàn)問題的情況,比如集群中節(jié)點(diǎn)的架構(gòu)不同,而運(yùn)行的服務(wù)必須依賴某種架構(gòu)提供的功能;軟策略不同,它適用于滿不滿足條件都能工作,但是滿足條件更好的情況,比如服務(wù)最好運(yùn)行在某個(gè)區(qū)域,減少網(wǎng)絡(luò)傳輸?shù)取_@種區(qū)分是用戶的具體需求決定的,并沒有絕對的技術(shù)依賴。
節(jié)點(diǎn)Node 親和性
類似于nodeSelector,允許我們指定一些Pod在Node間調(diào)度的約束
支持兩種形式:
- requiredDuringSchedulingIgnoredDuringExecution 必須滿足,如果不滿足則不進(jìn)行調(diào)度
- preferredDuringSchedulingIgnoredDuringExecution 傾向滿足,不滿足的情況下會調(diào)度的不符合條件的Node上
...IgnoreDuringExecution 表示如果在Pod運(yùn)行期間Node的標(biāo)簽發(fā)生變化,導(dǎo)致親和性策略不能滿足,則繼續(xù)運(yùn)行當(dāng)前的Pod。
- requiredDuringSchedulingRequiredDuringExecution 必須滿足,
- requiredDuringSchedulingRequiredDuringExecution 傾向滿足,
...RequiredDuringExecution,如果運(yùn)行的 pod 所在節(jié)點(diǎn)不再滿足條件,kubernetes 會把 pod 從節(jié)點(diǎn)中刪除,重新選擇符合要求的節(jié)點(diǎn)。這個(gè)屬性暫時(shí)還不支持
| requiredDuringSchedulingIgnoredDuringExecution | Runs | Fails | Keeps Running |
| preferredDuringSchedulingIgnoredDuringExecution | Runs | Runs | Keeps Running |
| (un-implemented) requiredDuringSchedulingRequiredDuringExecution | Runs | Fails | Fails |
這個(gè) pod 同時(shí)定義了 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 兩種 nodeAffinity。第一個(gè)要求 pod 運(yùn)行在特定 AZ 的節(jié)點(diǎn)上,第二個(gè)希望節(jié)點(diǎn)最好有對應(yīng)的 another-node-label-key:another-node-label-value 標(biāo)簽。
這里的匹配邏輯是 label 的值在某個(gè)列表中,可選的操作符有:
- In:label 的值在某個(gè)列表中
- NotIn:label 的值不在某個(gè)列表中
- Exists:某個(gè) label 存在
- DoesNotExist: 某個(gè) label 不存在
- Gt:label 的值大于某個(gè)值(字符串比較)
- Lt:label 的值小于某個(gè)值(字符串比較)
如果nodeAffinity 中 nodeSelectorTerms 有多個(gè)選項(xiàng),如果節(jié)點(diǎn)滿足任何一個(gè)條件就可以;如果 matchExpressions 有多個(gè)選項(xiàng),則只有同時(shí)滿足這些邏輯選項(xiàng)的節(jié)點(diǎn)才能運(yùn)行 pod。
?
pod 親和性和反親和性
podAffinity 主要解決POD可以和哪些POD部署在同一個(gè)拓?fù)溆蛑械膯栴}(拓?fù)溆蛴弥鳈C(jī)標(biāo)簽實(shí)現(xiàn),可以是單個(gè)主機(jī),也可以是多個(gè)主機(jī)組成的cluster、zone等。),podAntiAffinity主要解決POD不能和哪些POD部署在同一個(gè)拓?fù)溆蛑械膯栴}。它們處理的是Kubernetes集群內(nèi)部POD和POD之間的關(guān)系。
作用域: pod 于pod之間
3. 污點(diǎn)(Taints)與容忍(tolerations)
NodeAffinity節(jié)點(diǎn)親和性,是Pod上定義的一種屬性,使Pod能夠按我們的要求調(diào)度到某個(gè)Node上,而Taints則恰恰相反,它可以讓Node拒絕運(yùn)行Pod,甚至驅(qū)逐Pod。
Taints(污點(diǎn))是Node的一個(gè)屬性,設(shè)置了Taints(污點(diǎn))后,因?yàn)橛辛宋埸c(diǎn),所以Kubernetes是不會將Pod調(diào)度到這個(gè)Node上的,于是Kubernetes就給Pod設(shè)置了個(gè)屬性Tolerations(容忍),只要Pod能夠容忍N(yùn)ode上的污點(diǎn),那么Kubernetes就會忽略Node上的污點(diǎn),就能夠(不是必須)把Pod調(diào)度過去。
因此 Taints(污點(diǎn))通常與Tolerations(容忍)配合使用。
1、設(shè)置污點(diǎn):
kubectl taint node [node] key=value[effect] 示例:kubectl taint node 10.3.1.16 test=16:NoSchedule其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
- NoSchedule:POD 不會被調(diào)度到標(biāo)記為 taints 節(jié)點(diǎn)。
- PreferNoSchedule:NoSchedule 的軟策略版本。
- NoExecute:該選項(xiàng)意味著一旦 Taint 生效,如該節(jié)點(diǎn)內(nèi)正在運(yùn)行的 POD 沒有對應(yīng) Tolerate 設(shè)置,會直接被逐出。
2、去除污點(diǎn):
比如設(shè)置污點(diǎn):kubectl taint node 10.3.1.16 test=16:NoSchedulekubectl taint node 10.3.1.16 test=16:NoExecute去除指定key及其effect:kubectl taint nodes node_name key:[effect]- #(這里的key不用指定value)去除指定key所有的effect: kubectl taint nodes node_name key-示例:kubectl taint node 10.3.1.16 test:NoSchedule-kubectl taint node 10.3.1.16 test:NoExecute-kubectl taint node 10.3.1.16 test-3、Pod 容忍污點(diǎn)示例:
對于tolerations屬性的寫法:
其中的key、value、effect 與Node的Taint設(shè)置需保持一致, 還有以下幾點(diǎn)說明:
1、如果operator的值是Exists,則value屬性可省略。
2、如果operator的值是Equal,則表示其key與value之間的關(guān)系是equal(等于)。
3、如果不指定operator屬性,則默認(rèn)值為Equal。
另外,還有兩個(gè)特殊值:
1、空的key 如果再配合Exists 就能匹配所有的key與value ,也是是能容忍所有node的所有Taints。
2、空的effect 匹配所有的effect。
一個(gè)node上可以有多個(gè)污點(diǎn):
比如 test=16:NoScheduler test2=16:NoSchedule
而在Pod容忍時(shí)只容忍了其中一個(gè):
這樣的結(jié)果是此Pod無法被調(diào)度到key為test的node( 10.3.1.16)上去,因?yàn)榇薔ode上設(shè)置了兩個(gè)污點(diǎn),
而這個(gè)Pod只匹配到了一個(gè)污點(diǎn),也就是只容忍了一個(gè)污點(diǎn),所以可以再加一個(gè)容忍:
如果在設(shè)置node的Taints(污點(diǎn))之前,就已經(jīng)運(yùn)行了一些Pod,那么這些Pod是否還能繼續(xù)在此Node上運(yùn)行? 這就要看設(shè)置Taints污點(diǎn)時(shí)的effect(效果)了。
如果effect的值是NoSchedule或PreferNoSchedule,那么已運(yùn)行的Pod仍然可以運(yùn)行,只是新Pod(如果沒有容忍)不會再往上調(diào)度。
而如果effect的值是NoExecute,那么此Node上正在運(yùn)行的Pod,只要沒有容忍的,立刻被驅(qū)逐。雖然是立刻被驅(qū)逐,但是K8S為了彰顯人性化,又給具有NoExecute效果的污點(diǎn), 在容忍屬性中有一個(gè)可選的tolerationSeconds字段,用來設(shè)置這些Pod還可以在這個(gè)Node之上運(yùn)行多久,給它們一點(diǎn)寬限的時(shí)間,到時(shí)間才驅(qū)逐。
如果是以Pod來啟動的,那么Pod被驅(qū)逐后, 將不會再被運(yùn)行,就等于把它刪除了。
如果是deployment/rc,那么刪除的pod會再其它節(jié)點(diǎn)運(yùn)行。
如果是DaemonSet在此Node上啟動的Pod,那么也不會再被運(yùn)行,直到Node上的NoExecute污被去除或者Pod容忍。
通過對Taints和Tolerations的了解,可以知道,通過它們可以讓某些特定應(yīng)用,獨(dú)占一個(gè)Node:
給特定的Node設(shè)置一個(gè)Taint,只讓某些特定的應(yīng)用來容忍這些污點(diǎn),容忍后就有可能會被調(diào)度到此特定Node,
但是也不一定會調(diào)度給此特定Node,設(shè)置容忍并不阻止調(diào)度器調(diào)度給其它Node,那么如何讓特定應(yīng)用的Node
只能被調(diào)度到此特定的Node呢,這就要結(jié)合NodeAffinity節(jié)點(diǎn)親和性,給Node打個(gè)標(biāo)簽,然后在Pod屬性里
設(shè)置NodeAffinity到Node。如此就能達(dá)到要求了。
4. effect的類型
5. 使用場景
5.1 專用節(jié)點(diǎn)
kubectl taint nodes <nodename> dedicated=<groupName>:NoSchedule
先給Node添加taint,然后給Pod添加相對應(yīng)的 toleration,則該P(yáng)od可調(diào)度到taint的Node,也可調(diào)度到其他節(jié)點(diǎn)如果想讓Pod只調(diào)度某些節(jié)點(diǎn)且某些節(jié)點(diǎn)只接受對應(yīng)的Pod,則需要在Node上添加Label(例如:dedicated=groupName),同時(shí)給Pod的nodeSelector添加對應(yīng)的Label。
5.2 特殊硬件節(jié)點(diǎn)
如果某些節(jié)點(diǎn)配置了特殊硬件(例如CPU),希望不使用這些特殊硬件的Pod不被調(diào)度該Node,以便保留必要資源。即可給Node設(shè)置taint和label,同時(shí)給Pod設(shè)置toleration和label來使得這些Node專門被指定Pod使用。
# kubectl taint
kubectl taint nodes nodename special=true:NoSchedule
# 或者
kubectl taint nodes nodename special=true:PreferNoSchedule
5.3 基于taint驅(qū)逐
effect 值 NoExecute ,它會影響已經(jīng)在節(jié)點(diǎn)上運(yùn)行的 pod,即根據(jù)策略對Pod進(jìn)行驅(qū)逐。
如果 pod 不能忍受effect 值為 NoExecute 的 taint,那么 pod 將馬上被驅(qū)逐
如果 pod 能夠忍受effect 值為 NoExecute 的 taint,但是在 toleration 定義中沒有指定 tolerationSeconds,則 pod 還會一直在這個(gè)節(jié)點(diǎn)上運(yùn)行。
如果 pod 能夠忍受effect 值為 NoExecute 的 taint,而且指定了 tolerationSeconds,則 pod 還能在這個(gè)節(jié)點(diǎn)上繼續(xù)運(yùn)行這個(gè)指定的時(shí)間長度。
參考:
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
?
總結(jié)
以上是生活随笔為你收集整理的[kubernetes] Schedule --- Node调度与隔离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族m711c是什么型号
- 下一篇: thinkpad t480和t490的区