Kubernetes AffinityとnodeSelectorおよびTaintsと許容の理解について

4148 ワード


ほとんどの場合、kubernetesのスケジューラはpodをクラスタ内の適切なノードにスケジューリングすることができます.しかし、ユーザーは、SSDストレージノードを所有し、同じサービスの複数のバックエンドを異なるラックに配置してセキュリティを向上させ、通信が頻繁なサービスを同じ利用可能なドメインに配置して通信リンクの長さを低減するなど、podをそのノードにスケジューリングするためのより多くの制御を必要とする場合がある.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ラベルnode 01を追加するか、diskタイプがssdです.
NodeSelectorはノードラベル制御podに基づいてnodeを配置するしかなく、セレクタはAND論理操作のみをサポートします.親和性と反親和性は現在テスト段階にあり、ノードセレクタよりも柔軟で、機能がより強く、以下の3つの点に現れている.
1、「与」だけでなく、より多くの論理式をサポートする.
2、nodeSelectorは硬性の要求で、親和と反親和は軟硬の2種類の要求を支持する.
3、ノードラベルに加えて、親和性と反親和性はノードに配置されたpodに基づいてノード選択をサポートすることが重要である.たとえば、2つの計算が密集しているpodを同じノードに配置したくない場合は、podを配置してフィルタを選択します.
ノード親和性と内部pod親和性、逆親和性の2つのタイプのセレクタに細分化されます.
ノード親和性はnodeSelectorと類似しており,上記1,2の2つの利点を備えている.内部pod親和性は,ノードラベルではなくノード上にpodのラベルがあることに依存し,上述した3つの利点を兼ね備えている.ノード親和性はnodeSelectorが動作し、追加の利点を備えているため、nodeSelectorはまだ使用できますが、メンテナンスは行われず、将来削除される可能性があります.
       
NodeAffinityノードの親和性は、Podで定義された属性であり、Podが私たちの要求通りにノードにスケジューリングできるようにしますが、Taintsは正反対で、ノードがPodの実行を拒否したり、Podを駆逐したりすることができます.
Taints(汚点)はノードの1つの属性であり、Taints(汚点)を設定した後、汚点があるのでKubernetesはPodをこのノードにスケジューリングしないので、KubernetesはPodに属性Tolerations(許容)を設定し、Podがノードの汚点を許容できる限り、Kubernetesはノードの汚点を無視し、Podをスケジューリングすることができる.従ってTaints(汚点)は通常Tolerations(許容)と併用される.
汚点の設定:
      kubectl taint node [node] key=value[effect]   
ここで[effect]の値は、[NoSchedule|PreferNoSchedule|NoExecute]
NoSchedule:必ずスケジューリングできません.
PreferNoSchedule:できるだけスケジューリングしないでください.
NoExecute:スケジューリングができないだけでなく、ノードにあるPodを駆逐します.
例:kubectl taint node 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-
tolerationsプロパティの書き方については、key、value、effectがノードのPoint設定と一致する必要があります.また、以下の説明もあります.
  • operatorの値がExistsの場合、value属性は
  • を省略することができる.
  • operatorの値がEqualである場合、そのkeyとvalueの関係がequal(等しい)
  • であることを示す.
  • operatorプロパティを指定しない場合、デフォルト値はEqual
  • です.
    さらに、2つの特殊な値があります.
  • 空のkey Existsに合わせるとすべてのkeyとvalueが一致し、すべてのnodeを許容できるすべてのTaints
  • でもある.
  • 空のeffectは、すべてのeffect
  • に一致する.
          tolerations:    
            - key: "node-role.kubernetes.io/master"        
              operator: "Exists"        
              effect: "NoSchedule"
              
              
          :
    spec:
      tolerations: #     
      - key: "test" 
       operator: "Equal"  #      Exists,  value     ,     operator,    Equal
       value: "16"
       effect: "NoSchedule"
      #     Pod        Node key test Equal 16,   NoSchedule,
      #tolerations           ,        Node taints    。
      containers:
       - name: pod-tains
       image: 10.3.1.15:5000/ubuntu:16.04

    TaintsとTolerationsを理解することで、特定のアプリケーションにノードを独占させることができることがわかります.
    特定のノードにポイントを設定し、特定のアプリケーションだけでこれらの汚点を許容し、許容後にこの特定のノードにスケジューリングされる可能性があります.
    しかし、必ずしもこの特定のノードにスケジューリングされるとは限らない.スケジューラが他のノードにスケジューリングされるのを阻止しないことを許容するように設定すると、特定のアプリケーションのノードをどのようにスケジューリングするか
    この特定のノードにしかスケジューリングできないのは、ノードの親和性(nodeSelectorを使用してnodeにラベルを付ける方法もあります)と結びつけてPodプロパティに
    NodeAffinityをNodeに設定します.これで要求に達することができます.
    まとめ:特定のサービスを専属のnodeノードに走らせ、nodeノードにtaintsを打つことで、スケジューリングしないことを確定し、podに許容を設定します.これにより、他のpodはこのノードにスケジューリングされず、nodeを通過する
    SelectorまたはNodeAffinity方式でpod指定スケジューリングをこのノードに変更すればよい