デフォルトでは、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管理クラスターの作成」をご参照ください。
[各リージョンで使用可能なECSインスタンスタイプ] ページに移動して、各リージョンで使用可能なインスタンスタイプを表示できます。
ノードプールの作成
ノードプールを作成するときは、[インスタンスタイプ] セクションで [アーキテクチャ] パラメーターを [ARM] に設定します。 次に、ビジネス要件に基づいて他のパラメーターを設定します。 ノードプールパラメーターの詳細については、「ノードプールの作成と管理」をご参照ください。
[各リージョンで使用可能な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ベースのノードにステートレスアプリケーションをデプロイできます。
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ベースのノードにステートレスアプリケーションをデプロイできます。
マルチアーチワークロードを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ベースのノードにスケジューリングされる。
ワークロードをx86-basedノードにスケジュールすることが望ましい
以下の作業負荷は、好ましくはx86-basedのノードにスケジューリングされる。
よくある質問
ARMベースのプリエンプティブルインスタンスを使用できますか?
はい、ARMベースのプリエンプティブルインスタンスを使用できます。 詳細については、「プリエンプティブルインスタンスの使用」をご参照ください。
ACKクラスターでARMベースのノードを使用する場合の制限は何ですか?
次のコンポーネントのみがARMアーキテクチャをサポートしています。
キーコンポーネント
ロギングと監視コンポーネント
ボリュームコンポーネント
ネットワークコンポーネント
ACKコンソールのMarketplaceページに表示されるコンポーネントは、ARMアーキテクチャをサポートしていません。
関連ドキュメント
ARMベースの仮想ノードを作成し、ARMベースの仮想ノードにワークロードをスケジュールすることができます。 詳細については、「ARMベースの仮想ノードへのワークロードのスケジュール」をご参照ください。
Container Registry Enterprise Editionを使用して、マルチアーチコンテナイメージを構築できます。 詳細については、「マルチアーチコンテナイメージの作成」をご参照ください。
クラスターリソースでO&Mを実行せずにビッグデータジョブを実行する場合は、「ARMベースの仮想ノードでSparkジョブを実行する」をご参照ください。