OpenShift(AWS)へのノード追加

はじめに

こんにちはサイオステクノロジーの小野です。前回はOpenShift AIの概要について簡単に説明しました。今回はOpenShiftのノードの追加方法について解説します。OpenShift AIを利用するためには、GPUノードを追加する必要があるのでしっかりと操作を覚えましょう。

OpenShift(AWS)について

OpenShiftはAmazon Web Services、Google Cloud Platform、IBM Cloud、Microsoft Azure のクラウド、vSphereなど多くのプラットフォーム上に簡単に構築することができます。AWS上で構築する際はEC2にノードがデプロイされるので、幅広いスペックを選べたり、簡単にサーバー移行が可能であったりといったメリットがあります。したがって、今回はAWS上にOpenShiftを構築してノードを追加します。

ノードの種類

マスターノード(コントロールプレーンノード)

Kubernetesクラスターの管理と制御を行う役割を持つノードです。Kubernetesの特徴である負荷分散や高可用性はマスターノードによって管理されます。

ワーカーノード

コンテナ化されたアプリケーションが動作するノードです。

インフラノード

ルーティングやロギング、モニタリングなどのインフラストラクチャサービスを実行するために専用で用意するノードです。ワーカーノードと分けることでワーカーノードが落ちた場合やアップデートする場合にインフラを保つことができます。ちなみにインフラノードという用語はOpenShiftのドキュメントではよく出てきますが、Kubernetesのドキュメントには登場しません。

ノードの管理

マシンセット(MachineSet)

定義された数の同一のマシン(ノード)を保持し、管理するためのリソースです。マシンセットは、特定の設定を持つマシン(ノード)のレプリカを作成し、所望のレプリカ数を維持します。マシンセットは、ノードのスケーリングや自動修復(失敗したノードの置き換え)を行うために使用されます。

マシンコンフィグ(MachineConfig)

マシンコンフィグはマシンの構成を定義します。マシンコンフィグを使用することでクラスター内のノードに対して一貫した構成を適用できます。

マシンコンフィグプール (MachineConfigPool)

マシンコンフィグプールは、特定のマシンコンフィグを適用するノードのグループを定義します。マシンコンフィグプールを使用すると、異なるタイプや設定を持つノードの集まりをより簡単に管理できます。例えば、一部のノードはGPUを搭載しているが、他のノードは搭載していない、といった場合に便利です。

AWSでのノードの追加手順

OpenShiftのノード追加の方法についてこれから解説します。マシンセットを設定することで簡単にノードの追加が可能です。なお、今回行う手順(高いインスタンス等を設定)では高額な利用料金が発生する場合があるのでご注意ください。

前提条件

  • OpenShiftをIPIで構築した直後の状態から操作します。
  • OpenShift:4.17.1
  • 構築する環境:AWS(amd64)
  • リージョン:us-east-2
  • クラスター名:ocp-test
  • cluster-admin権限があるユーザ操作

マシンセットの確認

コンソール画面のコンピュート > MachineSetsに移動します。

3つのマシンセットが存在することを確認します。

新規マシンセットの作成

MachineSetの作成を押します。

Red Hatのドキュメントに載っているサンプルを用いてマシンセットを作成します。

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: <infrastructure_id> 
  name: <infrastructure_id>-<role>-<zone> 
  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>-<zone> 
  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>-<zone> 
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/<role>: "" 
      providerSpec:
        value:
          ami:
            id: ami-046fe691f52a953f9 
          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 
            instanceType: m6i.large
            kind: AWSMachineProviderConfig
            placement:
              availabilityZone: <zone> 
              region: <region> 
            securityGroups:
              - filters:
                  - name: tag:Name
                    values:
                      - <infrastructure_id>-worker-sg 
            subnet:
              filters:
                - name: tag:Name
                  values:
                    - <infrastructure_id>-private-<zone> 
            tags:
              - name: kubernetes.io/cluster/<infrastructure_id> 
                value: owned
              - name: <custom_tag_name> 
                value: <custom_tag_value> 
            userDataSecret:
              name: worker-user-dataname: worker-user-data

サンプルの変更点

  • 基本的には既存のマシンセットを参考にして入力してください。
  • <infrastructure_id>:<クラスター名>-<ランダム文字列>
    • infrastructure_idは以下のコマンドで確認するか、既存のマシンセットのyamlを見て確認してください。
    • $ oc get infrastructure cluster -o jsonpath='{.status.infrastructureName}'
      ocp-test-sp9lv
      
  • <role>:worker
  • <region>:us-east-2
  • <zone>:us-east-2a(リージョンとは別なので注意)
  • metadata.name:マシンセットの名前(サンプルの通りに設定すると既存のマシンセットの名前と被ってエラーが出るので注意)
  • instanceType:g4dn.xlarge(今回はGPUノードを追加することを考えるのでGPU用のインスタンスタイプを選択)
  • securityGroupsのfliters:’tag:Name’
  • securityGroupsのvalues:<infrastructure_id>-node, <infrastructure_id>-lb(2つ設定する)
  • ami.id:ami-048d893cb41cbd3cf(インスタンスタイプに対応したAMI)
  • subnetのvalues:<infrastructure_id>-subnet-private-<zone>

変更後のyaml

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  labels:
    machine.openshift.io/cluster-api-cluster: ocp-test-sp9lv
  name: ocp-test-sp9lv-worker-us-east-2a-gpu
  namespace: openshift-machine-api
spec:
  replicas: 1
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: ocp-test-sp9lv
      machine.openshift.io/cluster-api-machineset: ocp-test-sp9lv-worker-us-east-2a
  template:
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: ocp-test-sp9lv
        machine.openshift.io/cluster-api-machine-role: worker
        machine.openshift.io/cluster-api-machine-type: worker 
        machine.openshift.io/cluster-api-machineset: ocp-test-sp9lv-worker-us-east-2a
    spec:
      metadata:
        labels:
          node-role.kubernetes.io/<role>: "" 
      providerSpec:
        value:
          ami:
            id: ami-048d893cb41cbd3cf
          apiVersion: awsproviderconfig.openshift.io/v1beta1
          blockDevices:
            - ebs:
                iops: 0
                volumeSize: 120
                volumeType: gp2
          credentialsSecret:
            name: aws-cloud-credentials
          deviceIndex: 0
          iamInstanceProfile:
            id: ocp-test-sp9lv-worker-profile 
          instanceType: g4dn.xlarge
          kind: AWSMachineProviderConfig
          placement:
            availabilityZone: us-east-2a
            region: us-east-2
          securityGroups:
            - filters:
                - name: 'tag:Name'
                  values:
                    - ocp-test-sp9lv-node
            - filters:
                - name: 'tag:Name'
                  values:
                    - ocp-test-sp9lv-lb 
          subnet:
            filters:
              - name: tag:Name
                values:
                  - ocp-test-sp9lv-subnet-private-us-east-2a
          tags:
            - name: kubernetes.io/cluster/ocp-test-sp9lv
              value: owned
          userDataSecret:
            name: worker-user-data

マシンセットの作成

サンプルの変更が完了したものを入力して作成を押します。

マシンセットが作成されたら、マシンの作成が始まるのでしばらく待ちます。

マシンセットのデプロイ

作成したMachineSetのMachineのメッセージで「Machine successfully created」が表示されたらマシン作成完了です。

作成したMachineSetのMachinesタブに移動して作成したMachineの欄にノードが表示されていて、ノードのステータスがReadyになっていればノードの追加完了です。

AWS画面での確認

AWSコンソールにログインし、リージョンをus-east-2に設定した後、EC2 > インスタンスのページを開きます。

OpenShiftのマシンセットを作成することで、自動的にEC2のインスタンスが作成されていることが確認できます。

[画像]

注意事項

  • AMIのアーキテクチャがx86_64であるかarm64であるかによって使えるインスタンスタイプが変わるので注意してください。
    • AMIのアーキテクチャ確認
      • $ aws ec2 describe-images --image-ids ami-048d893cb41cbd3cf --query "Images[*].{Architecture:Architecture}"
        [
          {
            "Architecture": "x86_64"
          }
        ]
    • インスタンスタイプが対応しているアーキテクチャ確認
      • $ aws ec2 describe-instance-types --region us-east-2 --instance-types g4dn.xlarge --query "InstanceTypes[*].ProcessorInfo.SupportedArchitectures"
        [
          [
            "x86_64"
          ]
        ]
  • AMIの起動モードがUEFIであるかlegacy-biosであるかによっても使えるインスタンスタイプが変わるので注意してください。
    • AMIの起動モード確認
      • $ aws ec2 describe-images --image-ids ami-048d893cb41cbd3cf --query "Images[*].BootMode"
        [
          "legacy-bios"
        ]
        
    • インスタンスタイプの対応している起動モード確認
      • $ aws ec2 describe-instance-types --region us-east-2 --instance-types g4dn.xlarge --query "InstanceTypes[*].SupportedBootModes"
        [
            [
                "legacy-bios",
                "uefi"
            ]
        ]
        

最後に

AWS上にOpenShiftを構築してマシンセットを作成することで、GPUノードの追加ができました。以上の手順を参考にしてノード追加を行ってみてください。

最後に重要な注意事項として、GPUノードを追加しましたが、今の段階だとまだGPUがノードに認識されていません。したがってGPUを用いて機械学習を行うことができません。次回はノードにGPUを認識させるためにNode Feature Discovery OperatorとNVIDIA Operatorを導入する方法について解説します。お楽しみに。

参考

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です