Container Service for Kubernetes (ACK) クラスターには、デフォルトスケジューラーが組み込まれています。Pod をクラスターに送信すると、デフォルトで default-scheduler という名前のスケジューラーがリソースを割り当てます。特別なリソースタイプや複雑なスケジューリングポリシーに対応するために、ACK クラスターではカスタムスケジューラーを使用できます。このトピックでは、ACK クラスターでカスタムスケジューラーを使用する方法とその制約について説明します。
前提条件
acs-virtual-node コンポーネントがインストールされており、そのバージョンが v2.12.0-acs.8 以降であること。
kube-scheduler コンポーネントがインストールされており、そのバージョンが次の要件を満たしていること。
ACK クラスターバージョン
必須の kube-scheduler バージョン
1.32 以降
すべてのバージョンがサポートされています。
1.31
v1.31.0-aliyun-1.1.2 以降。
1.30
v1.30.3-aliyun-1.1.2 以降。
1.28
v1.28.9-aliyun-1.1.2 以降。
kube-scheduler コンポーネントの Enable custom labels and schedulers for GPU-HPN nodes オプションは、最近のバージョンではデフォルトで有効になっています。詳細については、「kube-scheduler」をご参照ください。
説明カスタムスケジューラを使用する場合、Pod に
spec.schedulerNameを設定する必要があります。詳細については、「Pod のスケジューラを指定する」をご参照ください。
操作手順
手順1:カスタムスケジューラーのデプロイ
クラスターにカスタムスケジューラーをデプロイします。詳細については、「Kubernetes ドキュメント」をご参照ください。
手順2:ACK スケジューラー設定の変更
ACS コンソール にログインします。左側のナビゲーションペインで、クラスター をクリックします。
クラスター ページで、管理するクラスターを見つけ、その ID をクリックします。クラスター詳細ページの左側のナビゲーションペインで、操作 > アドオン を選択します。
[Add-ons] ページで、 [Kube Scheduler] カードを見つけ、 [Configuration] をクリックします。
ダイアログボックスで [Enable custom labels and schedulers for GPU-HPN nodes] を選択し、 [OK] をクリックします。
詳細については、「kube-scheduler」をご参照ください。
次の表に、このオプションが有効または無効になっている場合の Pod とノードへの影響の比較を示します。
説明この機能は、GPU-HPN の Pod とノードにのみ適用されます。カスタムスケジューラーは他のコンピュートタイプではサポートされていません。
デフォルトスケジューラー (無効)
カスタムスケジューラー (有効)
Pod スケジューラー名
カスタマイズはサポートされていません。Pod の送信後、
spec.schedulerNameフィールドは default-scheduler で上書きされます。Pod の
spec.schedulerNameを任意の値に設定でき、送信後にこの値が変更されることはありません。Pod のスケジューリングプロセス
デフォルトの ACK スケジューラーがすべての Pod のリソースを割り当てます。
デフォルトの ACK スケジューラーは、
spec.schedulerNameがdefault-schedulerの Pod のみをスケジューリングします。カスタムスケジューラーは、他のすべての Pod のリソース割り当てを担当します。GPU-HPN ノードのラベル、アノテーション、Taint に対する制約
ノードのラベル、アノテーション、Taint の追加、変更、削除には ACK の制約が適用されます。詳細については、「ノードのラベルと Taint の管理」をご参照ください。
ノードのラベル、アノテーション、Taint の追加、変更、削除に ACK の制約は適用されなくなります。
Pod アフィニティスケジューリングの制約
アフィニティフィールドの設定には ACK の制約が適用されます。詳細については、「ノードアフィニティスケジューリング」をご参照ください。
アフィニティフィールドの設定に ACK の制約は適用されなくなります。
手順3:Pod へのカスタムスケジューラーの割り当て
次の内容で
dep-with-koordinator.yamlという名前のファイルを作成します。このファイルは Deployment アプリケーションを定義するもので、Pod テンプレートで
koord-schedulerという名前のカスタムスケジューラーを指定します。apiVersion: apps/v1 kind: Deployment metadata: name: dep-with-koordinator labels: app: dep-with-koordinator spec: replicas: 1 selector: matchLabels: app: dep-with-koordinator template: metadata: labels: app: dep-with-koordinator # コンピュートクラスを gpu-hpn として指定します。カスタムスケジューラーは他のコンピュートタイプではサポートされていません。 alibabacloud.com/compute-class: gpu-hpn spec: containers: - name: demo image: registry.cn-hangzhou-finance.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" restartPolicy: Always # 手順1でデプロイしたカスタムスケジューラーの名前を指定します。 schedulerName: koord-schedulerPod を ACK クラスターに送信します。
kubectl apply -f dep-with-koordinator.yamlPod の設定で
schedulerNameを確認します。kubectl get pod -lapp=dep-with-koordinator -o custom-columns=NAME:.metadata.name,schedulerName:.spec.schedulerName予想される出力:
# Pod は koord-scheduler という名前のカスタムスケジューラーを指定します。 NAME schedulerName dep-with-koordinator-xxxxx-xxxxx koord-scheduler
よくある質問
PVC スケジューリングエラー:Insufficient attachable-volumes-xxx
この問題は、デフォルトの Kubernetes スケジューラーでは発生しません。これは、一部のカスタムスケジューラーが PersistentVolumeClaim (PVC) リソースを処理する際に、ノードの Container Storage Interface (CSI) Node オブジェクトが存在するか、対応する CSI ドライバーの容量情報が報告されていることを必要とするためです。ノードがこれらの条件を満たさない場合、スケジューラーはリソースが不足していると誤って判断することがあります。
これを解決するには、特定の CSI ドライバーを無視するようにスケジューラーを設定します。たとえば、Volcano スケジューラーを使用する場合、起動パラメーター --ignored-provisioners=${csi-driver-name} を追加できます。
# 複数のドライバーをコンマで区切って指定できます。
--ignored-provisioners=povplugin.csi.alibabacloud.com使用している CSI ドライバーに基づいてパラメーターを調整してください。
リソース不足エラー:resource in cluster is overused または queue resource quota insufficient
この問題は、デフォルトの Kubernetes スケジューラーでは発生しません。一部のカスタムスケジューラーは、ephemeral-storage などの CPU やメモリ以外のリソースの容量値をミリ単位に変換するためです。仮想ノードはデフォルトで非常に大きな容量を報告するため、この変換によって 64 ビットの整数オーバーフローが発生する可能性があります。これにより、スケジューラーがノードまたはクラスターの残存容量を負の値として誤って計算し、リソース不足エラーがトリガーされます。この問題を解決するには、テクニカルサポートにチケットを起票してください。