OpenShift クラスタの運用において、Podのスケジューリングはシステムの可用性を高めるために非常に重要な役割を果たします。一般的には、Podが自動的にスケジュールされ、ノードの障害時にも別のノードに移動します。
今回のケースでは、通常時には予備ノードにPodをスケジューリングせず、ノードの障害が発生した場合にのみ、予備ノードが自動的に使用されるようにしたいという要件に応えるものです。
この記事では、通常時は予備ノードにスケジューリングされないようにし、障害時にのみ予備ノードにPodをスケジュールする設定方法を考えます。
1. 要件の確認
以下の要件を満たすように設定を行います:
- 通常の稼働時
- 予備ノード(例えば、
spare-worker
)にはPodはスケジューリングされません。 - project-1のPodは
worker-1
、worker-2
にスケジュールされます。 - project-2のPodは
worker-3
にスケジュールされます。
- 予備ノード(例えば、
- ノード障害時:
worker-1
、worker-2
、worker-3
のいずれかに障害が発生した場合にのみ、spare-worker
にPodがスケジュールされます。
2. 設定手順
2.1. プロジェクトごとにノードセレクターを設定
まず、各プロジェクトにノードセレクタを設定して、Podがどのノードにスケジュールされるかを決定します。これにより、特定のノードにのみPodをスケジュールすることができます。
- project-1:
$ oc annotate namespace project-1 openshift.io/node-selector='env=project-1'
- project-2:
$ oc annotate namespace project-2 openshift.io/node-selector='env=project-2'
2.2. ノードにラベルを設定
次に、各ノードにラベルを設定して、Podがどのノードにスケジュールされるかを指定します。
- 通常ノード(worker-1、worker-2、worker-3)にラベルを設定:
$ oc label node worker-1 env=project-1 $ oc label node worker-2 env=project-1 $ oc label node worker-3 env=project-2
- 予備ノード(spare-worker)にラベルを設定:
$ oc label node spare-worker env=project-1 $ oc label node spare-worker env=project-2
2.3. 予備ノードにTaint設定
予備ノード(spare-worker
)にはTaintを設定し、通常時はPodがスケジュールされないようにします。このTaint設定により、通常のノードに障害が発生した場合にのみ、予備ノードにPodがスケジュールされるようになります。
$ oc adm taint nodes spare-worker dedicated=failover:NoSchedule
これにより、spare-worker
には通常のPodはスケジュールされません。
2.4. PodにToleration設定を追加
次に、予備ノード(spare-worker
)にPodをスケジュールできるように、Toleration設定を追加します。これにより、Taintが適用された予備ノードに対してもPodがスケジュールされるようになります。
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: pod-group
operator: In
values:
- normal
- backup
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: pod-group
operator: In
values:
- normal
tolerations:
- key: "dedicated"
operator: "Equal"
value: "failover"
effect: "NoSchedule"
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 300
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 300
2.5. ノードの重みづけ(Affinity設定)
Podのスケジューリングにおいて、通常ノードと予備ノードに重みづけを行うことで、通常ノードを優先して使用することができます。
通常ノードに優先度を設定する:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: pod-group
operator: In
values:
- normal
- backup
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: pod-group
operator: In
values:
- normal
3. 障害時の動作
予備ノード(spare-worker
)には通常はTaint設定によりPodがスケジュールされませんが、ノードレベルの障害が発生した場合、通常ノードのPodが予備ノードにスケジュールされます。これにより、システムの高可用性が保たれます。
4. まとめ
OpenShiftでのPodスケジューリングにおいて、障害時のみ予備ノードにスケジューリングする方法を紹介しました。TaintとTolerationを活用し、通常ノードに障害が発生した場合にのみ予備ノードにPodが自動でスケジュールされるように設定することができます。これにより、システムの高可用性を実現し、ノード障害時でもサービスの中断を最小限に抑えることができます。
以上で、worker-1
, worker-2
, worker-3
, そして予備ノード spare-worker
を利用したPodのスケジューリング設定についての説明が完了です。この設定により、冗長性を持たせつつ、障害発生時にだけ予備ノードが活用するシステムを実現できます。
コメント