Alibaba Cloud Container Service for Kubernetes (ACK) クラスタ内のすべてのノードは仮想ノードです。 ラベルは、ゾーン、リージョン、仮想ノードの GPU モデルなど、ノードのさまざまな属性をマークするために使用されます。 ACK クラスタでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、ノードアフィニティスケジューリングを実装できます。 nodeSelector または nodeAffinity フィールドでノード属性を設定することにより、特定の属性を持つ仮想ノードにポッドをスケジュールできます。 このトピックでは、ACK のノードアフィニティスケジューリングについて説明します。
前提条件
kube-scheduler がインストールされており、そのバージョンが以下の要件を満たしていること。
ACK クラスタバージョン
スケジューラバージョン
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 以降であること。
使用上の注意
nodeSelector
nodeSelector フィールドを設定して仮想ノードにラベルを追加することにより、ノードアフィニティスケジューリングを実装できます。 次の表に、さまざまなタイプの仮想ノードで ACK がサポートするラベルを示します。
仮想ノードタイプ | ラベル | 説明 | 例 |
標準仮想ノード | topology.kubernetes.io/zone | ネットワークゾーン | topology.kubernetes.io/zone: cn-shanghai-b |
GPU-HPN 仮想ノード | topology.kubernetes.io/zone | ネットワークゾーン | topology.kubernetes.io/zone: cn-shanghai-b |
alibabacloud.com/hpn-zone | 高性能ネットワークゾーン | alibabacloud.com/hpn-zone: B1 | |
alibabacloud.com/gpu-model-series | GPU モデル | alibabacloud.com/gpu-model-series: <example-model> |
nodeAffinity
ノードアフィニティを使用して、ノードのアフィニティ属性を指定することもできます。 ただし、nodeAffinity の方が表現力豊かです。 さまざまなコンピューティングクラスに対して、ACK は特定のフィールドに制約を提供します。 次の表に、制約を示します。
コンピューティングクラス | フィールド | 説明 | 制約 |
| requiredDuringSchedulingIgnoredDuringExecution | ルールが満たされている場合にのみ、ポッドをスケジュールできます。 このフィールドは、 | nodeSelectorTerms フィールドの場合:
|
preferredDuringSchedulingIgnoredDuringExecution | このフィールドは、重み付けに基づいてノードアフィニティを指定するために使用されます。 スケジューラは、ルールを満たすノードを見つけようとします。 ただし、一致するノードが使用できない場合でも、スケジューラはポッドをスケジュールします。 | サポートされていません。 |
汎用およびパフォーマンス強化コンピューティングクラスのポッドでは、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 という名前のファイルを作成し、次の内容をファイルに追加します。
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次のコマンドを実行して、ポッドの分散結果を表示します。
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 つのポッドが
cn-hangzhou-jゾーンに分散されていることを示しています。