溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kubernetes關(guān)于Affinity和nodeSelector以及Taints與容忍的理解

發(fā)布時(shí)間:2020-07-23 07:30:21 來源:網(wǎng)絡(luò) 閱讀:1634 作者:大鳥地帶 欄目:云計(jì)算

   

    大多數(shù)情況下kubernetes的調(diào)度程序能將pod調(diào)度到集群中合適的節(jié)點(diǎn)上。但有些情況下用戶需要對pod調(diào)度到那個(gè)節(jié)點(diǎn)上施加更多控制,比如將pod部署到擁有SSD存儲節(jié)點(diǎn)、將同一個(gè)服務(wù)的多個(gè)后端部署在不同的機(jī)架上提高安全性、將通信頻繁的服務(wù)部署在同一個(gè)可用區(qū)域降低通信鏈路長度。用戶對pod部署的節(jié)點(diǎn)施加控制都與"label selector"有關(guān)。

 nodeSelector(節(jié)點(diǎn)選擇器)

nodeSelector也是標(biāo)簽選擇器,是最簡單、最直接控制pod部署node的方法,在daemonset用nodeSelector過濾可部署節(jié)點(diǎn),以下是其普通的應(yīng)用示例。


步驟1:為節(jié)點(diǎn)添加標(biāo)簽

kubectl get nodes -o wide 獲取所有node信息

1、kubectl label nodes daily-k8s-n01 node=node01  2、kubectl label nodes daily-k8s-n01 disktype=ssd

為節(jié)點(diǎn)添加node標(biāo)簽node01,或者是disk類型為ssd


  nodeSelector只能基于節(jié)點(diǎn)標(biāo)簽控制pod部署node,并且選擇器只支持“與”邏輯操作。親和與反親和特性目前處于測試階段,相比于節(jié)點(diǎn)選擇器,其更靈活,功能更強(qiáng)大,體現(xiàn)在以下三點(diǎn):

1、不僅僅是“與”,支持更多的邏輯表達(dá)式。

2、nodeSelector是硬性要求,親和與反親和支持軟硬兩種要求。

3、除了節(jié)點(diǎn)標(biāo)簽,親和與反親和支持根據(jù)節(jié)點(diǎn)上已經(jīng)部署的pod進(jìn)行節(jié)點(diǎn)選擇,這一點(diǎn)很重要。比如不想將兩種計(jì)算密集類型的pod部署在同一節(jié)點(diǎn)上,后部署pod可選擇過濾。

細(xì)分成兩種類型的選擇器:"節(jié)點(diǎn)親和"與"內(nèi)部pod親和、反親和"。

節(jié)點(diǎn)親和與nodeSelector相似,具備上述1、2兩條優(yōu)點(diǎn)。  內(nèi)部pod親和依賴的是節(jié)點(diǎn)上已有pod的標(biāo)簽而不是節(jié)點(diǎn)標(biāo)簽,兼俱上述三個(gè)優(yōu)點(diǎn)。因?yàn)楣?jié)點(diǎn)親和能完成nodeSelector所工作并且具備額外的優(yōu)點(diǎn),因此nodeSelector雖然還能用,但已經(jīng)不再維護(hù),并且將來可能刪除。

       

      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(容忍)配合使用。

設(shè)置污點(diǎn):

      kubectl taint node [node] key=value[effect]   

      其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]

       NoSchedule :一定不能被調(diào)度。

       PreferNoSchedule:盡量不要調(diào)度。

       NoExecute:不僅不會調(diào)度,還會驅(qū)逐Node上已有的Pod。

       示例:kubectl taint node 10.10.0.111 node=111:NoSchedule


 比如設(shè)置污點(diǎn):

     kubectl taint node 10.10.0.111 node=111:NoSchedule

     kubectl taint node 10.10.0.111 node=111:NoExecute

 去除指定key及其effect:

     kubectl taint nodes node_name key:[effect]-    #(這里的key不用指定value)              

 去除指定key所有的effect: 

     kubectl taint nodes node_name key- 

 示例:

     kubectl taint node 10.10.0.111 node:NoSchedule-

     kubectl taint node 10.10.0.111 node:NoExecute-

     kubectl taint node 10.10.0.111 node-



對于 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

          tolerations:    
            - key: "node-role.kubernetes.io/master"        
              operator: "Exists"        
              effect: "NoSchedule"
              
              
        或者:
    spec:
      tolerations: #設(shè)置容忍性
      - key: "test" 
       operator: "Equal"  #如果操作符為Exists,那么value屬性可省略,如果不指定operator,則默認(rèn)為Equal
       value: "16"
       effect: "NoSchedule"
      #意思是這個(gè)Pod要容忍的有污點(diǎn)的Node的key是test Equal 16,效果是NoSchedule,
      #tolerations屬性下各值必須使用引號,容忍的值都是設(shè)置Node的taints時(shí)給的值。
      containers:
       - name: pod-tains
       image: 10.3.1.15:5000/ubuntu:16.04


 通過對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)親和性(也可以使用nodeSelector去給node達(dá)標(biāo)簽的方式),然后在Pod屬性里

設(shè)置NodeAffinity到Node。如此就能達(dá)到要求了。


 總結(jié):讓特定的服務(wù)跑到專屬的node節(jié)點(diǎn)上,通過給node節(jié)點(diǎn)打上taints,確定不調(diào)度,然后給pod設(shè)置容忍,這樣其他pod不會調(diào)度到此節(jié)點(diǎn),在通過node

Selector或者NodeAffinity的方式讓改pod指定調(diào)度到此節(jié)點(diǎn)即可


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI