ACS クラスターは、ノードを仮想ノードとして表現し、アベイラビリティーゾーン、リージョン、GPU モデルなどのノード属性を Kubernetes ラベルとして公開します。Pod spec で nodeSelector または nodeAffinity を使用して、特定の属性を持つ仮想ノードに Pod をスケジュールできます。
前提条件
作業を開始する前に、以下を確認してください。
-
お使いのクラスターに対応する最小バージョン以上の kube-scheduler がインストールされていること。
ACS クラスターバージョン 最小 kube-scheduler バージョン 1.31 v1.31.0-aliyun-1.2.0 1.30 v1.30.3-aliyun-1.1.1 1.28 v1.28.9-aliyun-1.1.0 -
acs-virtual-node v2.12.0-acs.4 以降がインストールされていること。
kube-scheduler の新しいバージョンでは、[GPU-HPN ノードおよびスケジューラのカスタムラベルを有効化] オプションがデフォルトで有効になっています。手動での設定は必要ありません。詳細については、「kube-scheduler」をご参照ください。
スケジューリング方法の選択
| 方法 | 使用するケース |
|---|---|
nodeSelector |
特定のラベルを持つノードに Pod を固定します。最もシンプルな方法のため、まずはこちらの使用を検討してください。 |
nodeAffinity |
複数のラベル条件や演算子ベースのマッチング (In、NotIn、Exists) など、より表現力の高いスケジューリングルールを記述します。 |
利用可能なノードラベル
ACS 仮想ノードは、スケジューリング用に以下のラベルを公開します。
| ラベルキー | 説明 | 値の例 |
|---|---|---|
topology.kubernetes.io/zone |
アベイラビリティーゾーン | cn-hangzhou-j |
topology.kubernetes.io/region |
リージョン | cn-hangzhou |
kubernetes.io/hostname |
仮想ノード名 | virtual-kubelet-cn-hangzhou-j |
nodeSelector
nodeSelector は、ラベルによって Pod を仮想ノードにマッチングします。Pod spec にある nodeSelector の下にターゲットラベルを追加します。具体的な例については、「特定のゾーンへの Pod のスケジュール」をご参照ください。
nodeAffinity
nodeAffinity は、nodeSelector と同じラベルベースのマッチングをサポートしますが、より表現力豊かな構文を提供します。次の 2 つのモードがあります。
| モード | 動作 |
|---|---|
requiredDuringSchedulingIgnoredDuringExecution (ハードアフィニティ) |
スケジューラーは、ルールを満たすノードにのみ Pod を配置します。一致するノードが存在しない場合、Pod はスケジュールされません。 |
preferredDuringSchedulingIgnoredDuringExecution (ソフトアフィニティ) |
スケジューラーは一致するノードを検索しようとします。一致するノードが見つからない場合でも、Pod は適格な任意のノードにスケジュールされます。 |
同じ Pod に nodeSelector と nodeAffinity の両方を指定した場合、Pod がスケジュールされるには両方の条件を満たす必要があります。nodeSelectorTerms 内では、複数のタームが OR ロジックで評価されます。つまり、いずれか 1 つのタームが一致すれば Pod がスケジュールされます。1 つのターム内では、複数の matchExpressions エントリが AND ロジックで評価されます。つまり、すべての式が一致する必要があります。
GPU-HPN Pod の制約
以下の 3 つの条件がすべて 満たされる場合、次の制約が適用されます。
-
Pod が GPU-HPN (High-Performance Network GPU) コンピューティングタイプを使用していること。
-
Pod の
schedulerNameがdefault-schedulerであること。 -
スケジューラコンポーネントの設定で、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] が選択されていません。
| フィールド | 制約 |
|---|---|
requiredDuringSchedulingIgnoredDuringExecution |
nodeSelectorTerms の matchExpressions には、サポートされているアフィニティラベルのみを指定できます。matchFields は指定できません。 |
preferredDuringSchedulingIgnoredDuringExecution |
サポートされていません。 |
汎用、コンピューティング最適化、および GPU インスタンスタイプの場合、nodeAffinity にこのような制約はありません。
特定のゾーンへの Pod のスケジュール
この例では、nodeSelector を使用して、Deployment を cn-hangzhou-j ゾーンにスケジュールします。
-
クラスター内の仮想ノードを一覧表示します。
kubectl get node想定される出力:
NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-hangzhou-i Ready agent 5h42m v1.28.3-xx virtual-kubelet-cn-hangzhou-j Ready agent 5h42m v1.28.3-xx -
dep-node-selector-demo.yamlという名前のファイルを作成し、以下の内容を記述します。apiVersion: apps/v1 kind: Deployment metadata: name: dep-node-selector-demo labels: app: node-selector-demo spec: replicas: 4 selector: matchLabels: app: node-selector-demo template: metadata: labels: app: node-selector-demo spec: containers: - name: node-selector-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" # cn-hangzhou-j ゾーンに Pod を固定します nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-j -
マニフェストを適用します。
kubectl apply -f dep-node-selector-demo.yaml -
すべての Pod が
cn-hangzhou-jゾーンにスケジュールされていることを確認します。kubectl get pod -o wide想定される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-node-selector-demo-b4578576b-cgpfq 1/1 Running 0 112s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-fs8kl 1/1 Running 0 110s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-nh8zm 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none> dep-node-selector-demo-b4578576b-rpp8l 1/1 Running 0 2m8s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-j <none> <none>4 つの Pod すべてが
virtual-kubelet-cn-hangzhou-jで実行されており、ゾーンレベルのスケジューリングが期待どおりに機能していることが確認できます。