Kubernetes關於Affinity和nodeSelector以及Taints與容忍的理解

   

    大多數情況下kubernetes的調度程序能將pod調度到集羣中合適的節點上。但有些情況下用戶需要對pod調度到那個節點上施加更多控制,比如將pod部署到擁有SSD存儲節點、將同一個服務的多個後端部署在不同的機架上提高安全性、將通信頻繁的服務部署在同一個可用區域降低通信鏈路長度。用戶對pod部署的節點施加控制都與"label selector"有關。

 nodeSelector(節點選擇器)

nodeSelector也是標籤選擇器,是最簡單、最直接控制pod部署node的方法,在daemonset用nodeSelector過濾可部署節點,以下是其普通的應用示例。


步驟1:爲節點添加標籤

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

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

爲節點添加node標籤node01,或者是disk類型爲ssd


  nodeSelector只能基於節點標籤控制pod部署node,並且選擇器只支持“與”邏輯操作。親和與反親和特性目前處於測試階段,相比於節點選擇器,其更靈活,功能更強大,體現在以下三點:

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

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

3、除了節點標籤,親和與反親和支持根據節點上已經部署的pod進行節點選擇,這一點很重要。比如不想將兩種計算密集類型的pod部署在同一節點上,後部署pod可選擇過濾。

細分成兩種類型的選擇器:"節點親和"與"內部pod親和、反親和"。

節點親和與nodeSelector相似,具備上述1、2兩條優點。  內部pod親和依賴的是節點上已有pod的標籤而不是節點標籤,兼俱上述三個優點。因爲節點親和能完成nodeSelector所工作並且具備額外的優點,因此nodeSelector雖然還能用,但已經不再維護,並且將來可能刪除。

       

      NodeAffinity節點親和性,是Pod上定義的一種屬性,使Pod能夠按我們的要求調度到某個Node上,而Taints則恰恰相反,它可以讓Node拒絕運行Pod,甚至驅逐Pod。

 Taints(污點)是Node的一個屬性,設置了Taints(污點)後,因爲有了污點,所以Kubernetes是不會將Pod調度到這個Node上的, 於是Kubernetes就給Pod設置了個屬性Tolerations(容忍),只要Pod能夠容忍Node上的污點,那麼Kubernetes就會忽略Node上的污點,就能夠(不是必須)把Pod調度過去。因此 Taints(污點)通常與Tolerations(容忍)配合使用。

設置污點:

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

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

       NoSchedule :一定不能被調度。

       PreferNoSchedule:儘量不要調度。

       NoExecute:不僅不會調度,還會驅逐Node上已有的Pod。

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


 比如設置污點:

     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-


 通過對Taints和Tolerations的瞭解,可以知道,通過它們可以讓某些特定應用,獨佔一個Node:

給特定的Node設置一個Taint,只讓某些特定的應用來容忍這些污點,容忍後就有可能會被調度到此特定Node,

但是也不一定會調度給此特定Node,設置容忍並不阻止調度器調度給其它Node,那麼如何讓特定應用的Node

只能被調度到此特定的Node呢,這就要結合NodeAffinity節點親和性(也可以使用nodeSelector去給node達標籤的方式),然後在Pod屬性裏

設置NodeAffinity到Node。如此就能達到要求了。


 總結:讓特定的服務跑到專屬的node節點上,通過給node節點打上taints,確定不調度,然後給pod設置容忍,這樣其他pod不會調度到此節點,在通過node

Selector或者NodeAffinity的方式讓改pod指定調度到此節點即可


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章