ご利用のクラスターに ARM ノードと x86 ノードの両方が含まれている場合、Kubernetes のネイティブなスケジューリング機能を使用して、ARM 専用ワークロードを ARM ノードにスケジューリングしたり、マルチアーキテクチャのワークロードを優先的に ARM ノードにスケジューリングしたりできます。
前提条件
Alibaba Cloud Linux 3 上で Kubernetes 1.20 以降を実行する ACK マネージドクラスター。詳細については、「ACK マネージドクラスターの作成」および「クラスターのアップグレード」をご参照ください。
説明コアコンポーネント では、コアコンポーネント、ボリューム、ネットワーク のコンポーネントのみが ARM ノードプールでサポートされています。
マーケットプレイスのコンポーネントは ARM ノードプールではサポートされていません。
kube-scheduler コンポーネントがインストールされていること。詳細については、「コンポーネントの管理」をご参照ください。
注意事項
ご利用の ACK クラスターに ARM ノードと x86 ノードの両方が含まれている場合は、ARM ノードに kubernetes.io/arch=arm64:NoSchedule Taint を追加してください。これにより、ARM アーキテクチャをサポートしないアプリケーションやコンポーネントが誤って ARM ノードにスケジューリングされるのを防ぎます。ご利用のクラスターが Kubernetes v1.24 より前のバージョンを実行している場合、nodeSelector または nodeAffinity を使用してアプリケーションを ARM ノードにスケジューリングする際には、kubernetes.io/arch=arm64:NoSchedule Taint に対する Toleration も宣言する必要があります。これを行うには、kubernetes.io/arch=arm64:NoSchedule Taint に対応する tolerations キーを追加します。Kubernetes v1.24 以降を実行するクラスターの場合、スケジューラは ARM ノード上の kubernetes.io/arch=arm64:NoSchedule Taint を自動的に認識するため、toleration は不要です。
課金
ARM アーキテクチャを使用する ECS インスタンスタイプとその料金の詳細については、次のトピックをご参照ください:
ARM クラスターまたはノードプールの作成
新しい ACK クラスターを作成する際に ARM ノードを追加するか、既存のクラスターに新しい ARM ノードプールを追加することができます。
クラスター作成時
クラスター作成時にノードプールを設定する際、インスタンスタイプ セクションで アーキテクチャ を ARM に設定します。次に、g8m 汎用インスタンスファミリーからインスタンスタイプを選択し、他のパラメーターを設定してクラスターを作成します。クラスターの作成方法の詳細については、「ACK マネージドクラスターの作成」をご参照ください。
「各リージョンで利用可能な ECS インスタンスタイプ」に移動して、リージョンごとのインスタンスの可用性を確認してください。
既存クラスター内
ノードプールを作成する際、インスタンスタイプ セクションで アーキテクチャ を ARM に設定します。次に、インスタンスタイプを選択し、他のパラメーターを設定してノードプールを作成します。ノードプールの作成方法の詳細については、「ノードプールの作成と管理」をご参照ください。
「各リージョンで利用可能な ECS インスタンスタイプ」に移動して、リージョンごとのインスタンスの可用性を確認してください。
ARM 専用ワークロードの ARM ノードへのスケジューリング
ご利用のクラスターに ARM ノードと x86 ノードの両方が含まれている場合、ARM アーキテクチャのみをサポートするアプリケーションが ARM ノードにスケジューリングされるようにする必要があります。これにより、互換性のないノードで Pod の起動が失敗するのを防ぎます。デフォルトでは、すべての ARM ノードに kubernetes.io/arch=arm64 ラベルが付与されています。nodeSelector または nodeAffinity を使用して、アプリケーションを ARM ノードにデプロイできます。
nodeSelector
Pod を ARM ノードにスケジュールするには、Pod の spec に次の nodeSelector を追加します。これにより、ワークロードは、ACK クラスター内のすべての ARM ノードに存在する kubernetes.io/arch: arm64 ラベルを持つノードにのみスケジュールされます。
nodeSelector:
kubernetes.io/arch: arm64 # ARM ノードを指定します。次のサンプル YAML を使用して、ステートレスアプリケーションを ARM ノードにデプロイできます。
nodeAffinity
ノードアフィニティを使用して、Pod を ARM ノードにスケジューリングできます。次のルールは、Pod を kubernetes.io/arch=arm64 ラベルを持つノードにのみスケジューリングします。
このアフィニティルールを使用すると、スケジューラは kubernetes.io/arch=arm64:NoSchedule Taint に対する Toleration を自動的に追加します。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64次のサンプル YAML を使用して、ステートレスアプリケーションを ARM ノードにデプロイできます。
マルチアーキテクチャワークロードの ARM ノードへのスケジューリング
デフォルトでは、ACK はすべてのワークロードを x86 ノードにスケジューリングします。x86 ノードのリソースが不足している場合、Pod は利用可能な ARM ノードにスケジューリングされずに保留状態のままになります。アプリケーションが x86 と ARM の両方のアーキテクチャをサポートするマルチアーキテクチャイメージを使用している場合は、異なるアーキテクチャのノードを活用するようにスケジューリングプリファレンスを設定する必要があります。
たとえば、ノードアフィニティを設定して ARM または x86 ノードを優先し、優先ノードのリソースが不足している場合に他のアーキテクチャのノードにフォールバックするように設定できます。
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64ARM ノードの優先
x86 ノードの優先
よくある質問
ARM ベースのプリエンプティブルインスタンスを使用できますか?
ARM ベースのプリエンプティブルインスタンスは利用可能です。使用方法の詳細については、「プリエンプティブルインスタンスの使用」をご参照ください。
ARM ノードの制限事項
現在、ARM アーキテクチャをサポートしているのは、次のカテゴリのアドオンのみです:
コアコンポーネント
ログとモニタリング
ストレージ
ネットワーク
マーケットプレイスのコンポーネントは ARM アーキテクチャをサポートしていません。
参考
ARM 仮想ノードを作成し、ワークロードが優先的にそれらにスケジューリングされるように設定することもできます。詳細については、「ARM 仮想ノードへのワークロードのスケジューリング」をご参照ください。
Container Registry Enterprise Edition (ACR EE) を使用して、マルチアーキテクチャコンテナイメージをビルドできます。詳細については、「マルチアーキテクチャコンテナイメージのビルド」をご参照ください。
ビッグデータジョブを実行し、基盤となるクラスターリソースの管理を避けたい場合は、「ARM 仮想ノードで Spark ジョブを実行」できます。