Kubernetes taint & toleration


一、概説
前の記事では、podのプロパティを記述し、このpodがどのようなnodesにスケジューリングするかを宣言するKubernetes親和性スケジューリングについて説明しました.本明細書で説明するTaint( )は、podのスケジューリングをnodeがアクティブに排斥できるようにするnodeの属性である.対応するk 8 sはまたpodに関連属性toleration( )を追加し、これらのpodが対応するtaintsを有するnodesにスケジューリングされることができる(強制的に要求されない)ことを示す.この2つは、podを不適切なnodesにスケジューリングしないことを確保するためによく組み合わせられます.
taint&toleration構造体を見て、以下の足点紹介では関連フィールドに関連します.
type Taint struct {
    Key string
    Value string
    Effect TaintEffect
    // add taint     
    //    Effect = NoExecute,       nodeController   
    TimeAdded *metav1.Time
}

type Toleration struct {
    Key string
    Operator TolerationOperator
    Value string
    Effect TaintEffect
    //     
    TolerationSeconds *int64
}

type TaintEffect string

const (
    TaintEffectNoSchedule TaintEffect = "NoSchedule"
    TaintEffectPreferNoSchedule TaintEffect = "PreferNoSchedule"
    TaintEffectNoExecute TaintEffect = "NoExecute"
)

type TolerationOperator string

const (
    TolerationOpExists TolerationOperator = "Exists"
    TolerationOpEqual  TolerationOperator = "Equal"
)

二、Point
nodeに複数のtaintsを設定することもできますが、podで同じ数のtolerationsを構成することもできます.スケジュールと実行に影響する具体的な動作は、次のように分類できます.
  • 少なくとも1つのeffect == NoScheduleのtaintがpod tolerationされていない場合、podはノードにスケジューリングされない.
  • すべてのeffect == NoScheduleのtaintsがpod tolerationされているが、少なくとも1つのeffect == PreferNoScheduleがpod tolerationされていない場合、k 8 sはpodをノードにスケジューリングしないように努力する.
  • 少なくとも1つのeffect == NoExecuteのtaintがpod tolerationされていない場合、このpodはノードにスケジューリングされないだけでなく、このノード上で動作しているが汚点を許容するpodsも設定されていない場合、駆逐される.

  • 三、Toleration
    PodSpec構成Tolerationsを参照してください.key、value、effectはNode Pointの設定と一致する必要があります.operatorは2種類をサポートしています.
  • Exists:この構成ではvalueを指定する必要はありません.
  • Equal:value値を設定する必要があります.(operatorのデフォルト)
  • いくつかの特殊な状況があります.
  • keyは空でoperatorはExistsに等しく、すべてのkeys、values、effectsが一致していることを示します.言い換えればすべてのtaintsを容認した.
  • tolerations:
    - operator: "Exists"
  • effectが空の場合は、すべてのeffects(NoSchedule、PreferNoSchedule、NoExecute)
  • に一致することを示す.
    tolerations:
    - key: "key"
      operator: "Exists"

    もう1つのTolerationSecondsは、effectがNoExecuteと組み合わせて使用されます.nodeにeffect=NoExecuteのtaintが追加された後、そのtaintを許容できるpodsがnodeに滞在できる時間を指定します.例:
    tolerations: 
    - key: "key1"
      operator: "Equal"
      value: "value1"
      effect: "NoExecute"
      tolerationSeconds: 3600

    このpodがnode上で実行され、nodeが対応するtaintを追加した場合、このpodはnode上に3600秒滞在してから追放されることを示す.しかしtaintがこの時間までに除去されれば、このpodも追放されない.
    イメージを比較する図を説明します.
    図参照:Taints and tolerations,pod and node affinities demystified・Banzai Cloud
    四、内蔵行為
    kubernetes 1.6バージョンでは、node controllerがシステムの状況にフォローしてnode taintプロパティを自動的に設定します.内蔵taint keyは次のとおりです.
  • node.kubernetes.io/not-ready:ノードはまだ準備ができていません
  • node.kubernetes.io/unreachable:ノードは
  • にアクセスできません.
  • node.kubernetes.io/unschedulable:ノードスケジューリング不可
  • node.kubernetes.io/out-of-disk:ノードディスクが
  • 未満
  • node.kubernetes.io/memory-pressure:ノードにメモリ圧力がある
  • node.kubernetes.io/disk-pressure:ノードにディスク圧力
  • がある
  • node.kubernetes.io/network-unavailable:ノードネットワークは使用できません
  • node.kubernetes.io/pid-pressure:ノードにpid圧力
  • がある
  • node.cloudprovider.kubernetes.io/uninitialized:クラウドノード未初期化
  • node.cloudprovider.kubernetes.io/shutdown:クラウドノードがダウンラインした
  • kubernetesは、作成したpodに2つのデフォルトのtoleration:DefaultTolerationSeconds admission controllernode.kubernetes.io/not-readyを追加し、node.kubernetes.io/unreachableを設定します.もちろんこのデフォルト構成では、ユーザーは自分で上書きできます.これらの自動追加のデフォルト構成は、nodeに問題が発生した後、podがnodeに5分間滞在できることを確認します.
    D e f a ultTolerationSeconds admission controller設定のtolerationSeconds値は、ユーザーが指定することもできます.
    具体的な参考:https://github.com/kubernetes...
    もう一つのデフォルトの動作はDaemonSetです.DaemonSetが作成したpodには、tolerationSeconds = 300node.alpha.kubernetes.io/unreachableの2つのtolerationが追加されます.node.alpha.kubernetes.io/notReadyが設定され、effect = NoExecuteは指定されません.nodeにunreachableまたはnotReadyの問題が発生した場合、DaemonSet Podsは永遠に追放されないことを確保することを目的としています.
  • tolerationSeconds
  • ノードのセットを特定のユーザ専用にする場合は、taints: を設定し、podsに対応するtolerationsを設定できます.
  • ノードが専用であり、サービスがこのノードのみを使用することを保証する場合は、このノードにlabels(kubectl taint nodes nodename dedicated=groupName:NoSchedule)を設定し、対応するpodsにNodeAffinityを設定して、podsがこのノードにしか移動できないことを制御する必要があります.

  • dedicated=groupName
  • には、GPU、FPGAなどの特殊なハードウェアを有する一部のノードがあり、専用のハードウェアを必要としないpodsがこれらのノードにスケジューリングされないことを確保する.taints: または は、kubectl taint nodes nodename special=true:NoScheduleと同様に設定することもできる.コンテナのtoleration
  • を手動で追加することなく、Extended ResourcesとExtendedResourceToleration admission controllerを使用することで、特殊なハードウェアに依存するpodsのスケジューリングを容易にすることもできます.
  • kubectl taint nodes nodename special=true:PreferNoSchedule
  • についても前述したように、 taint によってノード上で実行されているpodsを駆逐することができる.


  • 五、参考資料
  • community/taint-toleration-dedicated.md at master · kubernetes/community · GitHub
  • community/taint-node-by-condition.md at master · kubernetes/community · GitHub
  • Taints and Tolerations
  • Taints and tolerations, pod and node affinities demystified · Banzai Cloud