特定の構成を持つノードにアプリケーションをスケジュールするには、ノードプールにラベルを設定し、アプリケーションに対応する nodeSelector または nodeAffinity を構成します。
仕組み
特定のノードプールへの Pod のスケジューリングでは、ネイティブの Kubernetes スケジューリングメカニズムが使用されます。このメカニズムは、ノードの ラベル を使用して、Pod をノードプール内のノードと照合します。プロセスは次のとおりです。
-
ノードプールにラベルを設定します。ノードプールは、同じ構成を持つノードのグループを管理します。ノードプールに ノードラベル (Labels) を設定すると、Container Service for Kubernetes (ACK) はそのラベルをプール内のすべてのノードに同期します。これには、スケールアウト中に追加される新しいノードも含まれます。
[ノードプールの設定] を選択し、既存のノードのテイント (Taints) とノードラベル (Labels) を同期して更新する にチェックを入れると、ACK はノードラベルを既存のノードに自動的に同期します。
-
Pod のスケジューリングルールを定義します。Pod の YAML ファイルで、
<a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector" id="09ff6ac5341l1">nodeSelector</a>または<a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity" id="95866abd0a387">nodeAffinity</a>を使用して、ターゲットノードのラベルを指定します。 -
(任意) 排他的アクセスを構成します。ノードプールに Taint を構成して、対応する Toleration を持つ Pod のみがそのノードプールにスケジュールされるようにすることができます。
-
自動スケジューリング。スケジューラは、前述のルールに基づいて、指定された条件を満たすノードに Pod を自動的にスケジュールします。
ステップ 1:ノードプールのラベル設定
カスタムラベルをノードプールに追加して、ビジネスプロパティや環境を識別し、スケジューリング管理を簡素化できます。
ACK は、各ノードプールに対してグローバルに一意なラベル alibabacloud.com/nodepool-id を自動的に作成します。このラベルを使用して、ノードプールを完全に一致させることができます。
Container Service for Kubernetes (ACK) コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、お使いのクラスターの名前をクリックし、左側のナビゲーションウィンドウで をクリックします。
-
送信先ノードプールのアクション列で、編集をクリックします。詳細オプションセクションを展開し、以下のパラメーターを設定します。
-
ノードラベル (Labels):
-
キー:フォーマットは
prefix/nameです。-
name(必須):名前は 1~63 文字で、英数字[a-z0-9A-Z]で始まり、英数字、ハイフン (-)、アンダースコア (_)、ピリオド (.) を含めることができます。 -
prefix(任意):プレフィックスは DNS サブドメイン である必要があります。DNS サブドメインは、ピリオド (.) で区切られた DNS ラベルで構成されます。プレフィックスは 253 文字以内で、スラッシュ (/) で終わる必要があります。kubernetes.io/プレフィックスは Kubernetes のコアコンポーネント用に予約されています。したがって、この名前空間のタグキーは、kubelet.kubernetes.io/やnode.kubernetes.io/などの許可されたプレフィックスで始まる必要があります。
-
-
値(任意):値は最大 63 文字の長さにすることができます。先頭および末尾は英数字
[a-z0-9A-Z]で始まり、終わる必要があります。また、英字、数字、ハイフン (-)、アンダースコア (_)、およびピリオド (.) を含めることができます。
-
-
(任意) 必要に応じて、既存のノードのテイント (Taints) とノードラベル (Labels) を同期して更新する を選択します。
-
-
左側のナビゲーションウィンドウで、 を選択します。次に、ラベルとテイントの管理 をクリックし、タグ タブでノードラベルを表示します。
ステップ 2:アプリケーションスケジューリングポリシーの設定
ノードプールのラベルを取得した後、アプリケーションの YAML ファイルで nodeAffinity または nodeSelector を設定して、アプリケーションを送信先のノードプールにスケジュールできます。
-
nodeSelector:Pod をノードにアタッチする簡単な方法を提供します。ラベルの完全一致を使用して、Pod を特定のノードにデプロイします。 -
nodeAffinity:nodeSelectorよりも柔軟性が高い。-
完全一致だけでなく、
In、NotIn、Existsなどの式もサポートします。 -
ソフトアフィニティ (
preferredDuringSchedulingIgnoredDuringExecution) をサポートします。これは、スケジューラが条件を満たすノードへの Pod のスケジューリングを優先することを意味します。そのようなノードが利用できない場合、Pod は他のノードにスケジュールされることがあります。
-
-
deployment.yamlファイルを作成します。nodeAffinitynodeAffinityには、次のスケジューリングポリシーが含まれます:-
requiredDuringSchedulingIgnoredDuringExecution(ハードアフィニティ):Pod は条件を満たすノードにスケジュールされる必要があります。条件を満たすノードがない場合、Pod はスケジュールできず、Pending 状態のままになります。 -
preferredDuringSchedulingIgnoredDuringExecution(ソフトアフィニティ):スケジューラは、条件を満たすノードへの Pod のスケジューリングを優先します。そのようなノードが見つからない場合、スケジューラはこのプリファレンスを無視し、利用可能な別のノードに Pod をスケジュールします。
次の例は、アプリケーションがラベル
pod: nginxを持つノードで実行されるようにする方法を示しています。apiVersion: 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"nodeSelector次の例は、アプリケーションが常にラベル
pod: nginxを持つノードで実行されるようにする方法を示しています。apiVersion: 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.yaml -
Pod の実行ステータスとスケジューリング結果を確認します。
-o wideパラメーターを追加して、Pod がスケジュールされている特定のノードを表示できます。kubectl get pods -l app=nginx -o wide出力で Pod が送信先ノードにスケジュールされているかどうかを確認できます。
参考
-
ノードプールを使用したノード管理に加えて、シングルノードにラベルを設定して、より詳細なスケジューリングを実現することもできます。詳細については、「ノードラベルの管理」をご参照ください。
-
Pod が異常な状態 (例えば、長時間 Pending 状態のままなど) にある場合は、「Pod の例外のトラブルシューティング」をご参照ください。
-
ACK は、異なるインスタンスリソースの順次スケールアウトと逆順スケールイン、ノードの実際のリソース使用量に基づく負荷感知スケジューリングなど、より柔軟なスケジューリングポリシーを提供します。詳細については、「ACK が提供するスケジューリングポリシー」をご参照ください。
-
ハードアフィニティスケジューリングを使用し、クラスター内に条件を満たすノードがない場合、ACK は、対応するラベルを持ち、自動スケーリングが有効になっているノードプールから新しいノードを自動的にスケールアウトします。
-
ノードプール機能が導入される前に作成された古いクラスターには、管理外のワーカーノードが含まれている場合があります。詳細については、「管理外ノードのノードプールへの移行」をご参照ください。