日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[kubernetes] Schedule --- Node调度与隔离

發布時間:2023/12/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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打標簽

# get node的name kubectl get nodes# 設置Label kubectl label nodes <node-name> <label-key>=<label-value> # 例如 kubectl label nodes node1 gputype=p4# 查看Node的Label kubectl get nodes --show-labels

給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

$ kubectl get pods -l environment=production,tier=frontend $ kubectl get pods -l 'environment in (production),tier in (frontend)' $ kubectl get pods -l 'environment in (production, qa)' $ kubectl get pods -l 'environment,environment notin (frontend)'

在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 從節點中刪除,重新選擇符合要求的節點。這個屬性暫時還不支持

AFFINITY SELECTORREQUIREMENTS METREQUIREMENTS NOT METREQUIREMENTS LOST
requiredDuringSchedulingIgnoredDuringExecutionRunsFailsKeeps Running
preferredDuringSchedulingIgnoredDuringExecutionRunsRunsKeeps Running
(un-implemented) requiredDuringSchedulingRequiredDuringExecutionRunsFailsFails
apiVersion: v1 kind: Pod metadata:name: with-node-affinity spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/e2e-az-nameoperator: Invalues:- e2e-az1- e2e-az2preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: another-node-label-keyoperator: Invalues:- another-node-label-valuecontainers:- name: with-node-affinityimage: gcr.io/google_containers/pause:2.0

這個 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之間

apiVersion: v1 kind: Pod metadata:name: with-pod-affinity spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: Invalues:- S1topologyKey: failure-domain.beta.kubernetes.io/zonepodAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: securityoperator: Invalues:- S2topologyKey: kubernetes.io/hostnamecontainers:- name: with-pod-affinityimage: gcr.io/google_containers/pause:2.0

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容忍時只容忍了其中一個:

tolerations:- key: "test"operator: "Equal" value: "16"effect: "NoSchedule"

這樣的結果是此Pod無法被調度到key為test的node( 10.3.1.16)上去,因為此Node上設置了兩個污點,
而這個Pod只匹配到了一個污點,也就是只容忍了一個污點,所以可以再加一個容忍:

tolerations:- key: "test"operator: "Exists" effect: "NoSchedule"- key: "test2"operator: "Equal"value: "16"effect: "NoSchedule"

如果在設置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容忍。

#設置Pod的寬限時間 spec:tolerations: #設置容忍性- key: "test"operator: "Equal" #如果操作符為Exists,那么value屬性可省略value: "16"effect: "NoExecute"tolerationSeconds: 180 #如果運行此Pod的Node,被設置了具有NoExecute效果的Taint(污點),這個Pod將在存活180s后才被驅逐。#如果沒有設置tolerationSeconds字段,將永久運行。

通過對Taints和Tolerations的了解,可以知道,通過它們可以讓某些特定應用,獨占一個Node:
給特定的Node設置一個Taint,只讓某些特定的應用來容忍這些污點,容忍后就有可能會被調度到此特定Node,
但是也不一定會調度給此特定Node,設置容忍并不阻止調度器調度給其它Node,那么如何讓特定應用的Node
只能被調度到此特定的Node呢,這就要結合NodeAffinity節點親和性,給Node打個標簽,然后在Pod屬性里
設置NodeAffinity到Node。如此就能達到要求了。

4. effect的類型

  • NoSchedule:只有擁有和這個 taint 相匹配的 toleration 的 pod 才能夠被分配到這個節點。
  • PreferNoSchedule:系統會盡量避免將 pod 調度到存在其不能容忍 taint 的節點上,但這不是強制的。
  • NoExecute :任何不能忍受這個 taint 的 pod 都會馬上被驅逐,任何可以忍受這個 taint 的 pod 都不會被驅逐。Pod可指定屬性 tolerationSeconds 的值,表示pod 還能繼續在節點上運行的時間。
  • 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调度与隔离的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。