作成済みのROSA HCPクラスターに新しいMachinepoolを追加する方法

# 1. はじめに
検証の際に、作成済みのROSA HCPクラスターにMachinepoolを追加する機会がありました。
その際、ROSA HCPでのMachinepool追加方法が、ROSA Classicでの方法と微妙に異なっていたので、まとめました。
なお、現時点（2024年12月）の[RedHat公式ドキュメント](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_on_aws/4/html-single/cluster_administration/index#manage-nodes-using-machine-pools)の内容はROSA Classicベースで記載されており、ROSA HCP環境には当てはまらない点がいくつかありました。そちらについても説明しております。

※この記事の内容は2024年12月現在の情報であり、下記の製品リリースに基づいています。
Red Hat OpenShift Service on AWS with Hosted Control Planes v4.14.37

# 2. 目次
- [1. はじめに](#1-はじめに)
- [2. 目次](#2-目次)
- [3. そもそもMachinepoolとは](#3-そもそもmachinepoolとは)
  - [3.1. Machinepoolの概要](#31-machinepoolの概要)
  - [3.2. Machinesetとの違い](#32-machinesetとの違い)
  - [3.3. ところが、ROSA HCPだと・・・](#33-ところがrosa-hcpだと)
- [4. ROSA HCPにMachinepoolを追加する方法](#4-rosa-hcpにmachinepoolを追加する方法)
  - [4.1. CLIでの追加方法](#41-cliでの追加方法)
  - [4.2. OCM（Openshift Cluster Manager）での追加方法](#42-ocmopenshift-cluster-managerでの追加方法)
- [5.ドキュメントに記載の内容（Classic仕様）との相違点](#5ドキュメントに記載の内容classic仕様との相違点)
  - [5.1. CLIで追加する方法について](#51-cliで追加する方法について)
    - [ドキュメントの内容](#ドキュメントの内容)
    - [HCP環境での検証結果](#hcp環境での検証結果)
  - [5.2. OCMで追加する方法について](#52-ocmで追加する方法について)
    - [ドキュメントの内容](#ドキュメントの内容-1)
    - [HCP環境での検証結果](#hcp環境での検証結果-1)
- [6. まとめ](#6-まとめ)

# 3. そもそもMachinepoolとは

## 3.1. Machinepoolの概要
- Machinepoolとは、クラスター内の同じ設定を持つコンピュートノードのグループのことです。ここでいう設定とは、インスタンスタイプ、デプロイされるAZ、スケーリング、ノードラベル、テイントなどのことです。
- ROSAでWorker Nodeを増やそうと思ったら、Machinepool内のWorker Nodeを追加する、もしくは新しい設定のMachinepoolを作成するという形をとることになります。

## 3.2. Machinesetとの違い
- OpenshiftにはMachinesetという概念があります。MachinesetとMachinepoolの違いについて、RedHatのドキュメントには以下のように記載されています。
  >Machinepoolは、Machinesetを計算するための上位レベルの構造です。Machinepoolは、アベイラビリティーゾーン全体で同じ設定のクローンがすべて含まれるMachinesetを作成します。
  
- つまり、Machinesetをさらにグループ化したものがMachinepoolというイメージでしょうか。Machinesetもまた、クラスター内の同じ設定を持つコンピュートノードのグループのことですが、こちらは１つのゾーンに紐づいて存在しています。一方でMachinepoolは、各ゾーンに存在する同じ設定のMachinesetを合わせた概念であるため、複数のソーンにまたがって存在しています。例えば、us-east1cのMachineset、1dのMachineset、1eのMachinesetを３つ合わせて一つのMachinepoolになります。(Classicの場合。詳細は後述)
- オプションでひとつのゾーンのみにMachinepoolを作成することも出来ますが、multi-az構成のクラスターの場合、全てのゾーンにまたがって存在させるのがデフォルトです。single-az構成のクラスターの場合はMachinepoolも一つのゾーンのみで構成されます。(Classicの場合。詳細は後述)
- また、MachinesetがOpenshiftの概念であるのに対し、MachinepoolはROSA上の概念です。そのため、以下のような違いがあります。
  - Machinesetは`oc`コマンドで操作。Machinepoolは`rosa`コマンドで操作。
  - ROSA環境でMachinesetの追加や編集をユーザーが直接行うことは不可能。リストの取得は可能。
  - MachinesetのリストにはInfra Nodeも含まれる。MachinepoolのリストにはInfra Nodeは含まれない。（ROSAの場合、Infra Nodeはユーザーの管理外であるため）
- こちらについては、以下の記事でより詳しく説明されています。
[AWS上でのマネージド OpenShift サービス ROSAの提供開始 / 使い方](https://rheb.hatenablog.com/entry/2021/06/07/AWS%E4%B8%8A%E3%81%A7%E3%81%AE%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89_OpenShift_%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9_ROSA_%28%E3%82%8D%E3%81%95%29_%E3%81%AE%E6%8F%90%E4%BE%9B%E9%96%8B%E5%A7%8B)
  
## 3.3. ところが、ROSA HCPだと・・・
- ここまでROSAのMachinepoolという概念について、公式ドキュメントをもとに整理してみましたが、ROSA HCP環境でMachinepoolを作成してみたところ、上記に記載した仕様と異なる点がいくつかありました。
- 具体的には、これまでmulti-az環境のMachinepoolはデフォルトですべてのAZにまたがるものであり、オプションでシングルAZにもできる、とご説明してきたのですが、**ROSA HCPでのMachinepoolはむしろ一つのAZに紐づける設定がデフォルトになっており、複数のAZにまたがって存在させる方法があるのかどうかが不明**という状況です。


# 4. ROSA HCPにMachinepoolを追加する方法
ドキュメントに記載の内容（ROSA Classicの仕様）とROSA HCPの仕様を比較する前に、まずMachinepoolの追加方法を簡単にご説明します。
## 4.1. CLIでの追加方法
- rosa CLIで以下のコマンドを実行します。
  ```
  rosa create machinepool --cluster=<cluster-name> \
                          --name=<machine_pool_id> \
                          --replicas=<replica_count> \
                          --instance-type=<instance_type> \
                          --labels=<key>=<value>,<key>=<value> \
                          --taints=<key>=<value>:<effect>,<key>=<value>:<effect> \
                          --use-spot-instances \
                          --spot-max-price=<price> \
                          --disk-size=<disk_size> \
                          --availability-zone=<availability_zone_name> \
                          --additional-security-group-ids <sec_group_id> \
                          --subnet <subnet_id>
  ```
  - このうち、 下記３つの引数以外はすべてオプションですので、デフォルト設定でよければ省略が可能です。
    - `--cluster`：クラスター名
    - `--name`：Machinepoolにつける名前
    - `--replicas`：プロビジョニングするコンピュートノードの数
  - こちらは、オートスケーリングしないMachinepoolを作成するコマンドです。オートスケーリングさせる場合、`--replicas`ではなく、`min-replicas`と`--max-replicas`を引数として指定する必要があります。
  - 引数の内容やデフォルト設定の詳細は、[公式ドキュメント](https://docs.redhat.com/ja/documentation/red_hat_openshift_service_on_aws/4/html-single/cluster_administration/index#creating_machine_pools_cli_rosa-managing-worker-nodes)をご参照ください。

## 4.2. OCM（Openshift Cluster Manager）での追加方法
1. [OpenShift Cluster Manager](https://console.redhat.com/openshift/overview)に移動し、サイドバーの`Cluster List`をクリックします。
2. 追加したいクラスターを選択します。
3. `Machine pools`タブで、`Add machine pool`ボタンをクリックします。
4. 追加したいMachinepoolの各設定項目を入力していきます。
   Machine pool name、Private subnet name、Compute node instance type、Compute node countは必須項目です。![add_machinepool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3808402/b6899c12-8246-f1d4-e1ec-2e087e3f5ead.png)
5. `Add machine pool`をクリックしてマシンプールを作成します。

# 5.ドキュメントに記載の内容（Classic仕様）との相違点
## 5.1. CLIで追加する方法について
### ドキュメントの内容
- 上記の「4.1. CLIでの追加方法」に記載した通り、CLIでMachinepoolを追加する際、`--replicas`という引数を使用してプロビジョニングするコンピュートノードの数を指定するのですが、こちらについて、ドキュメントには以下のように記されています。
  >単一アベイラビリティーゾーンを使用して ROSAをデプロイしている場合は、ゾーンのMachinepoolにプロビジョニングするコンピュートノードの数を定義します。**複数のアベイラビリティーゾーンを使用してクラスターをデプロイしている場合は、全ゾーンでプロビジョニングするコンピュートノードの数を定義し、その数は3の倍数である必要があります**。

- multi-az構成の場合、--replicasで指定するコンピュートノードの数は３の倍数でなければならないと記載されています。
### HCP環境での検証結果
- 使用している環境はmulti-az環境なのですが、`--replicas=1`でも問題なくMachinepoolの追加が出来ました。
  ※workers-3というMachinepoolを新規で追加
  ```
  $ rosa create machinepool --cluster=xxxxx --name=workers-3 --replicas=1 --instance-type=r4.xlarge --region us-east-1
  I: Checking available instance types for machine pool 'workers-3'
  I: Machine pool 'workers-3' created successfully on hosted cluster 'xxxxx'
  I: To view the machine pool details, run 'rosa describe machinepool --cluster xxxxx --machinepool workers-3'
  I: To view all machine pools, run 'rosa list machinepools --cluster xxxxx'

  $ rosa list machinepool --cluster=xxxxx --region us-east-1
  ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS    TAINTS    AVAILABILITY ZONE  SUBNET                    DISK SIZE  VERSION  AUTOREPAIR
  workers-3  No           1/1       r4.xlarge                          us-east-1d         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes
  workers-0  No           1/1       r4.xlarge                          us-east-1d         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes
  workers-1  No           1/1       r4.xlarge                          us-east-1e         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes
  workers-2  No           1/1       r4.xlarge                          us-east-1c         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes

  ```

- また、`--replicas=3`で追加してみても、３つのAZにまたがったMachinepoolが作成されるわけではなく、１つのAZに３つのコンピュートノードを持つMachinepoolになりました。
  ※workers-3というMachinepoolを新規で追加
  ```
  $ rosa create machinepool --cluster=xxxxx --name=workers-3 --replicas=3 --instance-type=r4.xlarge --region us-east-1
  I: Checking available instance types for machine pool 'workers-3'
  I: Machine pool 'workers-3' created successfully on hosted cluster 'xxxxx'
  I: To view the machine pool details, run 'rosa describe machinepool --cluster xxxxx --machinepool workers-3'
  I: To view all machine pools, run 'rosa list machinepools --cluster xxxxx'

  $ rosa list machinepool --cluster=xxxxx --region us-east-1
  ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS    TAINTS    AVAILABILITY ZONE  SUBNET                    DISK SIZE  VERSION  AUTOREPAIR
  workers-3  No           3/3       r4.xlarge                          us-east-1d         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes
  workers-0  No           1/1       r4.xlarge                          us-east-1d         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes
  workers-1  No           1/1       r4.xlarge                          us-east-1e         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes
  workers-2  No           1/1       r4.xlarge                          us-east-1c         subnet-xxxxxxxxxxxxxxxxx  300 GiB    4.14.37  Yes

  ```

- ちなみに、`--replicas`の引数に２つ以上のAZを指定することはできませんでした。
- つまりHCP環境の場合、multi-AZ構成でも引数に３の倍数を指定する必要はなく、むしろCLIでは複数のAZにまたがるMachinepoolは作成ができないようです。

## 5.2. OCMで追加する方法について
### ドキュメントの内容
- ドキュメントには、以下のように記載されています。
  
  >(オートスケーリングを有効化する場合)複数のアベイラビリティーゾーンを使用してクラスターをデプロイした場合は、Minimum nodes per zone および Maximum nodes per zone を設定します。これは、ゾーンごとの最小および最大のコンピュート制限を定義します。

  >(オートスケーリングを有効化しない場合)複数のアベイラビリティーゾーンを使用してクラスターをデプロイした場合は、ドロップダウンメニューからコンピュートノードの数 (ゾーンごと) を選択します。これは、ゾーンごとにMachinepoolにプロビジョニングするコンピュートノードの数を定義します。

- どちらの場合も、**ゾーンごと**のコンピュートノードの数を定義するようにという説明があります。つまり、３と指定した場合、全ゾーンに３つずつコンピュートノードが作成されるという理解です。
  
### HCP環境での検証結果
- OCMでMachinepoolを追加する際は、上記「4.2. OCMでの追加方法」でご紹介したとおり画面内の各設定値を入力してから、`Add machine pool`ボタンをクリックして作成することになります。
- その中の設定値の１つとして、`Private subnet name`という欄があるのですが、こちらはプルダウンで選択する形式になっており、最初から一つのAZしか選択できない仕様になっております。そのため、３つのAZにまたがったMachinepoolは作成しようがないかと思われます。
  
# 6. まとめ
以上のように、ROSA Classicにおいては、MachinepoolはすべてのAZにまたがって配置する仕様がデフォルトだったようなのですが、ROSA HCPの場合、むしろ複数のAZにまたがるように作成する方法が不明という状態です。
同じ設定のコンピュートノードを全AZに配置したい場合、同じ設定のMachinepoolをAZごとに１つずつ作成していくことになるのかと思われます。