Dynamic Engineのtolerationルールの設定
Dynamic Engine Helmチャートでtolerationを使用し、taintが付与されたKubernetesノードにPodがスケジュールされるようにします。
Dynamic Engine v1.4.0 以降、Helmのvaluesファイルにtolerationルールを設定することで、どのtaintされたノードをPodのスケジューリング対象とするかを制御できるようになりました。すべてのPodに一律のルールを適用するか、インフラストラクチャサービスPodと、データ統合ジョブ、データサービスジョブ、ルートなどのカスタマーワークロードPodに対して個別のルールを設定します。
始める前に
- dynamic-engine-crdカスタムリソース定義は、oci://ghcr.io/talend/helm/dynamic-engine-crd Helmチャートを使用してインストールされている必要があります。インストールされていない場合は、次のコマンドを実行してインストールしてください。
- 使用するチャートのバージョンを見つけます。
- 次のHelmコマンドを実行します:
helm show chart oci://ghcr.io/talend/helm/dynamic-engine-crd --version <engine_version> - Talend Management Consoleから直接バージョンを見るか、自分のDynamic Engineバージョンに含まれているチャートバージョンのDynamic Engine変更ログをチェックしてください。
- Dynamic EngineバージョンエンドポイントへのAPIコールを使用します。
- 次のHelmコマンドを実行します:
- 次のコマンドを実行し、目的のバージョンのHelmチャートをインストールします。<helm_chart_version>を、お使いのDynamic Engineバージョンでサポートされているチャートのバージョンに置換します。
helm install dynamic-engine-crd oci://ghcr.io/talend/helm/dynamic-engine-crd --version <helm_chart_version>バージョンを指定しないと、利用可能な最新のdynamic-engine-crdチャートバージョンがインストールされます。
- 使用するチャートのバージョンを見つけます。
- Kubernetesノードには、許容する予定の値でtaintを設定する必要があります。
- Kubernetesのtaintとtolerationに関する基本的な知識が必要です。
このタスクについて
デフォルトでは、一致するtolerationルールを設定しない限り、Dynamic Engine Pod はtaintが付与されたノードにはスケジュールされません。ノードに設定されたtaintは、対応するtolerationを持たないPodが配置されるのをスケジューラによって配置されるのを防ぎます。すべてのPodが同じtaint付きノードプールを共有できる場合は、一律のグローバルルールを使用します。インフラストラクチャサービスのPodと顧客ワークロードのPodを異なるtaint付きノードにスケジュールする必要がある場合は、ワークロードごとに個別のルールを設定します。
手順
インフラストラクチャサービスPodと顧客ワークロードPodに対して個別のtolerationルールを設定するには、ステップ2および3の代わりに、ステップ4および5を実行してください。
タスクの結果
チャートを正常にデプロイした後:
- qlik-dynamic-engineネームスペース内のDynamic Engineサービスは、dedicated=dynamic-engine:NoScheduleのtaintが付与されたノードにスケジュールできます。
- qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_IDネームスペース内のDynamic Engine環境サービスは、dedicated=dynamic-engine:NoScheduleのtaintが付与されたノード上でスケジュールできます。
- 個別のtolerationルールを使用する場合、qlik-processing-env-$DYNAMIC_ENGINE_ENVIRONMENT_IDネームスペース内の顧客ワークロードPod (データ統合ジョブ、データサービスジョブ、ルートPod)は、dedicated=dynamic-engine-jobs-and-routes:NoScheduleのtaintが付与されたノードにスケジュールできます。
tolerationsを追加した後もPodが保留中ステータスのままとなる場合は、ノードのtaintsとPodのtolerationsとの間に不一致がないか確認してください。
一般的な状況には次のようなものがあります。
- ノードにはdedicated=dynamic-engine:NoScheduleというtaintが付与されていますが、Pod には dedicated(専用)キーに対するtolerationがありません。
- Podのtolerationに誤った値、オペレーター、エフェクトが設定されているため、taintと正確に一致しません。
- ノードがNoExecuteを使用しており、ポッドがNoScheduleのみを許容している場合、スケジューラーはPodを拒否または退避させる可能性があります。
次のコマンドを使用して、問題を調査:
-
スケジューリング失敗の詳細について、Podを検査:
kubectl describe pod <pod-name> -n <namespace>イベントおよびTolerationsセクションを確認してください。スケジューリングの失敗イベントは、許容されなかった特定のtaintを特定します。
-
スケジュール失敗イベントを時刻順に検索:
kubectl get events -n <namespace> --sort-by=.lastTimestamp対応するtolerationが存在しないtaintを参照しているFailedSchedulingメッセージを確認します。
-
ノードのtaintsとPodのtolerationsを比較:
kubectl describe node <node-name>Taintsセクションを確認します。taintのキー、値、オペレーター、エフェクトは、Podのtolerationと完全に一致している必要があります。
-
Podがどのノードに配置されたかを特定:
kubectl get pods -n <namespace> -o wideこのコマンドを使用してノードの割り当てを確認し、次にkubectl describe nodeでそのノードを詳しく調べます。