OpenShift 4.10 をSingle Node OpenShift構成で導入_#1！

今回はSingle Node OpenShiftを試してみましたので、その導入方法を投稿してみたいと思います。本記事は2部構成となっております。皆さんの検証環境に合わせてご参考にしていただけたら幸いです。

さてこのSingle Node OpenShift構成ですが、待ち望んでいた方も多いと思います。私もその一人でした。一般的にOpenShiftでは、クラスタを構成するためにMaster NodeやWorker Node、Infra Nodeといった複数のノードが必要とされますが、OpenShift 4.9から提供されたこのSingle Node OpenShift構成では、1ノードでOpenShiftの作成が可能となりました。(以降、Single Node OpenShift構成のことを本ブログでは、SNO構成と記載します)

以降の内容は私の検証環境でのセットアップ手順となります。
SNO構成に関しての詳細な導入方法を確認したい場合は、以下のRed Hat社のドキュメントをご参照ください。また、SNO構成を作る場合でも、OpenShiftのライセンスは必要となりますので、もしお持ちではない場合には、評価版ライセンスを事前にご準備ください。

[・Red Hat社ドキュメント: Installing OpenShift on a single node
Generating the discovery ISO with the Assisted Installer](https://docs.openshift.com/container-platform/4.10/installing/installing_sno/install-sno-installing-sno.html)

[・Red Hat製品を無料で試してみよう](https://www.redhat.com/ja/explore/now-on-redhat/trial)

# 0. 今回のSingle Node OpenShift構成のアーキテクチャ

SNO構成では一般的なOpenShiftと同様に、自身の検証環境に合わせてその構成方法を変更可能です。

今回は以下のような環境で、物理ノードではなくIBM Power Systems上の仮想マシンで構成・導入してみました。上記のRed Hat社のドキュメントでは"Assisted Installer" を使用して導入していますが、今回はある程度閉じた環境での評価をしてみたかったので利用していません。
また今回、ネットワーク環境はDHCPとしています。Static IPでの実装も可能ですが、CoreOSが起動してきたタイミング(BootOptionなど)でネットワーク構成を指定しないといけず、少し手間がかかるためDHCPを選択しました。(CoreOSのISOイメージを起動したら、OpenShiftのイントール完了まで手作業は減らしたいですよね。。。)
また、OpenShiftはインストール時にWeb環境に設置されているRed Hat社のレジストリにモジュールを取得しにいきますので、何かしら外部のWebへアクセス可能なネットワーク環境をご準備ください。

||コンポーネント|IPアドレス|備考欄|
| :---- | :----|:----|:----|
|VM #1| SNO構成 OpenShift|192.168.100.100|
|VM #2|  ・DHCP Server<br>・DNS Server<br>・HTTP Server<br>・Openshift Client|192.168.100.2|Static IPでの構成も可能ですが、今回はDHCP環境で構成します。CoreOSへIgnition fileを渡すためにhttpサーバを作成します。OpenShiftへの操作やCoreOSの準備もここで実施します。|

||  Version  |備考欄|
| :---- | :----: |:----|
|  OpenShift |  4.10  |Single Node ClusterはOpenShift4.9から提供されています|
|  CoreOS  |  4.10.3  |-|
|Openshift client (oc command)|4.10.3|-|
|openshift-installer|4.10.3|-|
|coreos-installer |0.14.0|-|

<img width="500" alt="archetecture.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613078/f7b81d74-0512-4f22-32c8-8b56bb2225bc.png">

最後に、具体的な導入ステップの内容に入る前に、全体の大まかなステップをメモしておきたいと思います。
導入がうまくいかない場合には、以下の流れをご確認いただき、全体のどのステップで失敗しているのかをチェックしてみてください。

冒頭にお話しましたが、今回の記事は2部構成としています。
下記の手順のうち(1)と(2)を#1で、(3)-(6)を#2で紹介したいと思います。

1) DHCP/DNS/Webサーバなどの周辺コンポーネントのセットアップ
2) Single Node OpenShift構成導入のためのCoreOSのイメージを準備
    a. CoreOSの取得
    b. ignitionファイルの作成
    c. CoreOSイメージへのembed作業
3) 準備したCoreOSイメージを使用してSingle Node OpenShift構成用のVMを起動 
4) 自動でBootstrapノードの導入が開始。完了後、自動で再起動
5) 自動でMaster/Workerノードの導入が開始
6) Single Node OpenShift構成が完成！

# 1. DHCP/DNS/Webサーバなどの周辺コンポーネントのセットアップ

まずこちらのステップでは、VM#2環境でSNO構成を作成するために必要なコンポーネントのセットアップ作業を進めて行きます。今回はVM#2にはRHEL8.4を導入し、作業を行なっています。RHELを使用する場合は、OpenShiftと同様にライセンスが必要となりますので、もしお持ちではない場合は評価版ライセンスをご準備ください。もちろん、RHELの代わりにCentOSで環境をご準備いただくのでも問題ありません！

### 1-1.  DHCP環境準備

今回の検証環境では、新規にDHCPサーバを作成しました。私のように新規にDHCPサーバを準備いただいても良いですし、ありもので既存のDHCP環境をそのままご利用いただくのでも問題ないです。また繰り返しになりますが、OpenShiftはインストール時にWeb環境に設置されているRed Hat社のレジストリにモジュールを取得しにいきます。そのため、DHCPサーバからはIPアドレスだけでなく、名前解決のためのDNSサーバの情報も併せて配布するようにしておくと良いかと思います。

1 ) DHCPサーバのモジュールを導入

```bash
$ dnf install -y dhcp-server
```

2 ) DHCPサーバの設定

OpenShiftを導入するVM環境(もしくは物理ノード環境)で使用するネットワークインターフェイスのMacアドレスを確認しておきます。
DHCPサーバからはそのMacアドレスに紐づけた、特定のIPアドレスを配布するように設定しています。

```/etc/dhcp/dhcpd.conf
subnet 192.168.100.0 netmask 255.255.255.0 {
        range 192.168.100.3 192.168.100.254;
        option routers 192.168.100.2;
        option domain-name-servers 192.168.100.2;
}
host sno-qiita.test.example.local {
        option host-name "sno-qiita.test.example.local";
        hardware ethernet XX:XX:XX:XX:XX:XX;
        fixed-address 192.168.100.100;
}
```

3 ) DHCPDサービスの起動・有効化

```bash
$ systemctl start dhcpd
$ systemctl enable dhcpd
```

### 1-2.  DNS環境準備

DNSサーバの環境も本検証環境では新規で構築していきます。DHCPサーバ同様に、DNSサーバも既存環境のものをそのままご利用いただいても問題ありません。既存DNSサーバ環境を使用する場合は、Openshift用の名前解決の設定のみ、DNS設定ファイルに追記ください。

1 ) DNSサーバモジュールの導入

```bash
$ dnf install -y dnsmasq
```

2 ) DNSサーバの設定

今回は以下のように設定しました。

```/etc/dnsmasq.conf
$ cat /etc/dnsmasq.conf | grep -v ^# | grep -v ^$
user=dnsmasq
group=dnsmasq
conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
bogus-priv
domain=test.example.local
no-hosts
expand-hosts
address=/api.sno-qiita.test.example.local/192.168.100.100
address=/api-int.sno-qiita.test.example.local/192.168.100.100
address=/apps.sno-qiita.test.example.local/192.168.100.100
address=/sno-qiita.test.example.local/192.168.100.100
```

3 ) DNSサービスの起動・有効化

```bash
$ systemctl start dnsmasq
$ systemctl enable dnsmasq
```

### 1-3. Webサーバの準備

今回、Webサーバは簡易的にApacheをインストールします。
このWebサーバは、CoreOSのインストール時(SNO構成インストール時)にignitionファイル(OpenShiftの構成情報を提供するファイル)をCoreOSへ提供する際に使用します。そのため、その他のコンポーネントと同様にこのWebサーバもOpenShiftクラスタからアクセス可能なネットワーク環境に準備ください。

またこの時もFirewallを有効にしている場合は、対象ポートを解放することを忘れないようにしましょう。

1 ) Apacheのインストール

```bash
$ dnf install -y httpd
```

2 ) Apacheサービスの起動

```bash
$ systemctl start httpd
$ systemctl enable httpd
```

# 2. SNO構成導入のためのCoreOSのイメージを準備

移行の手順は、引き続きVM#2で作業しています。

<font color="Red">注意) 手順2-2にて、ignitionファイルを作成しているのですが、このファイルの作成は同一CPUアーキテクチャの環境で実施いただくことをお勧めします。今回、ppc64leアーキテクチャのOpenShiftを導入いたしますので、この作業環境もppc64leアーキテクチャ上で実施しています。(本検証環境は、IBM Power Systems上の仮想環境にSingle Node Openshit用のVM#1と作業用/導入準備用のVM#2を作成しています。そのため、結果として同一CPUアーキテクチャで作業していることとなっています。)</font>

### 2-1. CoreOSの取得

SNO構成のインストールに使用するCoreOSのISOファイルを取得します。ISOファイルは以下のRedHat社のURLより取得可能です。
今回の検証はIBM Power Systems上で実施しているため、PPC版のISOファイルを選択しています。ご利用の検証環境に合わせて適切なCPUアーキテクチャのものを選択ください。

OpenShift 4.10 for ppc64le版
https://mirror.openshift.com/pub/openshift-v4/ppc64le/dependencies/rhcos/4.10/latest/rhcos-4.10.3-ppc64le-live.ppc64le.iso

```bash
$ mkdir sno
$ cd sno
$ wget https://mirror.openshift.com/pub/openshift-v4/ppc64le/dependencies/rhcos/4.10/latest/rhcos-4.10.3-ppc64le-live.ppc64le.iso
$ ls 
rhcos-4.10.3-ppc64le-live.ppc64le.iso
```
### 2-2. ignitionファイルの作成

1 ) 必要なモジュールのダウンロード

```bash
$ pwd
/root/sno
$ mkdir ocp-command
$ cd ocp-command
# OpenShift Client のダウンロード
$ wget https://mirror.openshift.com/pub/openshift-v4/ppc64le/clients/ocp/4.10.3/openshift-client-linux.tar.gz
# Openshift install のダウンロード 
$ wget https://mirror.openshift.com/pub/openshift-v4/ppc64le/clients/ocp/4.10.3/openshift-install-linux.tar.gz
$ ls
openshift-client-linux.tar.gz  openshift-install-linux.tar.gz  
```

ダウンロードしたモジュール群を展開します。

```bash
$ tar -zxvf openshift-client-linux.tar.gz 
README.md
oc
kubectl
$ tar -zxvf openshift-install-linux.tar.gz 
README.md
openshift-install
```

ダウンロードしたocコマンド、openshift-installコマンドのバージョンはそれぞれ以下の通りです。

```bash
# ocコマンドのバージョン
$ ./oc version
Client Version: 4.10.3
# openshift-installコマンドのバージョン
$ ./openshift-install version
./openshift-install 4.10.3
built from commit 3b701903d96b6375f6c3852a02b4b70fea01d694
release image quay.io/openshift-release-dev/ocp-release@sha256:4ee571da1edf59dfee4473aa4604aba63c224bf8e6bcf57d048305babbbde93c
release architecture ppc64le
```

最後にこれらのコマンドへPATHを通します。

```bash
$ export PATH=$PATH:/root/sno/ocp-command
```

2 ) CoreOSにアクセスするsshキーを作成

後ほど、ここで作成したsshキーをinstall-config.yaml で使用します。

```bash
$ pwd
/root/sno
$ mkdir ssh-key
$ cd ssh-key
$ ssh-keygen -t rsa -b 4096 -N '' -f new_rsa
$ ls
new_rsa  new_rsa.pub

```

3 ) install-config.yamlの作成

今回は以下のようにinstall-config.yamlを作成しています。
Single Node Openshiftを作成する際に必要なinstall-config.yamlのサンプル情報は、以下のリンク先にありますので、併せてご覧ください。

<https://docs.openshift.com/container-platform/4.10/installing/installing_sno/install-sno-installing-sno.html>

|項目|設定内容|
|:--|:--|
|baseDomain|作成するOpenShiftクラスタのドメイン名を指定します|
|metadata:name|作成するOpenShiftのクラスタ名を指定します|
|compute:replicas|computeのreplicasを"0"に設定します。これにより、control planeノードをスケジュール可能なノードとして設定されます|
|controlPlane:replicas|SNO構成では、controlPlaneのreplicasを"1"に設定します。これにより、クラスタが単一ノードで実行されます|
|networking:networkType|OVNKubernetesを指定します|
|networking:clusterNetwork|OpensShift(k8s)のPoD用のネットワークセグメントの設定します|
|networking:serviceNetwork|OpensShift(k8s)のService用のネットワークセグメントの設定します|
|bootstrapInPlace:installationDisk|installationDiskにて、導入先のディスクを指定。今回は仮想環境に作成していることもあり、vdaと指定します。|
|pullSecret|[Red Hat OpenShift Cluster Manager](https://console.redhat.com/openshift/install/pull-secret)にて取得します|
|sshKey|先ほど作成した"new_rsa.pub"を記載します。SNO導入後、このsshkey情報を用いてCoreOSへアクセスします。|

```bash:install-config.yaml
apiVersion: v1
baseDomain: test.example.local
compute:
- name: worker
  replicas: 0 
controlPlane:
  name: master
  replicas: 1 
metadata:
  name: sno-qiita
networking:
  networkType: OVNKubernetes
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23 
  serviceNetwork:
  - 172.30.0.0/16
platform:
  none: {}
bootstrapInPlace:
  installationDisk: /dev/vda
pullSecret: 'XXXXXX'
sshKey: 'XXXXXXXXX'
```

4 ) ignitionファイルの作成

先ほど作成した、install-config.yamlを使用して、ignitionファイルを作成します。

```bash
## ignitionファイルを作成するための作業ディレクトリの準備
$ pwd
/root/sno/ignition
$ mkdir create_ignition
$ ls
create_ignition  install-config.yaml

## create_ignitionディレクトリへinstall-config.yamlをコピー
$ cp install-config.yaml create_ignition/

## ignitionファイルの作成
$ openshift-install --dir=create_ignition create single-node-ignition-config
$ ls create_ignition/
auth  bootstrap-in-place-for-live-iso.ign  metadata.json 
```

5 ) Webサーバ上にignitionファイルを設置

```bash
$ cp create_ignition/bootstrap-in-place-for-live-iso.ign /var/www/html/
$ chmod 755 /var/www/html/bootstrap-in-place-for-live-iso.ign
```

### 2-3. CoreOSイメージへのembed作業

coreos-installerコマンドを使用して、CoreOSのISOイメージにいくか設定を組み込むことができます。例えば、先ほど作成したignitionファイルをISOに組み込んだり、ISO起動時のブートオプションなどを事前に設定できたりします。その他に設定可能な項目は、以下のリンクに記載がありますので、興味ある方はご覧ください。

<https://coreos.github.io/coreos-installer/cmd/iso/>

今回は、CoreOSのISOイメージにはISO起動時のカーネルパラメータの設定としてignitionファイルの設置場所(Webサーバ上)の情報のみ組み込んでおきたいと思います。

```bash
## 作業用ディレクトリを準備
$ pwd
/root/sno
$ ls
ignition  ocp-command  rhcos-4.10.3-ppc64le-live.ppc64le.iso  ssh-key
$ mkdir iso
$ cp rhcos-4.10.3-ppc64le-live.ppc64le.iso iso/
$ cd iso
$ ls
rhcos-4.10.3-ppc64le-live.ppc64le.iso
```

まずcoreos-installerコマンドを以下のURLより取得します。
<https://mirror.openshift.com/pub/openshift-v4/clients/coreos-installer/latest/>

```bash
$ pwd
/root/sno/iso
$ wget https://mirror.openshift.com/pub/openshift-v4/clients/coreos-installer/latest/coreos-installer_ppc64le
$ ls
coreos-installer_ppc64le  rhcos-4.10.3-ppc64le-live.ppc64le.iso
$ chmod +x coreos-installer_ppc64le
```

coreos-installerコマンドを用いて、CoreOS ISOイメージに起動オプションをembedします。WebサーバのIPアドレス情報はご自身の環境に併せて変更してください。

```bash
## デフォルトの設定状況を確認
$ ./coreos-installer_ppc64le iso kargs show rhcos-4.10.3-ppc64le-live.ppc64le.iso 
random.trust_cpu=on coreos.liveiso=rhcos-410.84.202201251004-0 ignition.firstboot ignition.platform.id=metal

## 起動時のオプションを設定
$ ./coreos-installer_ppc64le iso kargs modify rhcos-4.10.3-ppc64le-live.ppc64le.iso --append "ignition.config.url=http://192.168.100.2/bootstrap-in-place-for-live-iso.ign"

## 設定内容の確認
$ ./coreos-installer_ppc64le iso kargs show rhcos-4.10.3-ppc64le-live.ppc64le.iso 
random.trust_cpu=on coreos.liveiso=rhcos-410.84.202201251004-0 ignition.firstboot ignition.platform.id=metal ignition.config.url=http://<WebサーバIPアドレス>/bootstrap-in-place-for-live-iso.ign
```

# 今回はここまで！次回以降のステップについて

今回は、以下の手順のうち、以下の(1)-(2)の作業を実施しました。次は、作成したCoreOSのISOファイルを用いてOpenShiftを導入するところからご紹介します。興味ある方は是非、以下のリンクより次のステップもご覧ください！

1) DHCP/DNS/Webサーバなどの周辺コンポーネントのセットアップ
2) Single Node OpenShift構成導入のためのCoreOSのイメージを準備
    a. CoreOSの取得
    b. ignitionファイルの作成
    c. CoreOSイメージへのembed作業
3) 準備したCoreOSイメージを使用してSingle Node OpenShift構成用のVMを起動 
4) 自動でBootstrapノードの導入が開始。完了後、自動で再起動
5) 自動でMaster/Workerノードの導入が開始
6) Single Node OpenShift構成が完成！


https://qiita.com/Nakaji1106/items/594cf85f748ff3ab4d65