デフォルトでは、ACK はすべてのワークロードを x86 ワーカーノードにスケジューリングします。ARM ノードと非 ARM ノードの両方を含む混合クラスターでは、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 クラスターまたはノードプールの作成
クラスター作成時に ARM ノードを追加するか、既存のクラスターに ARM ノードプールを追加します。
クラスター作成時
インスタンスタイプ セクションで、アーキテクチャ を ARM に設定し、g8m 汎用インスタンスファミリーからインスタンスタイプを選択して、他のパラメーターを設定します。 詳細については、「ACK マネージドクラスターを作成する」をご参照ください。
ECS の各リージョンで利用可能なインスタンスタイプにアクセスして、リージョン別のインスタンスの利用可能性を確認してください。
既存のクラスター内
インスタンスタイプ セクションで、アーキテクチャ を ARM に設定し、インスタンスタイプを選択してその他のパラメーターを設定します。 詳細については、「ノードプールの作成と管理」をご参照ください。
ECS の各リージョンで利用可能なインスタンスタイプにアクセスして、リージョン別のインスタンスの利用可能性を確認してください。
ARM 専用ワークロードの ARM ノードへのスケジューリング
混合アーキテクチャクラスターでは、ARM 専用アプリケーションを ARM ノードにスケジューリングして、互換性のないノードでの Pod の障害を防ぎます。すべての ARM ノードには kubernetes.io/arch=arm64 という label が付いています。nodeSelector または nodeAffinity を使用してそれらを指定します。
nodeSelector
Pod の spec に以下の nodeSelector を追加します。これにより、kubernetes.io/arch: arm64 という label が付いたノードが対象になります。これは ACK クラスター内のすべての ARM ノードに適用されます。
nodeSelector:
kubernetes.io/arch: arm64 # ARM ノードを指定します。
ステートレスアプリケーションを ARM ノードにデプロイするための YAML の例:
nodeAffinity
nodeAffinity を使用して、Pod を ARM ノードのみにスケジューリングします。以下のルールは、kubernetes.io/arch=arm64 という label が付いたノードを対象とします。
このルールにより、スケジューラーは自動的に kubernetes.io/arch=arm64:NoSchedule Taint に対する Toleration を追加します。
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
ステートレスアプリケーションを ARM ノードにデプロイするための YAML の例:
マルチアーキテクチャワークロードの ARM ノードへのスケジューリング
デフォルトでは、ACK はワークロードを x86 ノードにスケジューリングし、ARM ノードが利用可能な場合でも x86 ノードのリソースを待機し続けます。マルチアーキテクチャイメージの場合は、両方のアーキテクチャを活用するためにスケジューリングの優先順位を設定します。
たとえば、ARM または x86 ノードを優先するように nodeAffinity を設定し、優先ノードにリソースが不足している場合は他のアーキテクチャにフォールバックします。
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64
ARM ノードを優先
x86 ノードを優先
よくある質問
ARM ベースのプリエンプティブルインスタンスを使用できますか?
ARM ベースのプリエンプティブルインスタンスは利用可能です。詳細については、「プリエンプティブルインスタンスの使用」をご参照ください。
ARM ノードの制限事項
現在、以下のアドオンカテゴリのみが ARM をサポートしています:
-
コアコンポーネント
-
ログとモニタリング
-
ストレージ
-
ネットワーク
マーケットプレイスコンポーネントは ARM をサポートしていません。
関連情報
-
Container Registry Enterprise Edition (ACR EE) を使用して、マルチアーキテクチャコンテナイメージを構築できます。
-
クラスターリソースを管理することなくビッグデータジョブを実行するには、ARM 仮想ノードで Spark ジョブを実行できます。