ノードプール内のノードにラベルを追加し、ノードプール内で指定されたラベルを持つノードで実行するようにアプリケーションポッドをスケジュールできます。
前提条件
Container Service for Kubernetes (ACK) マネージドクラスターまたはACK専用クラスターが作成されます。
ステートレスアプリケーションはデプロイを使用して作成されます、またはステートフルアプリケーションはStatefulSetを使用して作成されます。
手順
ノードプール内のノードにラベルを追加します。
ACKを使用すると、ノードプールを使用してクラスターノードのグループを管理できます。 たとえば、ノードプール内のノードのラベルとテイントを一元的に管理できます。 ノードプールの作成方法の詳細については、「ノードプールの作成」をご参照ください。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
右上隅にノードプールページでノードプールの作成をクリックします。
[ノードプールの作成] ダイアログボックスで、高度なオプションを表示をクリックし、の右にあるアイコンノードラベルパラメータを使用して、ノードプール内のノードにラベルを追加します。
この例では、pod: nginxラベルが追加されています。
[ノードプール] ページで管理するノードプールを見つけ、[操作] 列の [編集] をクリックして、ノードプール内のノードのラベルを更新または追加することもできます。
アプリケーションポッドのスケジューリングポリシーを設定します。
前の手順が完了すると、pod: nginxラベルがノードプール内のノードに追加されます。 ノードプールで指定されたラベルを持つノードでアプリケーションポッドを実行するようにスケジュールするには、ポッド設定でnodeSelectorまたはnodeAffinityフィールドを指定します。 Details:
nodeSelectorフィールドを指定します。
nodeSelectorは、ポッド構成のspecセクションのフィールドです。 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 # Add the label to nodes in the node pool to ensure that application pods run only on nodes that have the specified label in the node pool. containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
nodeAffinityフィールドを指定します。
nodeAffinityは、次のスケジューリングポリシーをサポートします。
- requiredDuringSchedulingIgnoredDuringExecution
このポリシーを使用すると、指定された条件を満たすノードにのみポッドをスケジュールできます。 指定された条件を満たすノードがない場合、条件を満たすノードが見つかるまでシステムは再試行します。 IgnoreDuringExecutionは、ポッドがデプロイされているノードのラベルが変更され、ノードが指定された条件を満たさなくなった場合、ポッドがノードで実行され続けることを示します。
- preferredDuringSchedulingIgnoredDuringExecution
このポリシーが使用される場合、ポッドは、指定された条件を満たすノードで実行するようにスケジュールされることが望ましい。 条件を満たすノードがない場合、システムは条件を無視し、デフォルトのロジックに基づいてポッドをスケジュールします。
次の例では、requiredDuringSchedulingIgnoredDuringExecutionポリシーを使用して、ノードプールで指定されたラベルを持つノードでのみアプリケーションポッドが実行されるようにスケジュールされています。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-with-affinity labels: app: nginx-with-affinity spec: replicas: 2 selector: matchLabels: app: nginx-with-affinity template: metadata: labels: app: nginx-with-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: pod # The key of the label that is added to nodes. In this example, pod is used. operator: In # Specifies that application pods run on nodes that have the pod: nginx label. values: - nginx # The value of the label that is added to nodes. In this example, nginx is used. containers: - name: nginx-with-affinity image: nginx:1.7.9 ports: - containerPort: 80
設定の確認
アプリケーションの名前をクリックします。 アプリケーションの詳細ページで、[ポッド] タブをクリックします。 アプリケーションポッドは、ノードプールにpod: nginxラベルが追加されたxx.xx.33.88およびxx.xx.33.92ノードにスケジュールされます。
関連ドキュメント
nodeSelector
およびnodeAffinity
の詳細については、「ノードへのポッドの割り当て」をご参照ください。アプリケーションをデプロイまたはスケールアウトするときに、ResourcePolicyをカスタマイズして、アプリケーションポッドがスケジュールされるさまざまなノードタイプの優先順位を指定できます。 システムがアプリケーションポッドでスケーリングすると、ポッドはノードの優先順位に基づいて昇順でノードから削除されます。 詳細については、「優先度ベースのリソーススケジューリングの設定」をご参照ください。