Tolerations の操作
taints がどのように機能するかを理解したので、tainted ノードで Pod をスケジュールできるようにするメカニズムである tolerations を見てみましょう。
Tolerations の理解
Tolerations は Pod 仕様で指定され、一致する taints を持つノードで Pod をスケジュールできるようにします。Toleration は以下で構成されます。
key: taint key と一致します
operator: Equal(キーと値が一致)または Exists(キーのみが一致)のいずれか
value: 一致させる値(Equal operator を使用する場合)
effect: 一致させる effect、またはすべての effect に一致させる場合は空
tolerationSeconds: 一致する NoExecute taint を持つノードに Pod がとどまることができるオプションの期間
Tolerations を使用した Pod の作成
コントロールプレーン taint を許容する Pod を作成しましょう。まず、Pod の YAML ファイルを作成します。
nano ~/project/toleration-pod.yaml
次に、次の内容をファイルに追加します。
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
この Pod 仕様には、ノードのコントロールプレーン taint と一致する toleration が含まれています。ファイルを保存して終了します(nano では、Ctrl+O、Enter、Ctrl+X を押します)。
次に、Pod を作成しましょう。
kubectl apply -f ~/project/toleration-pod.yaml
次のような出力が表示されるはずです。
pod/toleration-pod created
Pod がノードにスケジュールされたかどうかを確認しましょう。
kubectl get pods -o wide
出力例:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
toleration-pod 1/1 Running 0 12s 10.244.0.5 minikube <none> <none>
Pod は、コントロールプレーン taint と一致する toleration を持っているため、minikube ノードで実行されています。
Tolerations を使用しない Pod でのテスト
比較のために、tolerations を使用しない Pod を作成しましょう。
nano ~/project/no-toleration-pod.yaml
次の内容を追加します。
apiVersion: v1
kind: Pod
metadata:
name: no-toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
ファイルを保存して終了し、Pod を作成します。
kubectl apply -f ~/project/no-toleration-pod.yaml
次に、Pod のステータスを確認しましょう。
kubectl get pods -o wide
Pod が Pending 状態のままであることに気付くかもしれません。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
no-toleration-pod 0/1 Pending 0 12s <none> <none> <none> <none>
toleration-pod 1/1 Running 0 2m 10.244.0.5 minikube <none> <none>
Pod が保留になっている理由を確認しましょう。
kubectl describe pod no-toleration-pod
events セクションには、次のようなものが表示されるはずです。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 45s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
これは、Pod がコントロールプレーン taint を許容しないため、スケジュールできなかったことを確認しています。
クリーンアップ
作成した Pod をクリーンアップしましょう。
kubectl delete pod toleration-pod no-toleration-pod
次のように表示されるはずです。
pod "toleration-pod" deleted
pod "no-toleration-pod" deleted
おめでとうございます!これで、taints と tolerations が連携して Kubernetes で Pod スケジューリングを制御する方法を理解できました。