ラズパイ4でRHEL9でMicroShift(エッジ向けOpenShift)の構築

# はじめに
開発者向けですが、Raspberry Piでもエンタープライズ向けOSが利用でき、実験的なエッジ向けOpenShift(MicroShift)が利用できます。
MicroShiftについては以下のサイトをご覧ください。

https://next.redhat.com/project/microshift/

https://microshift.io/

# 準備するもの
- Developer Programに参加しているRed Hatアカウント
- Raspberry Pi 4B
RAMは4GB以上
- MicroSDHC
UEFI Firmware用
- USBメモリ
8GB以上なら何でもOK
- USBキーボード,マウス,HDMIディスプレイ
- USB接続のSSD
40GB以上あれば安心

# UEFI Firmaware起動用microSDの作成
Raspberry Pi 4 UEFI FirmwareのZIPファイルをダウンロードしてPC上に展開し、展開したファイルをmicroSDにコピーします。

https://github.com/pftf/RPi4/releases/

![スクリーンショット 2022-07-15 20.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/8b035961-5600-c678-fcf6-596a9e2e1a0d.png)

# RHEL9 ISO用USBメモリの作成
「Red Hat Product Downloads」のページから[Red Hat Enterprise Linux]を選択するとページが切り替わるので、製品のバリアントで"Red Hat Enterprise Linux for ARM64"のバージョン"9.0"を選択します。
※事前にDeveloper Programに参加しているRed Hatアカウントでログインしておく必要があります。

https://access.redhat.com/downloads/

![スクリーンショット 2022-07-15 20.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/e0263c6d-a982-f43f-978c-e613d02e8318.png)

ページ下部から"Red Hat Enterprise Linux 9.0 Binaly DVD"をダウンロードして「Raspberry Pi Imager」などでUSBメモリに書き込みます。

![スクリーンショット 2022-07-15 20.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/e0062c8b-7496-b97b-f3d3-445e984a7cf1.png)

「Raspberry Pi Imager」を利用する場合は、OSの選択で「カスタムイメージを使う」からダウンロードしたISOファイルを選択します。

![スクリーンショット 2022-07-15 20.52.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/9ea205b5-8f5f-ac2b-3324-d31054d45cfd.png)

USBメモリの型番みたいなものを覚えておくと良いです。(上記画面は「Wii USB MEMORY」のものです。)

# UEFI Setupの起動
Raspberry Piに、キーボード、マウス、ディスプレイを接続し、前述の手順で作成したmicroSDとUSBメモリも接続しておき、電源ケーブルを接続して電源を入れます。
木苺の絵が出たら[Esc]キーを押します。
![スクリーンショット 2022-07-15 21.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/4177dbf4-e5af-c899-72db-00eaf6005cb8.png)

[Esc]キーを押すと、以下のような画面になります。
![スクリーンショット 2022-07-15 21.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/3ae67d22-8d0a-afc0-4a37-adc75949be78.png)

右上のRAMの認識が3072MBとなっているので、制限解除します。

## RAM3GB制限の解除
メニューから「Device Manager」→「Raspberry Pi Configuration」→「Advanced Configuration」と選んで、「Limit RAM to 3 GB」を"Disabled"にします。

![スクリーンショット 2022-07-15 22.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/7569233e-933d-3a19-c69e-6f8009cd4674.png)

設定後は再起動を促されるので、再起動したら再度木苺画面で[Esc]キーを押して「UEFI Setup」を起動します。

# RHEL9インストーラの起動とインストール
USB SSDも接続し、メニューから「Boot Manager」→「UEFI XXXXX」(『RHEL9 ISO用USBメモリの作成』で確認した型番)を選択します。
![スクリーンショット 2022-07-15 22.40.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/82a0df15-f728-1be9-2236-bf72b10dca66.png)

すると、RHEL9のインストーラが起動するので、マニュアルなどを参照してインストールしてください。
![スクリーンショット 2022-07-15 22.46.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/d3be2c97-4011-22ef-d229-092b82447196.png)

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/performing_a_standard_rhel_9_installation/booting-the-installer_assembly_installing-on-amd64-intel-64-and-64-bit-arm

今回は「ソフトウェアの選択」で以下の設定にして、USBのSSDにインストールしています。
- ベース環境：「最小限のインストール」
- 選択した環境用のその他のソフトウェア：「標準」「コンテナー管理」

GUI環境については全く試していません。

# RHEL9の起動
USBメモリを外して、RHEL9をインストールしたUSBのSSDから起動します。
![スクリーンショット 2022-07-15 23.01.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410957/b73fde2d-bff3-21db-3bc4-2d681258a987.png)

起動したらrootでログインして日時を確認してください。
日時を合わせていないと一部のコマンドが動作しませんので、できればNTPで同期させてください。
```
[root@rhel9 ~]# date -s "2022/7/15 23:30:00"
2022年  7月 15日 金曜日 23:30:00 JST
```

# MicroShiftの構築
以下のサイトを参考に構築します。

https://microshift.io/docs/getting-started/#install-cri-o

RHEL9用のcri-oはまだ提供されていないので、cri-oのCentOS8 Streamリポジトリを登録します。

```
[root@rhel9 ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8_Stream/devel:kubic:libcontainers:stable.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   380  100   380    0     0    309      0  0:00:01  0:00:01 --:--:--   309
[root@rhel9 ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:1.21.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:1.21/CentOS_8_Stream/devel:kubic:libcontainers:stable:cri-o:1.21.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   432  100   432    0     0    350      0  0:00:01  0:00:01 --:--:--   350
100   433  100   433    0     0    294      0  0:00:01  0:00:01 --:--:--     0
100   434  100   434    0     0    252      0  0:00:01  0:00:01 --:--:--   252
100   435  100   435    0     0    222      0  0:00:01  0:00:01 --:--:--   222
100   436  100   436    0     0    197      0  0:00:02  0:00:02 --:--:--   197
100   402  100   402    0     0    162      0  0:00:02  0:00:02 --:--:--     0
```

cri-oとcri-toolsをインストールして、crioサービスを起動します。

```
[root@rhel9 ~]# dnf install -y cri-o cri-tools
サブスクリプション管理リポジトリーを更新しています。
Stable Releases of Upstream github.com/containers packages (CentOS_8_Stream)              17 kB/s |  66 kB     00:03    
devel:kubic:libcontainers:stable:cri-o:1.21 (CentOS_8_Stream)                            1.5 kB/s | 3.3 kB     00:02    
依存関係が解決しました。
              : (略)
インストール済み:
  cri-o-1.21.7-5.1.el8.aarch64           cri-tools-1.24.0-.el8.1.2.aarch64         socat-1.7.4.1-5.el9.aarch64                             

完了しました!
[root@rhel9 ~]# systemctl enable crio --now
Created symlink /etc/systemd/system/multi-user.target.wants/crio.service → /usr/lib/systemd/system/crio.service.
```

jounalログにSELinuxのメッセージが出力されるので、メッセージ中にあるコマンドを実行します。

```
[root@rhel9 ~]# ausearch -c 'iptables' --raw | audit2allow -M my-iptables
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行して下さい:

semodule -i my-iptables.pp

[root@rhel9 ~]# semodule -X 300 -i my-iptables.pp
```

microshiftサービスをデプロイします。

```
[root@rhel9 ~]# curl -o /etc/systemd/system/microshift.service https://raw.githubusercontent.com/redhat-et/microshift/main/packaging/systemd/microshift-containerized.service
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1191  100  1191    0     0   2460      0 --:--:-- --:--:-- --:--:--  2455
[root@rhel9 ~]# firewall-cmd --zone=trusted --add-source=10.42.0.0/16 --permanent
success
[root@rhel9 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@rhel9 ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent
success
[root@rhel9 ~]# firewall-cmd --zone=public --add-port=5353/udp --permanent
success
[root@rhel9 ~]# firewall-cmd --reload
success
[root@rhel9 ~]# systemctl enable microshift --now
Created symlink /etc/systemd/system/multi-user.target.wants/microshift.service → /etc/systemd/system/microshift.service.
Created symlink /etc/systemd/system/default.target.wants/microshift.service → /etc/systemd/system/microshift.service.
```

jounalログにSELinuxのメッセージが出力されるので、メッセージ中にあるコマンドを実行します。

```
[root@rhel9 ~]# ausearch -c 'runc' --raw | audit2allow -M my-runc
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行して下さい:

semodule -i my-runc.pp

[root@rhel9 ~]# semodule -X 300 -i my-runc.pp
```

ocとkubectlクライアントコマンドをインストールして、Kubeconfigをコピーします。


```
[root@rhel9 ~]# curl -O https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/ocp/stable/openshift-client-linux.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 45.3M  100 45.3M    0     0  7809k      0  0:00:05  0:00:05 --:--:-- 10.1M
[root@rhel9 ~]# tar -xf openshift-client-linux.tar.gz -C /usr/local/bin oc kubectl
[root@rhel9 ~]# mkdir ~/.kube
[root@rhel9 ~]# podman cp microshift:/var/lib/microshift/resources/kubeadmin/kubeconfig ~/.kube/config
[root@rhel9 ~]# chown `whoami`: ~/.kube/config
```

microshiftの起動までしばらく待ってから、Podの状況を確認します。

```
[root@rhel9 ~]# oc get pods -A
NAMESPACE                       NAME                                  READY   STATUS    RESTARTS   AGE
kube-system                     kube-flannel-ds-2fkcp                 1/1     Running   0          2d
kubevirt-hostpath-provisioner   kubevirt-hostpath-provisioner-99vdk   1/1     Running   0          2d
openshift-dns                   dns-default-5rp5h                     2/2     Running   0          2d
openshift-dns                   node-resolver-7n8fq                   1/1     Running   0          2d
openshift-ingress               router-default-85bcfdd948-8nxxl       1/1     Running   0          2d
openshift-service-ca            service-ca-5f8d7bdd7d-vqrzw           1/1     Running   1          47h
```

service-caのPodが起動しないようであれば、以下のコマンドを実行します。

```
[root@rhel9 ~]# oc patch deployments/service-ca -n openshift-service-ca -p '{"spec": {"template": {"spec": {"containers": [{"name": "service-ca-controller","args": ["-v=4"]}]}}}}'
deployment.apps/service-ca patched
```

トラブルシュートは以下のサイトも参考にさせていただきました。

https://community.ibm.com/community/user/cloud/blogs/alexei-karve/2022/04/17/microshift-12

# おわりに
以上でございますが、実際に色々使ったわけではなく構築して満足しただけでございますので、うまく動作しなくても当方は一切責任を負いません。