Raspberry Pi 5（AlmaLinux9）にMicroShiftをインストール

## 経緯
- エッジでコンテナオーケストレーションをする際、RedHat社のOSSであるMicroShiftが手軽そうだった + OpenShift Localを使ったことがあった（[UnityのロボットシミュレーションをOpenShiftで管理](https://qiita.com/yoshi1006/items/2f54d49958e55c2b5ab5)）ので、使ってみたかった
- 息子（4）が、学校のチャイムが鳴るおもちゃをほしがったのでRaspberry Piで組んでみようと思った

## 環境
- boot用SDカードを用意したPC: Windows 11
- Raspberry Pi5
    - 2~3倍性能が上がった等、Raspberry Pi4のグレードアップ版
    - 5V/5Aの電源が必要
    （テキトーにUSBをつないだらOSが立ち上がらず落ちた）
- AlmaLinux release 9.4 (Seafoam Ocelot)
    - Red Hat Enterprise Linux (RHEL)と完全に互換性のあるオープンソースのOS
    - AlmaLinux OS Foundationによって管理されており、コミュニティ主導で開発が進められている
    - Fedora IoT、CentOSも検討したが、調査時点でRaspberry Pi5に対応したイメージを見つけられなかったので今回はAlmaLinuxを採用
- MicroShift Version: 4.8.0-0.microshift-2022-04-20-141053

## 手順
### 1. AlmaLinuxイメージ・AlmaLinuxへの接続準備 (WSL2)
1. AlmaLinuxのイメージをダウンロード
    ```bash
    $ curl -O https://repo.almalinux.org/almalinux/9/raspberrypi/images/AlmaLinux-9-RaspberryPi-GNOME-latest.aarch64.raw.xz
    ```
1. イメージを検証するため、AlmaLinux OS PGP public keyをダウンロード
    ```bash
    $ curl -O -s https://repo.almalinux.org/almalinux/RPM-GPG-KEY-AlmaLinux-9
    ```
1. key fingerprintを確認
    ```bash
    $ gpg --with-subkey-fingerprints RPM-GPG-KEY-AlmaLinux-9
    gpg: WARNING: no command supplied.  Trying to guess what you mean ...
    pub   rsa4096 2022-01-18 [SC]
          BF18AC2876178908D6E71267D36CB86CB86B3716
    uid           AlmaLinux OS 9 <packager@almalinux.org>
    sub   rsa4096 2022-01-18 [E]
    ```
    - finger printが`BF18AC2876178908D6E71267D36CB86CB86B3716`であることを確認
1. keyをインポート
    ```bash
    $ gpg --import RPM-GPG-KEY-AlmaLinux-9
    gpg: key D36CB86CB86B3716: public key "AlmaLinux OS 9 <packager@almalinux.org>" imported
    gpg: Total number processed: 1
    gpg:               imported: 1
    ```
1. checksumファイルとsignatureをダウンロード
    ```bash
    $ curl -O -s https://repo.almalinux.org/rpi/9/images/CHECKSUM
    $ curl -O -s https://repo.almalinux.org/rpi/9/images/CHECKSUM.asc
    ```
1. checksumファイルのsignatureを検証
    ```bash
    $ gpg --verify CHECKSUM.asc CHECKSUM
    gpg: Signature made Fri Aug  2 22:53:39 2024 JST
    gpg:                using RSA key D36CB86CB86B3716
    gpg: Good signature from "AlmaLinux OS 9 <packager@almalinux.org>" [unknown]
    gpg: WARNING: This key is not certified with a trusted signature!
    gpg:          There is no indication that the signature belongs to the owner.
    Primary key fingerprint: BF18 AC28 7617 8908 D6E7  1267 D36C B86C B86B 3716
    ```
    - `Good signature from "AlmaLinux OS 9 <packager@almalinux.org>" `が出力されることを確認
1. ダウンロードしたイメージのchecksumを検証
    ```bash
    $ sha256sum -c CHECKSUM 2>&1 | grep OK
    AlmaLinux-9-RaspberryPi-GNOME-latest.aarch64.raw.xz: OK
    ```
1. AlmaLinuxへssh接続するための公開鍵・秘密鍵を作成
    ``` bash
    $ ~/.ssh
    $ ssh-keygen
    ```
    - `id_rsa`, `id_rsa.pub`が生成される
### 2. SDカードの用意 (Windows11)
1. Raspberry Pi Imagerをダウンロード&インストール
    - [ここ](https://www.raspberrypi.com/software/)からインストーラをダウンロード
    - インストーラの指示にしたがってインストール
1. Raspberry Pi ImagerでAlmaLinux-9-RaspberryPi-GNOME-latest.aarch64.raw.xzをSDカードに書き込む
    - 下記のように設定し、次へをクリック
        - Raspberry Piデバイス：Raspberry Pi 5
        - OS：AlmaLinux-9-RaspberryPi-GNOME-latest.aarch64.raw.xz
            - Use custom > AlmaLinux-9-RaspberryPi-GNOME-latest.aarch64.raw.xzを選択
        - ストレージ：SDXC CARD
1. Would you like to apply OS customization settings?で「いいえ」
    
1. 書き込み
1. 書き込みが終わったら、SDカードをRaspberryPi5に挿入
### 3. AlmaLinux立ち上げ（RaspberryPi5のAlmaLinux）
1. User: almalinux, Password: almalinuxでログイン
1. ネットワークをつなぐ
    - 有線LAN、WiFiの設定：AlmaLinuxのGUIで簡単に設定できるので詳細は省略
1. `$ ip a`コマンドでIPアドレスを確認
1. 公開鍵（1.8.で作成した`id_rsa.pub`）を`~/.ssh/`に、`authorized_keys`というファイル名で保存

### 5. Raspberry Pi5のAlmaLinuxへログイン（WSL2）
1. Raspberry Pi5のAlmaLinuxにSSH接続
    ```bash
    $ ssh almalinux@<3.3.で確認したIPアドレス>
    ```
2. AlmaLinuxへログインできたことを確認
    ```bash
    [almalinux@almalinux ~]$
    ```

### 6. MicroShiftインストール（AlmaLinux）
:::note warn
全コマンドを十分理解していないので、過不足あるかもしれません
:::
1. SELinuxを無効化
    ```bash
    $ sudo nano /etc/selinux/config
    ```
    - `SELINUX=disabled`に更新
1. cgroupv2のメモリコントローラを有効化
    ```bash
    $ sudo sed -i -e "1 s/$/ cgroup_enable=memory/" /boot/cmdline.txt
    ```
    - 参考：[RPi5のAlmaLinux9でMicroShiftを起動したときにflannelがうまく動かない](https://qiita.com/yoshi1006/items/2507214d5ae5798cc657)
1. 再起動
    ```bash 
    $ sudo reboot
    ```
1. 必要なリポジトリの追加
    ```bash
    $ sudo dnf install -y epel-release
    $ sudo dnf config-manager --set-enabled crb
    ```
    - EPEL（Extra Packages for Enterprise Linux）
    - CRB
1. Gitとtarのインストール
    ```bash
    $ sudo dnf update -y
    $ sudo dnf install -y git tar
    ```
    - tarをインストールしておくとVSCodeのRemote-SSHから接続できる
1. CRI-Oのインストール
    ```bash
    $ sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/devel:kubic:libcontainers:stable.repo
    $ sudo curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:cri-o:1.24.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:1.24/CentOS_8/devel:kubic:libcontainers:stable:cri-o:1.24.repo
    $ sudo dnf install -y cri-o
    $ sudo systemctl start crio
    $ sudo systemctl enable --now crio
    ```
    - `$ sudo systemctl start crio`が不要っぽいが、飛ばすとエラーになった（原因究明せず）
1. MicroShiftインストール
    ```bash
    $ sudo dnf copr enable -y @redhat-et/microshift
    $ sudo dnf install -y microshift
    $ microshift version
        MicroShift Version: 4.8.0-0.microshift-2022-04-20-141053
        Base OKD Version: 4.8.0-0.okd-2021-10-10-030117
    $ sudo systemctl enable --now microshift
    ```

1. `oc`コマンドインストール
    ```bash
    $ curl -O https://mirror.openshift.com/pub/openshift-v4/aarch64/clients/ocp/stable/openshift-client-linux.tar.gz
    $ tar xvzf openshift-client-linux.tar.gz
    $ sudo mv oc /usr/local/bin/
    $ oc version
        Client Version: 4.16.8
        Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
    ```
    
1. `oc`コマンドのconfig設定
    ```bash
    $ mkdir -p ~/.kube
    $ sudo cat /var/lib/microshift/resources/kubeadmin/kubeconfig > ~/.kube/config
    $ sudo chown $USER:$USER ~/.kube/config
    $ chmod 600 ~/.kube/config
    ```
### 7. プロジェクトの作成
- `oc`コマンドを用いてprojectを作成
    ```bash
    $ oc new-project sample-app
    Now using project "sample-app" on server "https://127.0.0.1:6443".
    
    You can add applications to this project with the 'new-app' command. For example, try:
    
        oc new-app rails-postgresql-example
    
    to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:
    
        kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.43 -- /agnhost serve-hostname
    ```
- クリーンアップ
    ```bash
    $ oc delete project sample-app
    project.project.openshift.io "sample-app" deleted
    ```

## 参考
- https://www.server-world.info/query?os=AlmaLinux_9&p=ssh&f=4
- https://docs.redhat.com/ja/documentation/openshift_container_platform/4.6/html/cli_tools/_openshift-cli-oc#cli-installing-cli_cli-developer-commands
- https://wiki.almalinux.org/documentation/installation-guide.html#iso-verification
- https://docs.redhat.com/en/documentation/red_hat_build_of_microshift/4.12/html/installing/microshift-install-rpm
- https://rheb.hatenablog.com/entry/2022/06/24/162156