すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ECS インスタンスと Elastic Container Instance に基づくリソース割り当てを設定する

最終更新日:Nov 09, 2025

Container Service for Kubernetes (ACK) クラスターでサービスをデプロイする際、Toleration とノードアフィニティを使用して、Elastic Compute Service (ECS) インスタンスまたは Elastic Container Instance のみを使用するか、ECS リソースが不足している場合に Elastic Container Instance を自動的にリクエストするかを指定できます。さまざまなスケジューリングポリシーを設定して、さまざまなシナリオでリソースをスケーリングできます。

用語

  • Taint: ノードに設定されるルールで、特定の Pod がノードにスケジュールされないように除外するために使用されます。

  • Toleration: Pod に適用され、特定の Taint を持つノードにスケジュールされることを許可します。

  • ノードアフィニティ: 特定のラベルを持つノードに Pod を引き寄せる Pod のプロパティです。以下のタイプのノードアフィニティが含まれます:

    • requiredDuringSchedulingIgnoredDuringExecution: スケジューリングが行われるために満たす必要があるハード要件です。スケジューラは、これらのルールが満たされた場合にのみ Pod をスケジュールできます。

    • preferredDuringSchedulingIgnoredDuringExecution: スケジューリング中に考慮されるプリファレンスです。スケジューラは、対応するルールを満たすノードを見つけようとします。一致するノードが見つからない場合でも、スケジューラは Pod をスケジュールします。

詳細については、「Taint と Toleration」および「ノードアフィニティ」をご参照ください。

前提条件

  • Kubernetes v1.22 以降を実行する ACK マネージド Pro 版クラスターが作成されていること。

  • クラスターに ack-virtual-node コンポーネントがデプロイされており、バージョンが v2.10.0 以降であること。ack-virtual-node コンポーネントのインストールとアップグレードについては、「仮想ノード」をご参照ください。

  • クラスター内の kube-scheduler コンポーネントのバージョンが 5.9 以降であり、仮想ノードスケジューリングポリシーが有効になっていること。

    [アドオン] ページで [Kube Scheduler] を見つけ、[設定] をクリックし、[仮想ノードベースの Pod スケジューリングを有効にする] が選択されていることを確認します。

設定例

ACK クラスターにデプロイされた仮想ノードには、デフォルトの Taint virtual-kubelet.io/provider=alibabacloud:NoSchedule があります。これは、ユーザーが知らないうちに Elastic Container Instance が使用されるのを防ぐためのものです。したがって、Pod を仮想ノードにスケジュールして Elastic Container Instance を使用するには、この Taint に対する Toleration を設定する必要があります。

      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule

Toleration とノードアフィニティを組み合わせることで、優先順位と要件を持つ混合スケジューリングポリシーを実装して、さまざまなサービスのさまざまなリソースニーズに対応できます。

  • ECS インスタンスを優先的に使用する: ECS リソースを優先します。クラスター内の ECS リソースが不足している場合は、Elastic Container Instance を使用します。

  • Elastic Container Instance のみを使用する: クラスター内の Elastic Container Instance のみを使用します。

  • ECS インスタンスのみを使用する: クラスター内の既存の ECS リソースのみを使用します。

ECS インスタンスを優先的に使用する

仮想ノードにはデフォルトの Taint があるため、Pod を仮想ノードにスケジュールするには、これらの Taint に対する Toleration を設定する必要があります。同時に、ノードアフィニティを設定します。preferredDuringSchedulingIgnoredDuringExecution を使用して、Pod のスケジューリングプリファレンスを指定できます。つまり、type: virtual-kubelet ラベルのないノード (ECS ノード) に Pod を優先的にスケジュールします。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ecs-prefer
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: type
                operator: NotIn
                values:
                - virtual-kubelet
      containers:
      - name: my-container
        image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
説明

ノードアフィニティを設定する際には、次の情報に注意してください。

  • nodeSelectorTerms に複数の条件 (複数の matchExpressions) を設定した場合、いずれかの条件が満たされていれば、Pod は対応するノードにスケジュールできます (条件は論理 OR 演算で結合されます)。単一の matchExpressions に複数の式を設定した場合、すべての式が満たされた場合にのみ、Pod は対応するノードにスケジュールできます (式は論理 AND 演算で結合されます)。

  • preferredDuringSchedulingIgnoredDuringExecution を使用して ECS の優先スケジューリングを実装する場合、ECS リソースが不足している場合にのみ Pod が Elastic Container Instance にスケジュールされることを保証できません。ECS リソースが十分な場合でも、Pod が Elastic Container Instance にスケジュールされる可能性があります。より高い要件がある場合は、requiredDuringSchedulingIgnoredDuringExecution を組み合わせて、より詳細な必須ルールを設定することをお勧めします。

特定のラベル (例: label_1=key_1) を持つ ECS ノードに Pod を優先的にデプロイし、これらのノードのリソースが不足している場合に仮想ノードを弾性スケーリングに使用したい場合は、以下の YAML 設定を使用できます。

YAML の詳細を表示

apiVersion: apps/v1
kind: Deployment
metadata:
  name: some-ecs-prefer
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
      affinity:
        nodeAffinity:
    # Pod を label_1:key_1 または type:virtual-kubelet ラベルを持つノードにのみスケジュールします。
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: label_1
                operator: In
                values:
                - key_1
            - matchExpressions:
              - key: type
                operator: In
                values:
                - virtual-kubelet
    # Pod を label_1:key_1 ラベルを持つノードに優先的にスケジュールし、次に type:virtual-kubelet ラベルを持つノードにスケジュールします。
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            preference:
              matchExpressions:
              - key: label_1
                operator: In
                values:
                - key_1
          - weight: 1
            preference:
              matchExpressions:
              - key: type
                operator: In
                values:
                - virtual-kubelet
      containers:
      - name: my-container
        image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

Elastic Container Instance のみを使用する

仮想ノードにはデフォルトの Taint があるため、Pod を仮想ノードにスケジュールするには、これらの Taint に対する Toleration を設定する必要があります。同時に、ノードアフィニティを設定します。requiredDuringSchedulingIgnoredDuringExecution を使用して、Pod を type: virtual-kubelet ラベルを持つノード (仮想ノード) にスケジュールする必要があることを指定できます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: eci-only
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
      - key: virtual-kubelet.io/provider
        operator: Equal
        value: alibabacloud
        effect: NoSchedule
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: type
                operator: In
                values:
                - virtual-kubelet
      containers:
      - name: my-container
        image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            

ECS インスタンスのみを使用する

仮想ノードにはデフォルトの Taint があるため、これらの Taint に対する Toleration を設定しない限り、Pod は ECS ノードにのみスケジュールされます。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ecs-only
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6