第2章 Machine API を使用したコンピュートマシンの管理
2.1. AWS でコンピュートマシンセットを作成する
Amazon Web Services (AWS) で OpenShift Container Platform クラスターの特定の目的を果たすように異なるコンピュートマシンセットを作成することができます。たとえば、インフラストラクチャーマシンセットおよび関連マシンを作成して、サポートするワークロードを新しいマシンに移動できます。
高度なマシン管理およびスケーリング機能は、Machine API が動作しているクラスターでのみ使用できます。user-provisioned infrastructure を持つクラスターでは、Machine API を使用するために追加の検証と設定が必要です。
インフラストラクチャープラットフォームタイプが none
のクラスターでは、Machine API を使用できません。この制限は、クラスターに接続されている計算マシンが、この機能をサポートするプラットフォームにインストールされている場合でも適用されます。このパラメーターは、インストール後に変更することはできません。
クラスターのプラットフォームタイプを表示するには、以下のコマンドを実行します。
$ oc get infrastructure cluster -o jsonpath='{.status.platform}'
2.1.1. AWS 上のコンピュートマシンセットカスタムリソースのサンプル YAML
このサンプル YAML は、Amazon Web Services (AWS) Local Zone の us-east-1a
で実行され、node-role.kubernetes.io/<role>: ""
というラベルが付けられたノードを作成するコンピュートマシンセットを定義します。
このサンプルでは、<infrastructure_id>
はクラスターのプロビジョニング時に設定したクラスター ID に基づくインフラストラクチャー ID であり、<role>
は追加するノードラベルです。
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1 name: <infrastructure_id>-<role>-<zone> 2 namespace: openshift-machine-api spec: replicas: 1 selector: matchLabels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 3 machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<zone> 4 template: metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 5 machine.openshift.io/cluster-api-machine-role: <role> 6 machine.openshift.io/cluster-api-machine-type: <role> 7 machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<zone> 8 spec: metadata: labels: node-role.kubernetes.io/<role>: "" 9 providerSpec: value: ami: id: ami-046fe691f52a953f9 10 apiVersion: machine.openshift.io/v1beta1 blockDevices: - ebs: iops: 0 volumeSize: 120 volumeType: gp2 credentialsSecret: name: aws-cloud-credentials deviceIndex: 0 iamInstanceProfile: id: <infrastructure_id>-worker-profile 11 instanceType: m6i.large kind: AWSMachineProviderConfig placement: availabilityZone: <zone> 12 region: <region> 13 securityGroups: - filters: - name: tag:Name values: - <infrastructure_id>-worker-sg 14 subnet: filters: - name: tag:Name values: - <infrastructure_id>-private-<zone> 15 tags: - name: kubernetes.io/cluster/<infrastructure_id> 16 value: owned - name: <custom_tag_name> 17 value: <custom_tag_value> 18 userDataSecret: name: worker-user-data
- 1 3 5 11 14 16
- クラスターのプロビジョニング時に設定したクラスター ID を基にするインフラストラクチャー ID を指定します。OpenShift CLI がインストールされている場合は、以下のコマンドを実行してインフラストラクチャー ID を取得できます。
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructure cluster
- 2 4 8
- インフラストラクチャー ID、ロールノードラベル、およびゾーンを指定します。
- 6 7 9
- 追加するロールノードラベルを指定します。
- 10
- OpenShift Container Platform ノードの AWS ゾーンに有効な Red Hat Enterprise Linux CoreOS (RHCOS) Amazon Machine Image (AMI) を指定します。AWS Marketplace イメージを使用する場合は、AWS Marketplace から OpenShift Container Platform サブスクリプションを完了して、リージョンの AMI ID を取得する必要があります。
$ oc -n openshift-machine-api \ -o jsonpath='{.spec.template.spec.providerSpec.value.ami.id}{"\n"}' \ get machineset/<infrastructure_id>-<role>-<zone>
- 17 18
- オプション: クラスターのカスタムタグデータを指定します。たとえば、
name:value
のペアであるEmail:admin-email@example.com
を指定して、管理者の連絡先電子メールアドレスを追加できます。注記カスタムタグは、インストール中に
install-config.yml
ファイルで指定することもできます。install-config.yml
ファイルとマシンセットに同じ名前
のデータを持つタグが含まれている場合、マシンセットのタグの値がinstall-config.yml
ファイルのタグの値よりも優先されます。 - 12
- ゾーン (例:
us-east-1a
) を指定します。 - 13
- リージョン (例:
us-east-1
) を指定します。 - 15
- インフラストラクチャー ID とゾーンを指定します。
2.1.2. コンピュートマシンセットの作成
インストールプログラムによって作成されるコンピュートセットセットに加えて、独自のマシンセットを作成して、選択した特定のワークロードのマシンコンピューティングリソースを動的に管理できます。
前提条件
- OpenShift Container Platform クラスターをデプロイしている。
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
パーミッションを持つユーザーとして、oc
にログインする。
手順
コンピュートマシンセットのカスタムリソース (CR) サンプルを含む新しい YAML ファイルを作成し、
<file_name>.yaml
という名前を付けます。<clusterID>
および<role>
パラメーターの値を設定していることを確認します。オプション: 特定のフィールドに設定する値がわからない場合は、クラスターから既存のコンピュートマシンセットを確認できます。
クラスター内のコンピュートマシンセットをリスト表示するには、次のコマンドを実行します。
$ oc get machinesets -n openshift-machine-api
出力例
NAME DESIRED CURRENT READY AVAILABLE AGE agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m agl030519-vplxk-worker-us-east-1c 1 1 1 1 55m agl030519-vplxk-worker-us-east-1d 0 0 55m agl030519-vplxk-worker-us-east-1e 0 0 55m agl030519-vplxk-worker-us-east-1f 0 0 55m
特定のコンピュートマシンセットカスタムリソース (CR) 値を表示するには、以下のコマンドを実行します。
$ oc get machineset <machineset_name> \ -n openshift-machine-api -o yaml
出力例
apiVersion: machine.openshift.io/v1beta1 kind: MachineSet metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1 name: <infrastructure_id>-<role> 2 namespace: openshift-machine-api spec: replicas: 1 selector: matchLabels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role> template: metadata: labels: machine.openshift.io/cluster-api-cluster: <infrastructure_id> machine.openshift.io/cluster-api-machine-role: <role> machine.openshift.io/cluster-api-machine-type: <role> machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role> spec: providerSpec: 3 ...
次のコマンドを実行して
MachineSet
CR を作成します。$ oc create -f <file_name>.yaml
- 他のアベイラビリティーゾーンでコンピュートマシンセットが必要な場合、このプロセスを繰り返して追加のコンピュートマシンセットを作成します。
検証
次のコマンドを実行して、コンピュートマシンセットのリストを表示します。
$ oc get machineset -n openshift-machine-api
出力例
NAME DESIRED CURRENT READY AVAILABLE AGE agl030519-vplxk-infra-us-east-1a 1 1 1 1 11m agl030519-vplxk-worker-us-east-1a 1 1 1 1 55m agl030519-vplxk-worker-us-east-1b 1 1 1 1 55m agl030519-vplxk-worker-us-east-1c 1 1 1 1 55m agl030519-vplxk-worker-us-east-1d 0 0 55m agl030519-vplxk-worker-us-east-1e 0 0 55m agl030519-vplxk-worker-us-east-1f 0 0 55m
新しいコンピュートマシンセットが利用可能になると、
DESIRED
とCURRENT
の値が一致します。コンピュートマシンセットが使用できない場合は、数分待ってからコマンドを再実行してください。
2.1.3. マシンセットを使用した Elastic Fabric Adapter インスタンスの配置グループへのマシンの割り当て
既存の AWS 配置グループ内の Elastic Fabric Adapter (EFA) インスタンスにマシンをデプロイするようにマシンセットを設定できます。
EFA インスタンスには配置グループは必要なく、EFA の設定以外の目的にも配置グループを使用できます。この例では、両方を使用して、指定された配置グループ内のマシンのネットワークパフォーマンスを向上できる設定を示します。
前提条件
AWS コンソールで配置グループを作成しました。
注記作成する配置グループのタイプの ルールと制限が、意図した使用例と互換性があることを確認してください。
手順
- テキストエディターで、既存のマシンセットの YAML ファイルを開くか、新しいマシンセットを作成します。
providerSpec
フィールドの下に次の行を編集します。apiVersion: machine.openshift.io/v1beta1 kind: MachineSet # ... spec: template: spec: providerSpec: value: instanceType: <supported_instance_type> 1 networkInterfaceType: EFA 2 placement: availabilityZone: <zone> 3 region: <region> 4 placementGroupName: <placement_group> 5 # ...
検証
AWS コンソールで、マシンセットが作成したマシンを見つけて、マシンのプロパティーで次のことを確認します。
-
配置グループフィールドには、マシンセットの
placementGroupName
パラメーターに指定した値が含まれます。 - インターフェイスタイプフィールドは、EFA を使用することを示します。
-
配置グループフィールドには、マシンセットの
2.1.4. Amazon EC2 インスタンスメタデータサービスのマシンセットオプション
マシンセットを使用して、Amazon EC2 インスタンスメタデータサービス (IMDS) の特定のバージョンを使用するマシンを作成できます。マシンセットは、IMDSv1 と IMDSv2 の両方を使用できるマシン、または IMDSv2 の使用を必要とするマシンを作成できます。
IMDSv2 の使用は、OpenShift Container Platform バージョン 4.7 以降で作成された AWS クラスターでのみサポートされます。
好みの IMDS 設定で新しいコンピュートマシンを展開するには、適切な値を使用してマコンピュートシンセット YAML ファイルを作成します。マシンセットの拡張時に、既存のマシンセットを編集して、希望する IMDS 設定で新しいマシンを作成することもできます。
IMDSv2 を必要とするマシンを作成するようにマシンセットを設定する前に、AWS メタデータサービスと相互作用するすべてのワークロードが IMDSv2 をサポートしていることを確認してください。
2.1.4.1. マシンセットを使用した IMDS の設定
マシンのマシンセット YAML ファイルで metadataServiceOptions.authentication
の値を追加または編集することで、IMDSv2 の使用を要求するかどうかを指定できます。
前提条件
- IMDSv2 を使用するには、AWS クラスターが OpenShift Container Platform バージョン 4.7 以降で作成されている必要があります。
手順
providerSpec
フィールドの下に次の行を追加または編集します。providerSpec: value: metadataServiceOptions: authentication: Required 1
- 1
- IMDSv2 を要求するには、パラメーター値を
Required
に設定します。IMDSv1 と IMDSv2 の両方の使用を許可するには、パラメーター値をOptional
に設定します。値が指定されていない場合、IMDSv1 と IMDSv2 の両方が許可されます。
2.1.5. マシンを専有インスタンス (Dedicated Instance) としてデプロイするマシンセット
マシンを専有インスタンス (Dedicated Instance) としてデプロイする AWS で実行されるマシンセットを作成できます。専有インスタンス (Dedicated Instance) は、単一のお客様専用のハードウェア上の仮想プライベートクラウド (VPC) で実行されます。これらの Amazon EC2 インスタンスは、ホストのハードウェアレベルで物理的に分離されます。インスタンスが単一つの有料アカウントにリンクされている別の AWS アカウントに属する場合でも、専有インスタンス (Dedicated Instance) の分離が生じます。ただし、専用ではない他のインスタンスは、それらが同じ AWS アカウントに属する場合は、ハードウェアを専有インスタンス (Dedicated Instance) と共有できます。
パブリックテナンシーまたは専用テナンシーのいずれかを持つインスタンスが、Machine API によってサポートされます。パブリックテナンシーを持つインスタンスは、共有ハードウェア上で実行されます。パブリックテナンシーはデフォルトのテナンシーです。専用のテナンシーを持つインスタンスは、単一テナントのハードウェアで実行されます。
2.1.5.1. マシンセットの使用による専有インスタンス (Dedicated Instance) の作成
Machine API 統合を使用して、専有インスタンス (Dedicated Instance) によってサポートされるマシンを実行できます。マシンセット YAML ファイルの tenancy
フィールドを設定し、AWS で専有インスタンス (Dedicated Instance) を起動します。
手順
providerSpec
フィールドに専用テナンシーを指定します。providerSpec: placement: tenancy: dedicated
2.1.6. マシンを Spot インスタンスとしてデプロイするマシンセット
マシンを保証されていない Spot インスタンスとしてデプロイする AWS で実行されるコンピュートマシンセットを作成して、コストを節約できます。Spot インスタンスは未使用の AWS EC2 容量を使用し、On-Demand インスタンスよりもコストが低くなります。Spot インスタンスは、バッチやステートレス、水平的に拡張可能なワークロードなどの割り込みを許容できるワークロードに使用することができます。
AWS EC2 は Spot インスタンスをいつでも終了できます。AWS は、中断の発生時にユーザーに警告を 2 分間表示します。OpenShift Container Platform は、AWS が終了に関する警告を発行する際に影響を受けるインスタンスからワークロードを削除し始めます。
以下の理由により、Spot インスタンスを使用すると中断が生じる可能性があります。
- インスタンス価格は最大価格を超えます。
- Spot インスタンスの需要は増大します。
- Spot インスタンスの供給は減少します。
AWS がインスタンスを終了すると、Spot インスタンスノードで実行される終了ハンドラーによりマシンリソースが削除されます。コンピュートマシンセットの replicas
の量を満たすために、コンピュートマシンセットは Spot インスタンスを要求するマシンを作成します。
2.1.6.1. コンピュートマシンセットの使用による Spot インスタンスの作成
spotMarketOptions
をコンピュートマシンセットの YAML ファイルに追加して、AWS で Spot インスタンスを起動できます。
手順
providerSpec
フィールドの下に以下の行を追加します。providerSpec: value: spotMarketOptions: {}
オプションで、Spot インスタンスのコストを制限するために、
spotMarketOptions.maxPrice
フィールドを設定できます。たとえば、maxPrice: '2.50'
を設定できます。maxPrice
が設定されている場合、この値は毎時の最大 Spot 価格として使用されます。これを設定しないと、デフォルトで最大価格として On-Demand インスタンス価格までチャージされます。注記デフォルトの On-Demand 価格を
maxPrice
値として使用し、Spot インスタンスの最大価格を設定しないことが強く推奨されます。
2.1.7. 既存の OpenShift Container Platform クラスターへの GPU ノードの追加
デフォルトのコンピュートマシンセット設定をコピーおよび変更して、AWS EC2 クラウドプロバイダー用の GPU 対応マシンセットとマシンを作成できます。
サポートされているインスタンスタイプの詳細は、以下の NVIDIA ドキュメントを参照してください。
手順
次のコマンドを実行して、既存のノード、マシン、およびマシンセットを表示します。各ノードは、特定の AWS リージョンと OpenShift Container Platform ロールを持つマシン定義のインスタンスであることに注意してください。
$ oc get nodes
出力例
NAME STATUS ROLES AGE VERSION ip-10-0-52-50.us-east-2.compute.internal Ready worker 3d17h v1.29.4 ip-10-0-58-24.us-east-2.compute.internal Ready control-plane,master 3d17h v1.29.4 ip-10-0-68-148.us-east-2.compute.internal Ready worker 3d17h v1.29.4 ip-10-0-68-68.us-east-2.compute.internal Ready control-plane,master 3d17h v1.29.4 ip-10-0-72-170.us-east-2.compute.internal Ready control-plane,master 3d17h v1.29.4 ip-10-0-74-50.us-east-2.compute.internal Ready worker 3d17h v1.29.4
次のコマンドを実行して、
openshift-machine-api
namespace に存在するマシンとマシンセットを表示します。各コンピュートマシンセットは、AWS リージョン内の異なるアベイラビリティーゾーンに関連付けられています。インストーラーは、アベイラビリティゾーン全体でコンピュートマシンの負荷を自動的に分散します。$ oc get machinesets -n openshift-machine-api
出力例
NAME DESIRED CURRENT READY AVAILABLE AGE preserve-dsoc12r4-ktjfc-worker-us-east-2a 1 1 1 1 3d11h preserve-dsoc12r4-ktjfc-worker-us-east-2b 2 2 2 2 3d11h
次のコマンドを実行して、
openshift-machine-api
namespace に存在するマシンを表示します。現時点では、マシンセットごとに 1 つのコンピュートマシンしかありませんが、特定のリージョンとゾーンにノードを追加するようにコンピュートマシンセットをスケーリングすることができます。$ oc get machines -n openshift-machine-api | grep worker
出力例
preserve-dsoc12r4-ktjfc-worker-us-east-2a-dts8r Running m5.xlarge us-east-2 us-east-2a 3d11h preserve-dsoc12r4-ktjfc-worker-us-east-2b-dkv7w Running m5.xlarge us-east-2 us-east-2b 3d11h preserve-dsoc12r4-ktjfc-worker-us-east-2b-k58cw Running m5.xlarge us-east-2 us-east-2b 3d11h
次のコマンドを実行して、既存のコンピュート
MachineSet
定義のいずれかのコピーを作成し、結果を JSON ファイルに出力します。これは、GPU 対応のコンピュートマシンセット定義の基礎となります。$ oc get machineset preserve-dsoc12r4-ktjfc-worker-us-east-2a -n openshift-machine-api -o json > <output_file.json>
JSON ファイルを編集し、新しい
MachineSet
定義に次の変更を加えます。-
worker
をgpu
に置き換えます。これが新しいマシンセットの名前になります。 新しい
MachineSet
定義のインスタンスタイプを、NVIDIA Tesla T4 GPU を含むg4dn
に変更します。AWSg4dn
インスタンスタイプの詳細は、Accelerated Computing を参照してください。$ jq .spec.template.spec.providerSpec.value.instanceType preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json "g4dn.xlarge"
<output_file.json>
ファイルはpreserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json
として保存されます。
-
preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json
の次のフィールドを更新します。-
.metadata.name
をgpu
を含む名前に変更します。 -
.spec.selector.matchLabels["machine.openshift.io/cluster-api-machineset"]
を新しい.metadata.name
に一致させます。 -
.spec.template.metadata.labels["machine.openshift.io/cluster-api-machineset"]
を新しい.metadata.name
に一致させます。 -
.spec.template.spec.providerSpec.value.instanceType
tog4dn.xlarge
.
-
変更を確認するには、次のコマンドを実行して、元のコンピュート定義と新しい GPU 対応ノード定義の
diff
を実行します。$ oc -n openshift-machine-api get preserve-dsoc12r4-ktjfc-worker-us-east-2a -o json | diff preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json -
出力例
10c10 < "name": "preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a", --- > "name": "preserve-dsoc12r4-ktjfc-worker-us-east-2a", 21c21 < "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a" --- > "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-us-east-2a" 31c31 < "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a" --- > "machine.openshift.io/cluster-api-machineset": "preserve-dsoc12r4-ktjfc-worker-us-east-2a" 60c60 < "instanceType": "g4dn.xlarge", --- > "instanceType": "m5.xlarge",
次のコマンドを実行して、定義から GPU 対応のコンピュートマシンセットを作成します。
$ oc create -f preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a.json
出力例
machineset.machine.openshift.io/preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a created
検証
次のコマンドを実行して、作成したマシンセットを表示します。
$ oc -n openshift-machine-api get machinesets | grep gpu
MachineSet レプリカ数は
1
に設定されているため、新しいMachine
オブジェクトが自動的に作成されます。出力例
preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a 1 1 1 1 4m21s
次のコマンドを実行して、マシンセットが作成した
Machine
オブジェクトを表示します。$ oc -n openshift-machine-api get machines | grep gpu
出力例
preserve-dsoc12r4-ktjfc-worker-gpu-us-east-2a running g4dn.xlarge us-east-2 us-east-2a 4m36s
ノードの namespace を指定する必要がないことに注意してください。ノード定義はクラスタースコープ指定されています。
2.1.8. Node Feature Discovery Operator のデプロイ
GPU 対応ノードを作成したら、スケジュールできるように GPU 対応ノードを検出する必要があります。これを行うには、Node Feature Discovery (NFD) Operator をインストールします。NFD Operator は、ノード内のハードウェアデバイス機能を識別します。OpenShift Container Platform で使用できるようにインフラストラクチャーノードのハードウェアリソースを識別してカタログ化するという一般的な問題を解決します。
手順
- OpenShift Container Platform コンソールの OperatorHub から Node Feature Discovery Operator をインストールします。
-
NFD Operator を OperatorHub にインストールした後、インストールされた Operator リストから Node Feature Discovery を選択し、Create instance を選択します。これにより、
openshift-nfd
namespace に、nfd-master
Pod とnfd-worker
Pod (各コンピュートノードに 1 つのnfd-worker
Pod) がインストールされます。 次のコマンドを実行して、Operator がインストールされ、実行されていることを確認します。
$ oc get pods -n openshift-nfd
出力例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-8646fcbb65-x5qgk 2/2 Running 7 (8h ago) 1d
- コンソールでインストール済みの Operator へ移動し、Create Node Feature Discovery を選択します。
-
Create を選択して、NFD カスタムリソースをビルドします。これにより、OpenShift Container Platform ノードのハードウェアリソースをポーリングしてカタログ化する NFD Pod が
openshift-nfd
namespace に作成されます。
検証
ビルドが成功したら、次のコマンドを実行して、各ノードで NFD Pod が実行されていることを確認します。
$ oc get pods -n openshift-nfd
出力例
NAME READY STATUS RESTARTS AGE nfd-controller-manager-8646fcbb65-x5qgk 2/2 Running 7 (8h ago) 12d nfd-master-769656c4cb-w9vrv 1/1 Running 0 12d nfd-worker-qjxb2 1/1 Running 3 (3d14h ago) 12d nfd-worker-xtz9b 1/1 Running 5 (3d14h ago) 12d
NFD Operator は、ベンダー PCI ID を使用してノード内のハードウェアを識別します。NVIDIA は PCI ID
10de
を使用します。次のコマンドを実行して、NFD Operator によって検出された NVIDIA GPU を表示します。
$ oc describe node ip-10-0-132-138.us-east-2.compute.internal | egrep 'Roles|pci'
出力例
Roles: worker feature.node.kubernetes.io/pci-1013.present=true feature.node.kubernetes.io/pci-10de.present=true feature.node.kubernetes.io/pci-1d0f.present=true
GPU 対応ノードのノード機能リストに
10de
が表示されます。これは、NFD Operator が GPU 対応の MachineSet からノードを正しく識別したことを意味します。