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

Container Service for Kubernetes:ARMベースの仮想ノードを作成し、ARMベースのノードにワークロードをスケジュールする

最終更新日:Mar 03, 2025

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

前提条件

  • Kubernetes 1.20以降を実行するクラスターが作成されます。 クラスターのオペレーティングシステムはAlibaba Cloud Linux 3です。 詳細については、「クラスターの作成」および「クラスターのアップグレード」をご参照ください。

    説明
    • [アドオン] ページでは、[コアコンポーネント][ログとモニタリング][ストレージ] 、および [ネットワーク] コンポーネントのみをARMベースのノードプールで使用できます。

    • ACKコンソールのMarketplaceページに表示されるコンポーネントは、ARMベースのノードプールにデプロイできません。

  • 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インスタンスタイプとこれらのタイプの料金の詳細については、以下のトピックを参照してください。

ARMベースのクラスターまたはノードプールの作成

ACKクラスターを作成するときに、ARMベースのノードを追加して、ARMベースのノードのみを含むクラスターを取得できます。 既存のクラスターにARMベースのノードプールを作成して、ARMベースのノードのみを含むノードプールを取得することもできます。

クラスターの作成時にARMベースのノードプールを作成する

クラスターのノードプールを設定するときは、[インスタンスタイプ] セクションの [アーキテクチャ] パラメーターに [アーム] を選択します。 次に、g8m汎用インスタンスを選択し、ビジネス要件に基づいて他のパラメーターを設定します。 ACKクラスターの作成に必要な設定項目の詳細については、「ACK管理クラスターの作成」をご参照ください。image.png

説明

[各リージョンで使用可能なECSインスタンスタイプ] ページに移動して、各リージョンで使用可能なインスタンスタイプを表示できます。

ノードプールの作成

ノードプールを作成するときは、[インスタンスタイプ] セクションで [アーキテクチャ] パラメーターを [ARM] に設定します。 次に、ビジネス要件に基づいて他のパラメーターを設定します。 ノードプールパラメーターの詳細については、「ノードプールの作成と管理」をご参照ください。image.png

説明

[各リージョンで使用可能なECSインスタンスタイプ] ページに移動して、各リージョンで使用可能なインスタンスタイプを表示できます。

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

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

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: Deployment
metadata:
  name: only-arm
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - arm64
      containers:
      - name: nginx
        image: 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:
# Preferentially 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: Deployment
metadata:
  name: amd-prefer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      tolerations:
# Preferably schedule the workload to an x86-based node. 
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: kubernetes.io/arch
                operator: In
                values:
                - amd64
      containers:
      - name: my-container
        image: nginx

よくある質問

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

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

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

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

  • キーコンポーネント

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

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

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

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

関連ドキュメント