IBM Power での シングルノードOpenShift インストール方法

# 前提情報

1ノードでMasterとWorkerの役割を兼用するOpenShiftの環境を構築します。  

[シングルノード構築のドキュメント](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.17/html/installing_on_a_single_node/installing-sno-with-ibmpower)を確認すると、IBM Power環境では、ネットワークインストールでの構築方法が記載されています。  
また、下記の記事も参考にしています。  

https://community.ibm.com/community/user/powerdeveloper/blogs/chongshi-zhang/2023/02/09/installing-sno-to-powervm#

## 構成

構築用の環境は、以下の図のようになっています。  

![sno.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/717ab1db-ae58-29c7-c759-6449d1d45156.png)

Bastionノード(踏み台ノード)は、DNSやTFTP、DHCPなどシングルノードOpenShiftをインストール・運用するために必要な機能を導入します。  
OpenShiftのCLIツールである `oc` コマンドもこちらのノードで実行します。

# Bastionノードのセットアップ

Bastionノードには、冒頭で記載したソフトウェア群をセットアップする必要があります。  
順を追って記載していきます。  

## Dnsmasqのインストール・設定

インストール時に必要な名前解決や、PXEの設定を行うために、Dnsmasqをインストールしセットアップします。  

`dnf install dnsmasq` コマンドでインストールします。  

```
[root@sno-bastion ~]# dnf install dnsmasq
サブスクリプション管理リポジトリーを更新しています。
Red Hat Enterprise Linux 9 for Power, little endian - AppStream (RPMs)                                                               17 kB/s | 4.5 kB     00:00
Red Hat Enterprise Linux 9 for Power, little endian - BaseOS (RPMs)                                                                  16 kB/s | 4.1 kB     00:00
依存関係が解決しました。
====================================================================================================================================================================
 パッケージ                     アーキテクチャー               バージョン                            リポジトリー                                             サイズ
====================================================================================================================================================================
インストール:
 dnsmasq                        ppc64le                        2.85-16.el9_4                         rhel-9-for-ppc64le-appstream-rpms                        353 k

トランザクションの概要
====================================================================================================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 353 k
インストール後のサイズ: 798 k
これでよろしいですか? [y/N]:

 ~ 省略 ~
```

Dnsmasqの設定ファイル `/etc/dnsmasq.conf` を編集します。  
以下、設定のサンプルです。  

```
[root@mz-t install]# cat /etc/dnsmasq.conf
#domain-needed
# don't send bogus requests out on the internets
bogus-priv
# enable IPv6 Route Advertisements
enable-ra
bind-dynamic
no-hosts
#  have your simple hosts expanded to domain
expand-hosts

interface=env3
# set your domain for expand-hosts ※OpenShiftのドメイン名を設定します。 後に記述するignitionファイルと記述を統一してください。
domain=sno.ocp.io
local=/sno.ocp.io/
address=/apps.sno.ocp.io/
server=9.9.9.9

addn-hosts=/etc/dnsmasq.d/addnhosts

##################################
# DHCP ※ 使用する環境のネットワークにしたがって設定してください。
##################################
dhcp-ignore=tag:!known
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

dhcp-range=192.168.217.214,static

dhcp-option=option:router,192.168.217.209
dhcp-option=option:netmask,255.255.255.248
dhcp-option=option:dns-server,192.168.217.211

dhcp-host=fa:a0:3f:ce:37:20,sno-core,192.168.217.214,infinite

###############################
# PXE
###############################
enable-tftp
tftp-root=/var/lib/tftpboot
dhcp-boot=boot/grub2/powerpc-ieee1275/core.elf
```

OpenShiftのインストールで利用する、api, api-int を名前解決できるように `/etc/dnsmasq.d/addnhosts` を変更します。  
名前解決するIPは、OpenShiftを導入するノードのIPとなります。  

```
[root@mz-t ~]# cat /etc/dnsmasq.d/addnhosts
192.168.217.214 sno-core api api-int
``` 

## PXEの設定

PXEを有効にするために `grub2-tools` と `tftp-server` をインストールします。  

```
[root@sno-bastion ~]# dnf install grub2-tools.ppc64le
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:21:22 時間前の 2024年06月10日 00時44分58秒 に実施しました。
パッケージ grub2-tools-1:2.06-46.el9_1.5.ppc64le は既にインストールされています。
依存関係が解決しました。
====================================================================================================================================================================
 パッケージ                                  アーキテクチャー           バージョン                          リポジトリー                                      サイズ
====================================================================================================================================================================
アップグレード:
 device-mapper                               ppc64le                    9:1.02.197-2.el9                    rhel-9-for-ppc64le-baseos-rpms                    147 k
 device-mapper-event                         ppc64le                    9:1.02.197-2.el9                    rhel-9-for-ppc64le-baseos-rpms                     36 k
 device-mapper-event-libs                    ppc64le                    9:1.02.197-2.el9                    rhel-9-for-ppc64le-baseos-rpms                     34 k
 device-mapper-libs                          ppc64le                    9:1.02.197-2.el9                    rhel-9-for-ppc64le-baseos-rpms                    192 k
 grub2-common                                noarch                     1:2.06-77.el9                       rhel-9-for-ppc64le-baseos-rpms                    916 k
 grub2-ppc64le                               ppc64le                    1:2.06-77.el9                       rhel-9-for-ppc64le-baseos-rpms                    467 k
 grub2-ppc64le-modules                       noarch                     1:2.06-77.el9                       rhel-9-for-ppc64le-baseos-rpms                    908 k
 grub2-tools                                 ppc64le                    1:2.06-77.el9                       rhel-9-for-ppc64le-baseos-rpms                    1.8 M
 grub2-tools-minimal                         ppc64le                    1:2.06-77.el9                       rhel-9-for-ppc64le-baseos-rpms                    613 k
 lvm2                                        ppc64le                    9:2.03.23-2.el9                     rhel-9-for-ppc64le-baseos-rpms                    1.6 M
 lvm2-libs                                   ppc64le                    9:2.03.23-2.el9                     rhel-9-for-ppc64le-baseos-rpms                    1.1 M
依存関係のインストール:
 grub2-tools-extra                           ppc64le                    1:2.06-77.el9                       rhel-9-for-ppc64le-baseos-rpms                    865 k

トランザクションの概要
====================================================================================================================================================================
インストール     1 パッケージ
アップグレード  11 パッケージ

ダウンロードサイズの合計: 8.5 M
これでよろしいですか? [y/N]: y

 ~省略~
```

```
[root@sno-bastion ~]# yum install tftp-server
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:14:31 時間前の 2024年06月10日 00時44分58秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================================
 パッケージ                         アーキテクチャー               バージョン                        リポジトリー                                             サイズ
====================================================================================================================================================================
インストール:
 tftp-server                        ppc64le                        5.2-38.el9                        rhel-9-for-ppc64le-appstream-rpms                         45 k

トランザクションの概要
====================================================================================================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 45 k
インストール後のサイズ: 88 k
これでよろしいですか? [y/N]:

 ~省略~
```

tftpboot用のディレクトリを作成します。  

```
[root@sno-bastion ~]# grub2-mknetdir --net-directory=/var/lib/tftpboot
Netboot directory for powerpc-ieee1275 created. Configure your DHCP server to point to /var/lib/tftpboot/boot/grub2/powerpc-ieee1275/core.elf
```

インストール用のgrubファイル `/var/lib/tftpboot/boot/grub2/grub.cfg` を記述します。  
MacアドレスやIPは利用する環境に従って変更してください。  


```
[root@sno-bastion ~]# mkdir -p  /var/lib/tftpboot/boot/grub2/
```

サーバーIP (bastionノードのIP) や Macアドレスは使用環境に従って編集してください。  

```
[root@sno-bastion ~]# cat /var/lib/tftpboot/boot/grub2/grub.cfg
default=0
fallback=1
timeout=1

if [ ${net_default_mac} == <macアドレス> ]; then
menuentry "CoreOS (BIOS)" {
   echo "Loading kernel"
   linux "/rhcos/kernel" ip=dhcp rd.neednet=1 ignition.platform.id=metal ignition.firstboot coreos.live.rootfs_url=http://<サーバーIP>/install/rootfs.img ignition.config.url=http://<サーバーIP>/ignition/sno.ign

   echo "Loading initrd"
   initrd  "/rhcos/initramfs.img"
}
fi
```

PXE用にCoreOSのイメージファイル(`kernel`, `initramfs.img`)をダウンロードします。  
下の例では、 OpenShift 4.15 最新版OS用のイメージをダウンロードしています。  
利用するバージョンに併せて、ダウンロード先のURL `RHCOS_URL` を変更してください。  

```
[root@sno-bastion ~]# export RHCOS_URL=https://mirror.openshift.com/pub/openshift-v4/ppc64le/dependencies/rhcos/4.15/latest
[root@sno-bastion ~]# mkdir -p /var/lib/tftpboot/rhcos
[root@sno-bastion ~]# cd /var/lib/tftpboot/rhcos
[root@sno-bastion rhcos]# wget ${RHCOS_URL}/rhcos-live-kernel-ppc64le -O kernel
[root@sno-bastion rhcos]# wget ${RHCOS_URL}/rhcos-live-initramfs.ppc64le.img -O initramfs.img
```

OSのインストール用に、`rootfs.img` も必要なためダウンロードします。  
このファイルは、webサーバーで提供するため、先ほどと別のディレクトリに保存します。  

```
[root@sno-bastion rhcos]# mkdir -p /var/www/html/install/
[root@sno-bastion rhcos]# cd /var//var/www/html/install/
[root@sno-bastion rhcos]# wget ${RHCOS_URL}/rhcos-live-rootfs.ppc64le.img -O rootfs.img
```

## ignitionファイルの作成
ignitionファイルをインストール時に取得するために、bastionノードに `httpd` を導入します。  
CoreOSのイメージ取得にも一部利用します。  

```
[root@sno-bastion rhcos]# dnf install httpd
サブスクリプション管理リポジトリーを更新しています。
メタデータの期限切れの最終確認: 0:28:44 時間前の 2024年06月10日 00時44分58秒 に実施しました。
依存関係が解決しました。
====================================================================================================================================================================
 パッケージ                             アーキテクチャー            バージョン                          リポジトリー                                          サイズ
====================================================================================================================================================================
インストール:
 httpd                                  ppc64le                     2.4.57-8.el9                        rhel-9-for-ppc64le-appstream-rpms                      52 k
依存関係のインストール:
 apr                                    ppc64le                     1.7.0-12.el9_3                      rhel-9-for-ppc64le-appstream-rpms                     141 k
 apr-util                               ppc64le                     1.6.1-23.el9                        rhel-9-for-ppc64le-appstream-rpms                     109 k
 apr-util-bdb                           ppc64le                     1.6.1-23.el9                        rhel-9-for-ppc64le-appstream-rpms                      14 k
 httpd-core                             ppc64le                     2.4.57-8.el9                        rhel-9-for-ppc64le-appstream-rpms                     1.6 M
 httpd-filesystem                       noarch                      2.4.57-8.el9                        rhel-9-for-ppc64le-appstream-rpms                      15 k
 httpd-tools                            ppc64le                     2.4.57-8.el9                        rhel-9-for-ppc64le-appstream-rpms                      88 k
 redhat-logos-httpd                     noarch                      90.4-2.el9                          rhel-9-for-ppc64le-appstream-rpms                      18 k
弱い依存関係のインストール:
 apr-util-openssl                       ppc64le                     1.6.1-23.el9                        rhel-9-for-ppc64le-appstream-rpms                      17 k
 mod_http2                              ppc64le                     2.0.26-2.el9_4                      rhel-9-for-ppc64le-appstream-rpms                     175 k
 mod_lua                                ppc64le                     2.4.57-8.el9                        rhel-9-for-ppc64le-appstream-rpms                      65 k

トランザクションの概要
====================================================================================================================================================================
インストール  11 パッケージ

ダウンロードサイズの合計: 2.3 M
インストール後のサイズ: 11 M
これでよろしいですか? [y/N]: y

 ~省略~
```

CoreOSの設定を行うために、ignitionファイルが必要となります。  
シングルノード構成の場合は、このignitionファイル作成時にシングルノードを指定することになります。  
まずは、ignitionファイルを作成するディレクトリを作成します。  

```
mkdir -p ~/sno-work
cd ~/sno-work
```

作成したディレクトリ内で、`install-config.yaml` を作成してください。  
記載のサンプルは以下になります。  

``` :install-config.yaml
apiVersion: v1
baseDomain: <domain>
compute:
- name: worker
  replicas: 0 
controlPlane:
  name: master
  replicas: 1 
metadata:
  name: <cluster_id>
networking: 
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineNetwork:
  - cidr: <machineNetwork>
  networkType: OVNKubernetes
  serviceNetwork:
  - 172.30.0.0/16
platform:
  none: {}
bootstrapInPlace:
  installationDisk: <device> 
pullSecret: '<pull_secret>' 
sshKey: |
  <ssh_key> 
```

下記項目を構成する環境に従って変更してください。  

- `<domain>` : 作成するOpenShiftのドメイン名指定
- `<cluster_id>` : クラスター名の指定
- `<machineNetwork>` : CoreOS自体に付与するネットワークセグメントを設定 (xxx.xxx.xxx.xxx/yy で指定)
- `<device>` : CoreOSをインストールするディスクデバイスを指定 (`/dev/sda` など)
- `<pull_secret>` : [Red Hat OpenShift Cluster Manager](https://console.redhat.com/openshift/install/pull-secret) から取得し、貼り付け
- `<ssh_key>` : CoreOSにsshログインするために設定 (今回は、bastionノードでsshKeyを作成)

その他、設定項目について  
- clusterNetwork : Pod用のネットワークセグメント  
- serviceNetwork : Service用のネットワークセグメント

`install-config.yaml` が準備できたら、`openshift-install` をダウンロードし、ignitionファイルを生成します。  
今回は、バージョン `4.15.36` を利用するため、URLは `https://mirror.openshift.com/pub/openshift-v4/ppc64le/clients/ocp/stable-4.15/openshift-install-linux-4.15.15.tar.gz` を使用します。  
使用するバージョンに適したURLからダウンロードしてください。  

```
[root@sno-bastion sno-work]# wget https://mirror.openshift.com/pub/openshift-v4/ppc64le/clients/ocp/stable-4.15/openshift-install-linux-4.15.15.tar.gz
[root@sno-bastion sno-work]# tar xvzf openshift-install-linux-4.15.15.tar.gz
```

ignitionファイルを生成するためのディレクトリを作成し、対象のディレクトリに先ほど作成した `install-config.yaml` をコピーします。  
その後、`./openshift-install --dir=create-ignition create single-node-ignition-config` コマンドでignitionファイルを生成します。  
生成されたignitionファイルは、指定したディレクトリ内に作成されます。  

```
[root@sno-bastion sno-work]# mkdir create-ignition
[root@sno-bastion sno-work]# cp install-config.yaml ./create-ignition/
[root@sno-bastion sno-work]# ./openshift-install --dir=create-ignition create single-node-ignition-config
INFO Consuming Install Config from target directory
WARNING Making control-plane schedulable by setting MastersSchedulable to true for Scheduler cluster settings
INFO Single-Node-Ignition-Config created in: create-ignition and create-ignition/auth
```

作成されたignitionファイルを、webサーバーで公開できるようにコピーします。  
また、アクセスできるように権限変更やラベルの貼り直しを行います。  

```
[root@sno-bastion create-ignition]# ls
auth  bootstrap-in-place-for-live-iso.ign  metadata.json  worker.ign
[root@sno-bastion create-ignition]# mkdir /var/www/html/ignition/
[root@sno-bastion create-ignition]# cp ./create-ignition/bootstrap-in-place-for-live-iso.ign /var/www/html/ignition/sno.ign
[root@sno-bastion create-ignition]# restorecon -vR /var/www/html || true
Relabeled /var/www/html/install/rootfs.img from unconfined_u:object_r:tftpdir_rw_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
[root@sno-bastion create-ignition]# chmod o+r /var/www/html/ignition/*.ign
```

# ネットワークインストール  
ネットワークブートの環境が整ったので、インストールに移ります。  
HMCにログインできる環境の場合、以下のコマンドでネットワークブートを実行できます。  
```
lpar_netboot -i -D -f -t ent -m <sno_mac> -s auto -d auto -S <server_ip> -C <sno_ip> -G <gateway> <lpar_name> default_profile <cec_name>
```

- `<sno_mac>` : CoreOSをインストールするLPARにつけられているNICのMACアドレス
- `<sno_ip>` : 上記NICにつけるIP (dnsmasqで設定したもの)
- `<server_ip>` : bastionノードのIP
- `<gateway>` : 使用するネットワークのゲートウェイ
- `<lapr_name>` : HMC上のLPAR名
- `<cec_name>` : LPARが稼働するシステム名

SMSからでもネットワークインストール可能です。  
通常のLinuxインストールとネットワークインストールの方法は同じのため、下記を参照ください。  


https://qiita.com/tom_m_m/items/b5f719b32e55b348d087

しばらくすると、OpenShiftのインストールが完了します。  
シングルノードの場合、はじめにbootstrapがインストールされ、起動が完了するとOpenShift本体がインストールされます。 
このときに、`install-config.yaml` で指定したデバイスにインストールされるため、この指定が間違っているとインストールされません。  
CoreOS上のログを確認し、対象のデバイスが見つからないようであれば、 `fdisk` のようなコマンドで使用可能なデバイスを確認してください。  
`fdisk -l` で接続されているデバイスを一覧できます。  

`./openshift-install wait-for bootstrap-complete` を実行すると、Bootstrapの起動が完了したか確認できます。  
ただし、CoreOSにsshでログインし、 `journalctl` でログを確認する方が確実です。  

インストール完了後は、`./openshift-install wait-for install-complete` を実行すると、アクセス情報などが表示されます。  
インストールの状況は、`oc get co` でオペレーターのインストール状況を確認すると良いです。  

# Power Virtual Server の場合
シングルノード構成は、IBM Power のクラウドサービスである Power Virtual Server でも構築できました。  
Power Virtual Server の場合、SMS画面を表示するためにコツが必要です。  
一度、BYOLのイメージをブートした後に、コンソールを開きます。  
コンソールを開いた状態で、対象の仮想マシンを再起動すると以下のような表示が出ます。  

```
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM

          1 = SMS Menu                          5 = Default Boot List
          9 = Restricted Open Firmware Prompt   6 = Stored Boot List
```

この表示が出ている間に、 `1` を入力することで、SMSメニューに移行できます。  
ネットワークインストールの方法は、通常の方法と同じです。  

# その他、補足
インターネットに繋がるネットワークを直接ノードにつける場合は問題ありませんが、プロキシーサーバーを利用する場合には、`install-config.yaml` の設定が必要です。  

Power Virtual Server の場合、仮想マシンにパブリックネットワークをつけることで、インターネットへのアクセスが可能になります。  
そうでない場合、bastionノードなどでproxy設定が必要です。 

外部ストレージを提供するために、NFSを利用することも可能です。  
BastionノードにNFSサーバーを構築し、OpenShiftにNFS用のStorage Classを作成する必要があります。  
NFSによる外部ストレージはこちらの記事を参考にすると実施できます。  

https://qiita.com/mmitsugiw/items/9c82bff35a24a1654d39