ACS クラスターでは、ノードオブジェクトは仮想ノードとして表現されます。仮想ノードはラベルを使用して、ゾーン、リージョン、GPU モデルなどの属性を示します。ネイティブ Kubernetes スケジューリングセマンティクスを使用して、ACS クラスターでノードアフィニティスケジューリングを実装できます。nodeSelector または nodeAffinity フィールドでノード属性を指定して、これらの属性を持つ仮想ノードにアプリケーションをスケジュールします。このトピックでは、ACS におけるノードアフィニティスケジューリングについて説明します。
前提条件
kube-scheduler がインストールされており、そのバージョンが次の要件を満たしていること。
ACS クラスターバージョン
スケジューラコンポーネントバージョン
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 以降であること。
注意事項
新しいバージョンでは、ACS スケジューラの設定項目である「GPU-HPN ノードとスケジューラのカスタムラベルを有効にする」はデフォルトで有効になっています。お客様側での設定は不要です。詳細については、「kube-scheduler」をご参照ください。
nodeSelector
nodeSelector を使用して、仮想ノードに直接ラベルを指定し、ノードアフィニティスケジューリングを行います。
nodeAffinity
nodeAffinity を使用して、ノードアフィニティ属性を宣言します。nodeSelector よりも豊富な構文をサポートしています。ACS クラスターでは、以下のすべての条件を満たす Pod に対してノードアフィニティスケジューリングを使用する場合、次の制約が適用されます。
新しいバージョンでは、ACS スケジューラコンポーネントの 「GPU-HPN ノードのカスタムタグとスケジューラ」を有効にする 設定はデフォルトで有効になっています。詳細については、「kube-scheduler」をご参照ください。
Pod が高性能ネットワーク GPU (GPU-HPN) コンピューティングタイプを使用している。
Pod の
schedulerNameがdefault-schedulerである。スケジューラコンポーネントの設定で、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] が選択されていない。
プロトコルフィールド | 説明 | 制約 |
requiredDuringSchedulingIgnoredDuringExecution | ルールが満たされた場合にのみスケジューリングが実行されます。これは | nodeSelectorTerms フィールドにおいて:
|
preferredDuringSchedulingIgnoredDuringExecution | 重みによってノードアフィニティを指定します。スケジューラはルールに一致するノードを見つけようとします。一致するノードが見つからない場合でも、スケジューラは Pod をスケジュールします。 | サポートされていません。 |
汎用、コンピューティング最適化、および GPU インスタンスの場合、nodeAffinity にはそのような制約はありません。
例
この例では、nodeSelector を使用して、アプリケーションを特定のゾーンにスケジュールする方法を示します。
次のコマンドを実行して、クラスター内の仮想ノードをリスト表示します。
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-xxdep-node-selector-demo.yaml という名前のファイルを作成し、次の 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 に設定します nodeSelector: topology.kubernetes.io/zone: cn-hangzhou-j次のコマンドを実行して、アプリケーションをクラスターにデプロイします。
kubectl apply -f dep-node-selector-demo.yaml次のコマンドを実行して、Pod がどこにスケジュールされているかを確認します。
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 はすべて
cn-hangzhou-jゾーンで実行されます。