デフォルトでは、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ベースのノードにステートレスアプリケーションをデプロイできます。
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ジョブの実行」をご参照ください。