Alibaba Cloud Container Service for Kubernetes (ACK) クラスタ内のすべてのノードは仮想ノードです。ラベルは、ゾーン、リージョン、仮想ノードのGPUモデルなど、ノードのさまざまな属性をマークするために使用されます。ACKクラスタでは、Kubernetesネイティブのスケジューリングセマンティクスを使用して、ノードアフィニティスケジューリングを実装できます。 podAffinityまたはpodAntiAffinityフィールドでノード属性を設定することにより、特定の属性を持つノードにPodをスケジュールできます。このトピックでは、ACKのノードアフィニティスケジューリングについて説明します。
前提条件
ACKクラスタが作成されていること。詳細については、ACKクラスタの作成を参照してください。
kube-schedulerがインストールされていること。詳細については、kube-schedulerを参照してください。
acs-virtual-node v2.12.0-acs.4以降がインストールされていること。
注意事項
nodeSelector
フィールドを使用してノードにラベルを追加することにより、ノードアフィニティスケジューリングを実装できます。次の表に、さまざまなタイプのノードでACKがサポートするラベルを示します。
ノードタイプ | ラベル | 説明 | 例 |
通常ノード | topology.kubernetes.io/zone | ネットワークゾーン | topology.kubernetes.io/zone: cn-shanghai-b |
また、nodeAffinity
を使用して、ノードのアフィニティ属性を指定することもできます。ただし、nodeAffinityはより表現力豊かです。異なるコンピューティングクラスに対して、ACKは特定のフィールドに制約を提供します。次の表に、制約を示します。
コンピューティングクラス | フィールド | 説明 | 制約 |
| requiredDuringSchedulingIgnoredDuringExecution | ルールが満たされている場合にのみ、Podをスケジュールできます。このフィールドは、 | nodeSelectorTermsフィールドの場合:
|
preferredDuringSchedulingIgnoredDuringExecution | このフィールドは、重み付けに基づいてノードアフィニティを指定するために使用されます。スケジューラーは、ルールを満たすノードを見つけようとします。ただし、一致するノードが利用できない場合でも、スケジューラーはPodをスケジュールします。 | サポートされていません。 |
上記のnodeAffinity
フィールドの制約は、汎用およびパフォーマンス強化コンピューティングクラスのPodでは使用できません。
例
次の例は、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-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に設定します。 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
ゾーンに分散されていることを示しています。