4.6. ノード taint を使用した Pod 配置の制御
taint および toleration により、ノードはノード上でスケジュールする必要のある (またはスケジュールすべきでない) Pod を制御できます。
4.6.1. taint および toleration について リンクのコピーリンクがクリップボードにコピーされました!
taint により、ノードは Pod に一致する toleration がない場合に Pod のスケジュールを拒否することができます。
taint は Node 仕様 (NodeSpec) でノードに適用され、toleration は Pod 仕様 (PodSpec) で Pod に適用されます。taint をノードに適用する場合、スケジューラーは Pod が taint を容認しない限り、Pod をそのノードに配置できません。
ノード仕様の taint の例
apiVersion: v1
kind: Node
metadata:
name: my-node
#...
spec:
taints:
- effect: NoExecute
key: key1
value: value1
#...
Pod 仕様での toleration の例
apiVersion: v1
kind: Pod
metadata:
name: my-pod
#...
spec:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
#...
taint および toleration は、key、value、および effect で構成されます。
| パラメーター | 説明 | ||||||
|---|---|---|---|---|---|---|---|
|
|
| ||||||
|
|
| ||||||
|
| effect は以下のいずれかにすることができます。
| ||||||
|
|
|
NoScheduletaint をコントロールプレーンノードに追加すると、ノードには、デフォルトで追加されるnode-role.kubernetes.io/master=:NoScheduletaint が必要です。以下に例を示します。
apiVersion: v1 kind: Node metadata: annotations: machine.openshift.io/machine: openshift-machine-api/ci-ln-62s7gtb-f76d1-v8jxv-master-0 machineconfiguration.openshift.io/currentConfig: rendered-master-cdc1ab7da414629332cc4c3926e6e59c name: my-node #... spec: taints: - effect: NoSchedule key: node-role.kubernetes.io/master #...
toleration は taint と一致します。
operatorパラメーターがEqualに設定されている場合:-
keyパラメーターが同じである。 -
valueパラメーターが同じである。 -
effectパラメーターが同じである。
-
operatorパラメーターがExistsに設定されている場合:-
keyパラメーターが同じである。 -
effectパラメーターが同じである。
-
以下の taint は OpenShift Container Platform に組み込まれています。
-
node.kubernetes.io/not-ready: ノードは準備状態にありません。これはノード条件Ready=Falseに対応します。 -
node.kubernetes.io/unreachable: ノードはノードコントローラーから到達不能です。これはノード条件Ready=Unknownに対応します。 -
node.kubernetes.io/memory-pressure: ノードにはメモリー不足の問題が発生しています。これはノード条件MemoryPressure=Trueに対応します。 -
node.kubernetes.io/disk-pressure: ノードにはディスク不足の問題が発生しています。これはノード条件DiskPressure=Trueに対応します。 -
node.kubernetes.io/network-unavailable: ノードのネットワークは使用できません。 -
node.kubernetes.io/unschedulable: ノードはスケジュールが行えません。 -
node.cloudprovider.kubernetes.io/uninitialized: ノードコントローラーが外部のクラウドプロバイダーを使用して起動すると、この taint はノード上に設定され、使用不可能とマークされます。cloud-controller-manager のコントローラーがこのノードを初期化した後に、kubelet がこの taint を削除します。 node.kubernetes.io/pid-pressure: ノードが pid 不足の状態です。これはノード条件PIDPressure=Trueに対応します。重要OpenShift Container Platform では、デフォルトの pid.available
evictionHardは設定されません。
4.6.1.1. Pod の退避を遅延させる toleration (秒数) の使用方法 リンクのコピーリンクがクリップボードにコピーされました!
Pod 仕様または MachineSet に tolerationSeconds パラメーターを指定して、Pod が退避される前にノードにバインドされる期間を指定できます。effect が NoExecute の taint がノードに追加される場合、taint を許容する Pod に tolerationSeconds パラメーターがある場合、Pod は期限切れになるまで退避されません。
出力例
apiVersion: v1
kind: Pod
metadata:
name: my-pod
#...
spec:
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 3600
#...
ここで、この Pod が実行中であるものの、一致する容 toleration がない場合、Pod は 3,600 秒間バインドされたままとなり、その後に退避されます。taint が期限前に削除される場合、Pod は退避されません。
4.6.1.2. 複数の taint の使用方法 リンクのコピーリンクがクリップボードにコピーされました!
複数の taint を同じノードに、複数の toleration を同じ Pod に配置することができます。OpenShift Container Platform は複数の taint と toleration を以下のように処理します。
- Pod に一致する toleration のある taint を処理します。
残りの一致しないテイン taint は Pod について以下の effect を持ちます。
-
effect が
NoScheduleの一致しない taint が 1 つ以上ある場合、OpenShift Container Platform は Pod をノードにスケジュールできません。 -
effect が
NoScheduleの一致しない taint がなく、effect がPreferNoScheduleの一致しない taint が 1 つ以上ある場合、OpenShift Container Platform は Pod のノードへのスケジュールを試行しません。 effect が
NoExecuteの taint が 1 つ以上ある場合、OpenShift Container Platform は Pod をノードから退避するか (ノードですでに実行中の場合)、または Pod のそのノードへのスケジュールが実行されません (ノードでまだ実行されていない場合)。- taint を容認しない Pod はすぐに退避されます。
-
Podの仕様にtolerationSecondsを指定せずに taint を許容する Pod は永久にバインドされたままになります。 -
指定された
tolerationSecondsを持つテイン taint を許容する Pod は指定された期間バインドされます。
-
effect が
以下に例を示します。
以下の taint をノードに追加します。
$ oc adm taint nodes node1 key1=value1:NoSchedule$ oc adm taint nodes node1 key1=value1:NoExecute$ oc adm taint nodes node1 key2=value2:NoSchedulePod には以下の toleration があります。
apiVersion: v1 kind: Pod metadata: name: my-pod #... spec: tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" #...
この場合、3 つ目の taint に一致する toleration がないため、Pod はノードにスケジュールできません。Pod はこの taint の追加時にノードですでに実行されている場合は実行が継続されます。3 つ目の taint は 3 つの taint の中で Pod で容認されない唯一の taint であるためです。
4.6.1.3. Pod のスケジューリングとノードの状態 (Taint Nodes By Condition) について リンクのコピーリンクがクリップボードにコピーされました!
Taint Nodes By Condition (状態別のノードへの taint) 機能はデフォルトで有効にされており、これはメモリー不足やディスク不足などの状態を報告するノードを自動的に taint します。ノードが状態を報告すると、その状態が解消するまで taint が追加されます。taint に NoSchedule の effect がある場合、ノードが一致する toleration を持つまでそのノードに Pod をスケジュールすることはできません。
スケジューラーは、Pod をスケジュールする前に、ノードでこれらの taint の有無をチェックします。taint がある場合、Pod は別のノードにスケジュールされます。スケジューラーは実際のノードの状態ではなく taint をチェックするので、適切な Pod toleration を追加して、スケジューラーがこのようなノードの状態を無視するように設定します。
デーモンセットコントローラーは、以下の toleration をすべてのデーモンに自動的に追加し、下位互換性を確保します。
- node.kubernetes.io/memory-pressure
- node.kubernetes.io/disk-pressure
- node.kubernetes.io/unschedulable (1.10 以降)
- node.kubernetes.io/network-unavailable (ホストネットワークのみ)
デーモンセットには任意の toleration を追加することも可能です。
コントロールプレーンは、QoS クラスを持つ Pod に node.kubernetes.io/memory-pressure toleration も追加します。これは、Kubernetes が Guaranteed または Burstable QoS クラスで Pod を管理するためです。新しい BestEffort Pod は、影響を受けるノードにスケジュールされません。
4.6.1.4. Pod の状態別退避について (Taint-Based Eviction) リンクのコピーリンクがクリップボードにコピーされました!
Taint-Based Eviction 機能はデフォルトで有効にされており、これは not-ready および unreachable などの特定の状態にあるノードから Pod を退避します。ノードがこうした状態のいずれかになると、OpenShift Container Platform は taint をノードに自動的に追加して、Pod の退避および別のノードでの再スケジュールを開始します。
Taint Based Eviction には NoExecute の effect があり、その taint を許容しない Pod はすぐに退避され、これを許容する Pod は退避されません (Pod が tolerationSeconds パラメーターを使用しない場合に限ります)。
tolerationSeconds パラメーターを使用すると、ノード状態が設定されたノードに Pod がどの程度の期間バインドされるかを指定することができます。tolerationSeconds の期間後もこの状態が続くと、taint はノードに残り続け、一致する toleration を持つ Pod は退避されます。tolerationSeconds の期間前にこの状態が解消される場合、一致する toleration を持つ Pod は削除されません。
値なしで tolerationSeconds パラメーターを使用する場合、Pod は not ready(準備未完了) および unreachable(到達不能) のノードの状態が原因となり退避されることはありません。
OpenShift Container Platform は、レートが制限された方法で Pod を退避し、マスターがノードからパーティション化される場合などのシナリオで発生する大規模な Pod 退避を防ぎます。
デフォルトでは、特定のゾーン内の 55% を超えるノードが健全でない場合、ノードライフサイクルコントローラーが、そのゾーンの状態を PartialDisruption に変更し、Pod の退避率を低下させます。小規模なクラスター (デフォルトでは 50 ノード以下) がこの状態になると、このゾーンのノードは taint されず、退避が停止されます。
詳細は、Kubernetes ドキュメントの Rate limits on eviction を参照してください。
OpenShift Container Platform は、node.kubernetes.io/not-ready および node.kubernetes.io/unreachable の toleration を、Pod 設定がいずれかの toleration を指定しない限り、自動的に tolerationSeconds=300 に追加します。
apiVersion: v1
kind: Pod
metadata:
name: my-pod
#...
spec:
tolerations:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoExecute
tolerationSeconds: 300
- key: node.kubernetes.io/unreachable
operator: Exists
effect: NoExecute
tolerationSeconds: 300
#...
- 1
- これらの toleration は、ノード状態の問題のいずれかが検出された後、デフォルトの Pod 動作のバインドを 5 分間維持できるようにします。
これらの toleration は必要に応じて設定できます。たとえば、アプリケーションに多数のローカル状態がある場合、ネットワークのパーティション化などに伴い、Pod をより長い時間ノードにバインドさせる必要があるかもしれません。これにより、パーティションを回復させることができ、Pod の退避を回避できます。
デーモンセットによって起動する Pod は、tolerationSeconds が指定されない以下の taint の NoExecute toleration を使用して作成されます。
-
node.kubernetes.io/unreachable -
node.kubernetes.io/not-ready
その結果、デーモンセット Pod は、これらのノードの状態が原因で退避されることはありません。
4.6.1.5. すべての taint の許容 リンクのコピーリンクがクリップボードにコピーされました!
key と values のパラメーターを指定せずに operator: "Exists" toleration を追加することで、すべての taint を許容するように Pod を設定できます。この toleration のある Pod は taint を持つノードから削除されません。
すべての taint を容認するための Pod 仕様
apiVersion: v1
kind: Pod
metadata:
name: my-pod
#...
spec:
tolerations:
- operator: "Exists"
#...