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