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

Container Service for Kubernetes:ARMベースのノードへのワークロードのスケジュール

最終更新日:Dec 13, 2024

デフォルトでは、Container Service for Kubernetes (ACK) は、すべてのワークロードをx86-basedのワーカーノードにスケジュールします。 クラスターにARMベースのノードとx86-basedノードなどの他のノードが含まれている場合、ARMワークロードをARMベースのノードにのみスケジュールするようにKubernetesスケジューリングを設定できます。

前提条件

  • ARMベースのノードまたはARMベースのノードプールを備えたACKクラスターが作成され、Kubernetesバージョンのクラスターが要件を満たしています。 詳細については、「ARMベースのノードプールの設定」をご参照ください。

    ARMベースのインスタンスは、特定のリージョンとゾーンでのみ使用できます。 ACKクラスターがARMベースのインスタンスをサポートするリージョンにデプロイされていることを確認します。 ARMベースのインスタンスが使用可能なリージョンとゾーンの詳細については、「各リージョンで使用可能なインスタンスタイプ」をご参照ください。

  • kube-schedulerコンポーネントがインストールされています。 詳細については、「kube-scheduler」をご参照ください。

使用上の注意

ARMベースのノードとx86-basedノードの両方がクラスターに存在する場合は、ARMベースのノードにkubernetes.io/arch=arm64:NoScheduleテイントを追加することを推奨します。 これは、ARMアーキテクチャをサポートしないアプリケーションまたはコンポーネントをARMベースのノードに誤ってスケジューリングすることを回避する。 nodeSelectorまたはnodeAffinityを設定して、1.24より前のバージョンのKubernetesを実行するACKクラスター内のARMベースのノードにアプリケーションをスケジュールする場合、kubernetes.io/arch=arm64:NoScheduleのテイントを許容する許容範囲を追加する必要があります。 ただし、クラスターがKubernetes 1.24以降を実行する場合、スケジューラは自動的にkubernetes.io/arch=arm64:NoScheduleテントを許容します。 この場合、汚れを許容するために許容範囲を追加する必要はありません。

課金

ARMアーキテクチャを採用するエラスティックコンテナインスタンスにデプロイされたポッドは、エラスティックコンテナインスタンスの作成に使用されたECSインスタンスタイプに基づいて課金されます。 ポッドは、vCPUとメモリの使用量に基づいて課金されません。

重要

Elastic Container Instanceベースのポッドを作成したら、kubectl describe podコマンドを実行して、ポッドのYAMLコンテンツを表示できます。 k8s.aliyun.com/eci-instance-specパラメーターは、ポッドで使用されるECSインスタンスタイプを示します。 ポッドは、ECSインスタンスタイプに基づいて課金されます。

ARMアーキテクチャを使用するECSインスタンスタイプの詳細については、以下のトピックを参照してください。

ARMワークロードをARMベースノードにスケジュールする

クラスターにARMベースのノードと他のノードが含まれており、すべてのワークロードがARMアーキテクチャを使用している場合、ワークロードをARMベースのノードにのみスケジュールする必要があります。 ポッドが他のノードにスケジュールされている場合、ポッドは起動できません。 デフォルトでは、すべてのARMベースのノードにkubernetes.io/arch=arm64ラベルが付いています。 nodeSelectorまたはnodeAffinity設定を使用して、ARMベースのノードへのワークロードをスケジュールできます。

nodeSelectorを使用する

ポッドに次の制約を追加します。 このように、nodeSelectorはポッドをARMベースのノードにスケジュールします。 nodeSelectorは、arm64ラベルを持つノードにのみワークロードのポッドをスケジュールします。 クラスター内のすべてのARMベースのノードにこのラベルがあります。

nodeSelector:
  kubernetes.io/arch: arm64 # Specify the label that is used to select an ARM-based node.

次のYAMLファイルを使用して、ARMベースのノードにステートレスアプリケーションをデプロイできます。

YAMLコンテンツの表示

apiVersion: apps/v1
kind: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeSelector:
        kubernetes.io/arch: arm64 # Specify the label that is used to select an ARM-based node. 
      containers:
      - name: nginx
        image: nginx

nodeAffinityの使用

次の制約をポッドに追加して、ノードアフィニティに基づいてARMベースのノードにポッドをスケジュールすることができます。 この制約を追加すると、kubernetes.io/arm=arm64ラベルを持つノードにのみポッドをスケジュールできます。

ポッド仕様にこの制約が含まれている場合、スケジューラはkubernetes.io/arch=arm64:NoScheduleを許容します。

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        -key: kubernetes.io/arch
          operator: In
          values:
          -arm64 

次のYAMLファイルを使用して、ARMベースのノードにステートレスアプリケーションをデプロイできます。

YAMLコンテンツの表示

apiVersion: apps/v1
kind: 配置
メタデータ:
  名前: only-arm
spec:
  セレクタ:
    matchLabels:
      アプリ:nginx
  replicas: 1
  template:
    metadata:
      labels:
        アプリ:nginx
    仕様:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              -key: kubernetes.io/arch
                operator: In
                values:
                -arm64
      コンテナ:
      - name: nginx
        画像: nginx 

マルチアーチワークロードをARMベースのノードにスケジュールする

デフォルトでは、ACKはすべてのワークロードをx86-basedノードにスケジュールします。 x86ノードが不十分な場合、ポッドは保留になります。 アプリケーションイメージがマルチアーチイメージ (x86およびARMアーキテクチャをサポートするイメージなど) の場合、クロスアーキテクチャノードスケジューリングを構成する必要があります。

たとえば、ノードアフィニティを設定して、ARMベースまたはx86-basedノードへのワークロードをスケジュールすることができます。 次に、ARMベースまたはx86-basedノードが不十分な場合、他のタイプのノードにワークロードをスケジュールします。

      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64

ワークロードをARMベースのノードにスケジュールすることが望ましい

以下の作業負荷は、好ましくはARMベースのノードにスケジューリングされる。

YAMLコンテンツの表示

apiVersion: apps/v1
kind: Deployment
metadata:
  name: arm-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
# Preferably schedule the workload to an ARM-based node. 
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: my-container
        image: nginx

ワークロードをx86-basedノードにスケジュールすることが望ましい

以下の作業負荷は、好ましくはx86-basedのノードにスケジューリングされる。

YAMLコンテンツの表示

apiVersion: apps/v1
kind: 配置
メタデータ:
  名前: amd-prefer
spec:
  replicas: 1
  セレクタ:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    仕様:
      寛容:
# ワークロードをx86-basedノードにスケジュールすることが望ましい。 
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              -key: kubernetes.io/arch
                operator: In
                values:
                -amd64
      コンテナ:
      -name: my-container
        画像: nginx 

よくある質問

ARMベースのプリエンプティブルインスタンスを使用できますか?

ARMベースのプリエンプティブルインスタンスが利用可能です。 詳細については、「プリエンプティブルインスタンスの使用」をご参照ください。

ACKクラスターでARMベースのノードを使用する場合の制限は何ですか?

次のコンポーネントのみがARMアーキテクチャをサポートしています。

  • 主要コンポーネント

  • ロギングと監視コンポーネント

  • ボリュームコンポーネント

  • ネットワークコンポーネント

ACKコンソールのMarketplaceページに表示されるコンポーネントは、ARMアーキテクチャをサポートしていません。

関連ドキュメント