次の方法で共有


Azure Red Hat OpenShift (ARO) クラスターで Azure Spot Virtual Machines を使用する

この記事では、Azure Red Hat OpenShift クラスター (ARO) を Azure Spot Virtual Machines を使用するように構成するために必要な詳細について説明します。

Azure Spot Virtual Machines を使用すると、大幅にコストを削減して未使用の容量を利用できます。 Azure で容量の回復が必要になると、Azure インフラストラクチャによって Azure Spot Virtual Machines が削除されます。 スポット インスタンスの詳細については、スポット仮想マシンに関するページを参照してください。

開始する前に

作業を開始する前に、Azure Red Hat Openshift クラスターがデプロイされていることを確認します。 ARO クラスターが必要な場合、パブリック クラスターについては ARO クイックスタートを、プライベート クラスターについては プライベート クラスターのチュートリアルを参照してください。 スポット VM を使用するようにクラスターを構成する手順は、プライベート クラスターとパブリック クラスターの両方で同じです。

ARO クラスターには、常に、非スポット VM である少なくとも 3 つのワーカー ノードと 3 つの制御ノードが必要です。 ARO クラスターには、スポット VM ベースの制御ノードを含めることはできません。

スポット VM を追加する

Azure でのマシン管理 Red Hat Openshift は、MachineSet を使用して実現されます。 MachineSet リソースは、マシンのグループです。 MachineSets は、ポッドへの ReplicaSets のようにマシンに対して設定されます。 より多くのマシンが必要な場合、またはマシンをスケールダウンする必要がある場合は、コンピューティングのニーズに合わせてマシン セットの [レプリカ] フィールドを変更します。 詳細については、OpenShift Machineset のドキュメントを参照してください

スポット VM の使用は、MachineSet のテンプレート仕様内に spotVMOptions フィールドを追加することによって指定します。 この MachineSet を作成するには、次の操作を行います。

  1. クラスターで実行されている MachineSet のコピーを取得します。
  2. 変更された MachineSet 構成を作成します。
  3. この MachineSet をクラスターにデプロイします

まず、CLI を使用して OpenShift クラスターに接続します。

oc login $apiServer -u kubeadmin -p <kubeadmin password>

次に、クラスター上の MachineSets を一覧表示します。 既定のクラスターには、3 つの MachineSet がデプロイされます。

oc get machinesets -n openshift-machine-api

このコマンドからの出力例を次に示します。

NAME                                    DESIRED   CURRENT   READY   AVAILABLE   AGE
aro-cluster-5t2dj-worker-eastus1   1         1         1       1           2d22h
aro-cluster-5t2dj-worker-eastus2   1         1         1       1           2d22h
aro-cluster-5t2dj-worker-eastus3   1         1         1       1           2d22h

次に、デプロイされている MachineSet について説明します。 <machineset> を、上記に示した MachineSet のいずれかで置き換え、これをファイルに出力します。

oc get machineset <machineset> -n openshift-machine-api -o yaml > spotmachineset.yaml

MachineSet の次のパラメーターを変更する必要があります。

  • metadata.name
  • spec.selector.matchLabels.machine.openshift.io/cluster-api-machineset
  • spec.template.metadata.labels.machine.openshift.io/cluster-api-machineset
  • spec.template.spec.providerSpec.value.spotVMOptions (このフィールドを追加し、{} に設定します)。

以下は、スポット MachineSet YAML の要約の例です。ここでは、コンテキストに関する追加情報を含め、既存の worker MachineSet に新しいスポットマシンを設定するときに行う必要がある主な変更点について説明します。 (この例は、機能 MachineSet 全体を表しているわけではありません。多くのフィールドは次のように省略されています)。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  name: aro-cluster-abcd1-spot-eastus
spec:
  replicas: 2
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: aro-cluster-abcd1
      machine.openshift.io/cluster-api-machineset: aro-cluster-abcd1-spot-eastus
  template:
    metadata:
        machine.openshift.io/cluster-api-machineset: aro-cluster-abcd1-spot-eastus
    spec:
      providerSpec:
        value:
          spotVMOptions: {}
      taints:
        - effect: NoExecute
          key: spot
          value: 'true'

ファイルが更新されたら、それを適用します。

oc create -f spotmachineset.yaml

MachineSet が正常に作成されたことを確認するには、次のコマンドを実行します。

oc get machinesets -n openshift-machine-api

出力例を次に示します。 マシンが "準備完了" 状態になると、Machineset の準備が整います。

  NAME                                    DESIRED   CURRENT   READY   AVAILABLE   AGE
aro-cluster-5t2dj-worker-eastus1           1         1         1       1           3d1h
aro-cluster-5t2dj-worker-eastus2           1         1         1       1           3d1h
aro-cluster-5t2dj-worker-eastus3           1         1         1       1           3d1h
spot                                       1         1         1       1           2m47s

割り込み可能ワークロードをスケジュール設定する

テイントをスポット ノードに追加して、割り込み不可能なノードがスケジュールされないようにし、このテイントの容認を、スケジュールするポッドに追加することをお勧めします。 MachineSet 仕様を使用してノードのテイントを受け取ることができます。

たとえば、次の YAML を spec.template.spec に追加できます。

     taints:
        - effect: NoExecute
          key: spot
          value: 'true'

これにより、spot='true' テイントの容認がない場合に、ポッドは結果ノードでスケジュールされなくなり、その容認を持たないポッドが削除されます。

テイントと容認の適用の詳細については、ノード テイントを使用したポッドの配置の制御に関するページを参照してください。

Quota

使用しているマシンの種類のクォータが短時間でも少なすぎる場合 (たとえば、別のノードが作成されているときに 1 つのノードがまだ削除されている場合など)、クォータの問題によってマシンがエラー状態になることがあります。 このため、スポット インスタンスに使用するマシンの種類のクォータは、必要なものよりも若干高くなるように設定することをお勧めします (2 * n の場合もあります。ここで、n はマシンで使用されるコアの数です)。 このオーバーヘッドによって、障害が発生したマシンを修正する必要がなくなります。ただし、比較的単純ですが、手動での介入が必要になります。

ノードの準備

上のリンクされているスポット VM のドキュメントで説明したように、VM は使用できなくなった場合、または指定された最大価格で利用できなくなった場合に、割り当て解除されたプロビジョニング状態になります。

これにより、OpenShift には準備ができていないノードとしてマニフェストが表示されます。 ノードとしてプロビジョニングされたフェーズでは、マシンは正常な状態を維持します。

VM が再び使用可能になると、準備完了に戻ります

トラブルシューティング

ノードが準備未完了状態になり、基になる VM の割り当てが解除された

VM の割り当てが解除された後に長時間にわたってノードが準備されていない状態になった場合は、そのノードを削除するか、対応する OpenShift machine オブジェクトを削除してみてください。

スポット マシンが失敗した状態でスタックする

スポット VM を使用するマシン (OpenShift オブジェクト) がエラー状態でスタックしている場合は、手動で削除してみてください。 VM が存在しないために 403 が原因で削除できない場合は、マシンを編集し、ファイナライザーを削除します。