特定の構成を持つノードに特定のアプリケーションをスケジューリングするには、ノードプールに ラベル を追加し、アプリケーションの Pod 仕様 (spec) で対応する nodeSelector または nodeAffinity を設定します。
仕組み
特定のノードプールへの Pod のスケジューリングは、Kubernetes ネイティブのスケジューリングメカニズムを利用します。Pod のスケジューリングルールをプール内のノードの ラベル と照合することで、配置を制御できます。ワークフローは次のとおりです。
ノードプールにラベルを付与: ノードプールは、同一の構成を持つノードのグループを管理します。ノードプールに [ノードラベル] を設定すると、Container Service for Kubernetes (ACK) はこれらのラベルをそのプール内の現在および将来のすべてのノードに自動的に伝播します。
ラベルが既存のノードに適用されるようにするには、ノードプールの設定で [既存のノードのラベルと Taint を更新]
Pod のスケジューリングルールの定義: Pod の YAML マニフェストで、
nodeSelectorまたはnodeAffinityを使用してターゲットノードのラベルを指定します。(オプション) 排他的アクセスの設定: 特定のワークロード専用にノードプールを予約するには、ノードプールに Taint を追加します。これにより、対応する Toleration を持たない Pod がそのプール内のノードにスケジューリングされるのを防ぎます。
自動スケジューリング: スケジューラは、定義されたすべてのルールを満たすノードに Pod を自動的に配置します。
ステップ 1: ノードプールのラベル設定
スケジューリングのために、ビジネス属性、環境、その他のメタデータを識別できるよう、ノードプールにカスタムラベルを追加します。
ACK は、各ノードプールに対してグローバルに一意のラベル alibabacloud.com/nodepool-id を自動的に作成します。このラベルを使用して、ノードプールを正確に照合できます。ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
ターゲットノードプールを見つけ、[アクション] 列の [編集] をクリックします。[詳細オプション (オプション)] セクションを展開し、[ノードラベル] を構成します。
キー:
prefix/nameの形式である必要があります。Name(必須): 長さは 1~63 文字で、英数字 ([a-z0-9A-Z]) で開始および終了する必要があります。ハイフン (-)、アンダースコア (_)、ドット (.)、および英数字を含めることができます。Prefix(オプション): DNS サブドメイン である必要があります。これはドット (.) で区切られた一連の DNS ラベルです。プレフィックスの全長は 253 文字を超えてはならず、スラッシュ (/) で終わる必要があります。説明kubernetes.io/プレフィックスは Kubernetes のコアコンポーネント用に予約されています。この名前空間を使用する場合、ラベルキーは 必ず 次のいずれかで始まる必要があります:kubelet.kubernetes.io/またはnode.kubernetes.io/。
値 (オプション): 長さは 1~63 文字にすることができ、英数字 (
[a-z0-9A-Z]) で開始および終了する必要があります。ハイフン (-)、アンダースコア (_)、ドット (.)、および英数字を含めることができます。
(オプション) 必要に応じて [既存のノードのラベルと Taint を更新] を選択します。
変更を保存します。[ノード] ページに移動して、ラベルが適用されていることを確認します。次に、[ラベルと Taint の管理] をクリックし、各ノードのラベルを確認します。
ステップ 2: アプリケーションのスケジューリングポリシー設定
ノードプールにラベルを付けたら、nodeSelector または nodeAffinity のいずれかを使用して、アプリケーションの Deployment YAML でターゲットを指定できます。
nodeSelector: 1 つ以上のラベルについて完全一致を要求する、シンプルで直接的なノード選択方法を提供します。nodeAffinity: 以下を含む、より表現力豊かで柔軟なスケジューリングルールを提供します。In、NotIn、Existsなどのオペレーター。ハードアフィニティ (
requiredDuringSchedulingIgnoredDuringExecution): Pod は、条件を満たすノードにスケジューリングされる 必要があります。一致するノードが利用できない場合、Pod は Pending 状態のままになります。ソフトアフィニティ (
preferredDuringSchedulingIgnoredDuringExecution): スケジューラーは、条件を満たすノードへの Pod の配置を 優先します が、一致するノードが利用できない場合は、他のノードにスケジューリングします。
Deployment の例
deployment.yamlという名前のファイルを作成します。以下の例は、pod: nginxというラベルを持つノードに Nginx Deployment をスケジューリングする方法を示しています。nodeAffinityapiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-affinity labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: affinity: nodeAffinity: # ハード要件: Pod は条件を満たすノードにスケジューリングされる必要があります。 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: pod # ノードラベルのキー operator: In values: - nginx # ノードラベルの値 containers: - name: nginx-with-affinity image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 本番環境では、サービスの品質 (QoS) を保証するために、コンテナーのリソース要件を宣言します。 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"nodeSelectorapiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: pod: nginx # Pod がこの特定のラベルを持つノードにのみスケジューリングされるようにします。 containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 本番環境では、サービスの品質 (QoS) を保証するために、コンテナーのリソース要件を宣言します。 resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "200m" memory: "256Mi"アプリケーションをデプロイします。
kubectl apply -f deployment.yamlPod が正しいノードにスケジューリングされていることを確認します。
コマンドに
-o wideフラグを追加して、各 Pod がスケジューリングされている特定のノードを表示します。kubectl get pods -l app=nginx -o wide出力を確認して、Podがターゲットノードプールのノードで実行されていることを確認します。
関連ドキュメント
ノードプールを介したラベル管理に加えて、よりきめ細かいスケジューリング制御のために、「ノードラベルの管理」によって個々のノードにラベルを設定することもできます。
Pod が長時間
Pending状態のままになるなどの問題が発生した場合は、「Pod のトラブルシューティング」をご参照ください。ACK は、優先度ベースのインスタンススケーリング (異なるインスタンスタイプのスケールアップ/ダウンの順序を定義) や、リアルタイムのノードリソース使用率に基づく 負荷感知スケジューリング など、さまざまな高度なスケジューリングポリシーを提供します。詳細については、「ACK が提供するスケジューリングポリシー」をご参照ください。
スケジューリングにハードアフィニティを使用し、クラスター内に要件を満たすノードがない場合、ACK は、必要なラベルを持つ 自動スケーリング が有効なノードプールから新しいノードを自動的にプロビジョニングします。
ノードプール機能が導入される前に作成されたクラスターには、管理対象外のワーカーノード (遊離ノード) が含まれている場合があります。一貫した管理を確保するために、これらのノードをノードプールに移行する ことを推奨します。