Dynamic EngineのアフィニティとnodeSelectorルールの設定
Dynamic Engine HelmチャートでnodeSelectorとアフィニティルールを使用することで、Kubernetesクラスター内の異なるノードグループ間でのPodのスケジューリングを制御できます。
Dynamic Engine v1.1.0以降では、セキュリティ、パフォーマンス、リソース最適化などの目的で、特定のノード上でサービスを分離するための特定のアフィニティルールを設定できます。たとえば、大規模なノードグループを確保して、集中的なポッド実行に使用できます。
Dynamic Engine v1.1.0は、Helm値ファイルにおいて、nodeSelector(シンプルなラベルベースの選択)とアフィニティルール(複雑なスケジューリングロジック)の両方をサポートしています。
始める前に
- 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クラスターは、適切なラベルが付与された複数のノードグループ(ノードプール)で構成されている必要があります。この構成の設定方法については、使用中のクラウドプロバイダーが提供する関連ドキュメントを参照してください。例: KubernetesとGKEを使用している場合は、クラスタとノードプールのラベルを作成して管理するを参照してください。
- Kubernetesのアフィニティルールに関する基本的な知識が必要です。
このタスクについて
デフォルトでは、Dynamic Engineポッドはクラスター内の利用可能なすべてのノードにスケジュールされます。ノードアフィニティとノードセレクタールールを使用することで、ポッドの配置を制御し、次のような特定の目標を達成できます。
- 永続的なサービスを小規模な専用ノードに分離する
- ジョブ、ルート、データサービスなどのワークロードを、特定のインスタンスタイプを備えた大規模なノードで実行する
- instanceType=large
- instanceType=medium
- qlik-dynamic-engine-tasks=true
手順
タスクの結果
デプロイが正常に完了すると、すべてのDynamic Engineと環境ポッドは、ユーザーが設定したアフィニティおよびnodeSelectorルールに従ってスケジュールされます。インフラストラクチャ向けの永続的なサービスは専用のノード上で実行され、顧客のワークロードはそれぞれのリソース要件に合わせて最適化されたノード上で実行されます。
ポッド(または複数のポッド)がノードにスケジュールできない場合は、次の手順に従って問題を診断し、解決してください。
- スケジューリングの失敗を特定します。
kubectl describe podコマンドを使用して、スケジューリングエラーに関する詳細情報を取得します。
kubectl describe pod <pod-name> -n <namespace>[イベント]セクションを探します。スケジューラが失敗した理由に関する手がかりが記載されています。一般的な原因には次のようなものがあります。
- ルールに一致するノードがない
- 利用可能なノードのCPUまたはメモリリソースが不足している
- ノードに設定されたテイントとトレランスの問題により、Podのスケジューリングが妨げられている
- ルールの検証:
ノードに、ルールで指定されている必要なラベルが付いていることを確認します。
kubectl get nodes --show-labelsノードに付けられたラベルと、値ファイルで指定されているラベルを比較します。
- リソース制約の検証:
スケジューリングの失敗の原因の多くは、リソース(CPU、メモリ)の不足です。ポッドのリソース要求と制限を確認します。
kubectl describe nodesクラスターにリソース要求を満たすのに十分なノードがない場合は、ノードを追加してクラスターをスケールアップしてください。
- 指定されたノード上のテイントおよびトレランスの仕様を確認します。
テイントは、ノードが特定のポッドをスケジュールすることを妨げる可能性があります。ノードにテイントが設定されていて、ポッドに対応するトレランスが設定されていない場合、ポッドはスケジュールされません。Kubernetesのテイントとトレランスに関する詳細については、「Taints and Tolerations」(テイントとトレランス)を参照してください。
Dynamic Engineは現在、Helmチャートにおけるテイントとトレランスをサポートしていません。ノードにテイントがある場合は、テイントを削除するか、Dynamic Engineデプロイメント用に別のノードグループを使用する必要があります。