今回のネタについて
MicroShiftはワンバイナリーで動くエッジ及びスモールファクター向けのOpenShiftです。
サポートされているアーキテクチャーはamd64/x86_64/arm64/riscv64
です。
「MicroShift」と言うキーワードでだけでWeb検索すると、様々な違う「マイクロシフト」が検索結果として出てきます。 検索するときは「MicroShift OpenShift」とか「Red Hat MicroShift」で検索すると良いでしょう。
今回はワンバイナリーで動くエッジ向けOpenShiftである「MicroShift」を、Raspberry Pi 4で動作させてみます。 MicroShift自身はマルチアーキテクチャーに対応しているため、同じような流れでIntel CPUマシンなどでも動かせます。
参考情報
手元で確認した環境
- Rocky Linux 8.6 および Fedora 36 Server
- Raspberry Pi 4 (MEM 8GB model)
- まだ正確なことはわかっていないが、内部温度が高温になるとおそらくOS自身の動作が遅くなって結果的にMicroShiftがまともに動かなくなることがあるようです(OSの最適化の問題かも?)。今年の日本の夏は異常に暑いですから。
- CPU温度の確認は
cat /sys/class/thermal/thermal_zone0/temp
- メモリー的には2GBも使っていないので、4GBモデルでも同様に動くと思います。2GBモデルはK8sクラスターとアプリのことを考えると厳しい。
Fedora IoTを使う場合の注意
MicroShiftのサイトを見ると、「Fedora IoTやRHEL for Edgeなどのエッジに最適化されたLinux OSで動かすことを推奨」といった文言が書かれています。 Fedora IoTは無料で使えるLinuxディストリビューションのひとつで、通常のFedoraとの違いはシステムパッケージの管理にostreeが使われることです。
パッケージ管理や一部のコマンドが通常版Fedoraとは異なりますが、CPUやメモリーなどの制限が厳しいIoT機器などには最適なOSであり、 最小構成かつ安定的な環境も作れるので、今回のような用途には最適です。
Fedora IoTをRaspberry Piで動かすにはまずFedora Server版で起動して、arm-image-installerをインストールします。 このツールでFedora IoTイメージをUSBデバイス(microSDやUSB接続のストレージなど)に書き込みます。 イメージを書き込んだデバイスをRaspberry Piに取り付けて電源を入れると起動します。
今回の記事では紆余曲折あって、最終的には通常版のFedora 36 Serverを採用しました。Fedora以外のOSとしてaarch64版のRocky Linux 8.6でも動作確認しています。
次回Fedora IoTをつかったMicroShiftの利用について取り上げる予定です。
イメージのダウンロード
Rocky Linux 8.6イメージのダウンロード
Rocky Linuxを使う場合は次のURLから、Raspberry Pi用イメージをダウンロードします(README曰くRaspberry Pi3と4に対応)。ログイン方法やツーとパーティションの拡大などについてはREADMEに書かれています。
Fedora 36 Serverイメージのダウンロード
Fedoraを使う場合は次のURLから、Raspberry Pi用イメージをダウンロードします。ルートパーティションの拡大についてはRaspberry Pi 64ビット版FedoraのmicroSDカード容量拡張(Cockpit版)を参照。CLIで作業する方法もありますが、Cockpitは標準インストールされているのでこっちで作業したほうが簡単です。
イメージの書き込み
ダウンロードしたイメージをmicroSDなどに書き込みます。イメージ書き込みはいろいろな方法がありますが、 今回はRaspberry Pi Imagerを使いました。
ホスト名の設定(共通)
起動したらログインして以下のようにコマンドを実行し、ホスト名を設定します。
$ sudo nmcli general hostname microshift.tooyama.org
システムアップデート(共通)
システムアップデートを実施します。時間短縮のためにセキュリティパッチのみ適用することにしました。
$ sudo dnf update --security
CRI-Oのインストール
Rocky Linux 8.6へのCRI-Oインストール
多くのLinuxディストリビューションではCRI-Oは標準パッケージとして提供されていません(Fedoraは例外)。ただ開発元がざまざまなLinuxディストリビューション向けにパッケージを用意してくれています。これを使うことでRocky LinuxにもCRI-Oをインストールできます。
CRI-O 1.21をインストールしたいところですが、Rocky Linux 8.6だとライブラリーのバージョン要件があわないためEL 8.6でも動作するCRI-O 1.22をインストールします。インストール方法は、CentOS 8の手順のようにインストールします。
Fedora 36 ServerへのCRI-Oインストール
Fedoraの場合はdnfモジュールパッケージが用意されているため、こちらをインストールします。バージョンを変えれば1.22も導入できます。
$ sudo dnf module enable -y cri-o:1.21 $ sudo dnf install -y cri-o cri-tools
CRI-Oサービスの起動
起動と自動起動の設定を行います。起動しない場合はstatusなどで確認します。
sudo systemctl enable crio --now
ファイアウォールの設定
必要なポートを開放するため、Firewalledのフロントエンドであるfirewall-cmd
ツールを使って、ファイアウォール設定を行います。
複数行をペーストしても一行ごとに設定してくれるので安心してください。
$ sudo firewall-cmd --zone=trusted --add-source=10.42.0.0/16 --permanent sudo firewall-cmd --zone=public --add-port=80/tcp --permanent sudo firewall-cmd --zone=public --add-port=443/tcp --permanent sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent sudo firewall-cmd --zone=public --add-port=5353/udp --permanent sudo firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent sudo firewall-cmd --zone=public --add-port=30000-32767/udp --permanent sudo firewall-cmd --permanent --change-zone=eth0 --zone=public sudo firewall-cmd --zone=public --add-masquerade --permanent sudo firewall-cmd --zone=trusted --add-source=192.168.0.0/24 --permanent sudo firewall-cmd --reload
CGroup関連設定の追記(Fedora 36は不要)
/boot/cmdline.txtを開いて、カーネルパラメーターの末尾に以下を追記します(新しい行として追加しないように注意)。
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
設定を書いたら再起動します。
MicroShiftバイナリーをダウンロード
MicroShiftバイナリーファイルをGitHubからダウンロードします。 ダウンロードするときはアーキテクチャーに注意してください。
$ wget "https://github.com/openshift/microshift/releases/download/4.8.0-0.microshift-2022-04-20-182108/microshift-linux-arm64"
ダウンロードしたバイナリーに実行権限をつける
ダウンロードしたバイナリーを実行できるようにするため、実行フラグを付加します。
$ chmod +x microshift-linux-*
MicroShiftの実行
MicroShiftを実行するには、run
オプションをつけて実行します。
$ sudo ./microshift-linux-arm64 run
oc,kubectl CLIのインストール
CLIはユーザーで実行できるようにします。
$ curl -O https://mirror.openshift.com/pub/openshift-v4/$(uname -m)/clients/ocp/stable/openshift-client-linux.tar.gz $ sudo bash -c "tar -xf openshift-client-linux.tar.gz -C /usr/local/bin oc kubectl"
kubeconfigの設定
kubeconfigを設定します。必要に応じて、手元のクライアントにもCLIとkubeconfigを設定します。
$ mkdir ~/.kube $ sudo bash -c "cat /var/lib/microshift/resources/kubeadmin/kubeconfig > $HOME/.kube/config"
MiniShiftを利用したOpenShiftの利用
Podを確認
コマンドを実行して、すべてRunningであることを確認します。
$ oc get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system kube-flannel-ds-pkt49 1/1 Running 1 60m kubevirt-hostpath-provisioner kubevirt-hostpath-provisioner-t7v5g 1/1 Running 1 51m openshift-dns dns-default-72q6r 2/2 Running 2 60m openshift-dns node-resolver-6zkjm 1/1 Running 1 60m openshift-ingress router-default-85bcfdd948-wrdgg 1/1 Running 1 60m openshift-service-ca service-ca-7764c85869-65x4k 1/1 Running 3 60m
ノードを確認
ノードが実行中であることを確認します。
$ oc get nodes NAME STATUS ROLES AGE VERSION microshift.tooyama.org Ready <none> 61m v1.21.0
Podを作ってみる
公式のNginxイメージを使って、Podを作成してみます。
$ oc create deployment hello-pods --image=docker.io/nginx:stable-alpine deployment.apps/hello-pods created
サービスを作ってみる
先程のPodにNodePortサービスを割り当てて、アクセスできるようにします。
$ oc expose deployment hello-pods --type=NodePort --port=80 service/hello-pods exposed $ oc get svc hello-pods //この例の場合、ノードポートは30334 NAME TYPE CLUSTER-IP EXTERNAL-Ip PORT(S) AGE hello-pods NodePort 10.43.208.235 <none> 80:30334/TCP 23s
NodePortでアクセス
アクセスできれば成功。失敗する場合はPodやサービスが正常に作られているか、ポートが空いているかを確認。
$ curl http://192.168.0.56:30334 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
最初のアプリの片付け
問題なくPodやサービスが作成されて、アクセスできることを確認したら片付けます。
$ oc delete deployment hello-pods $ oc delete service hello-pods
Routes and Ingressesの検証
まずつぎのように実行して、アプリを作成したときのRouteで設定するドメイン、サブドメインを設定変更しておく。
$ oc -n openshift-ingress set env deployment/router-default ROUTER_SUBDOMAIN="\${name}-\${namespace}.microshift.tooyama.org" ROUTER_ALLOW_WILDCARD_ROUTES="true" ROUTER_OVERRIDE_HOSTNAME="true"
次に、アプリケーションをデプロイするため、プロジェクトを作成する。 OpenShiftの「プロジェクト」とは、KubernetesのNamespacesが該当する。
プロジェクトを作成すると、自動的にそのプロジェクトに切り替わります。
$ oc new-project demo-nginx Now using project "demo-nginx" on server "https://192.168.0.56:6443".
プロジェクトを作成するか変更したあと、アプリケーションをデプロイするフローを習慣にすると、 別のプロジェクトのコンテナなどは見えなくなるため、ごちゃごちゃしないでよい。
プロジェクト一覧は「oc projects」で確認できる。
$ oc projects You have access to the following projects and can switch between them with ' project <projectname>': default * demo-nginx kube-node-lease kube-public kube-system kubevirt-hostpath-provisioner openshift openshift-controller-manager openshift-dns openshift-infra openshift-ingress openshift-node openshift-service-ca Using project "demo-nginx" on server "https://192.168.0.56:6443".
プロジェクトを変更する場合は「oc project 」。
$ oc project default Now using project "default" on server "https://192.168.0.56:6443". $ oc project demo-nginx Now using project "demo-nginx" on server "https://192.168.0.56:6443".
アプリケーションをデプロイしてみる。 サンプルで利用したマニフェストには、DeploymentとService、Routeがそれぞれ書かれている。
$ oc apply -f https://raw.githubusercontent.com/benswinney/microshift-demos/master/nginx/nginx.yaml deployment.apps/demo-nginx created service/demo-nginx created route.route.openshift.io/demo-nginx created
デプロイメントとサービスを確認してみる。
$ oc get deployments NAME READY UP-TO-DATE AVAILABLE AGE demo-nginx 1/1 1 1 3m23s $ oc get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demo-nginx ClusterIP 10.43.165.73 <none> 8080/TCP 13s
Routeを確認してみる。Podへアクセスするためのアドレスが発行されている。
$ oc get routes NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD demo-nginx demo-nginx-demo-nginx.minishift.tooyama.org demo-nginx 8080 edge/Redirect None
これらは本来はDNSなどで名前解決する話ですが、今回はテストなのでアクセス用クライアントのhostsに書いて対応します。
$ sudo vi /etc/hosts 192.168.0.56 demo-nginx-demo-nginx.microshift.tooyama.org
アクセスしてみると、文字が出力されます。この出力はnginx.yaml
に書いてある内容が出ているだけで、何かを識別しているわけではないです。
$ curl -k https://demo-nginx-demo-nginx.microshift.tooyama.org Hello from MicroShift on Raspberry Pi 4 8Gb
ブラウザーのプロキシー設定やセキュアDNSの設定等によっては、ブラウザーからアクセスできない場合があるので注意します(例えばChromeやChromiumベースのブラウザーではアクセスできません)。
$ oc delete -f https://raw.githubusercontent.com/benswinney/microshift-demos/master/nginx/nginx.yaml deployment.apps "demo-nginx" deleted service "demo-nginx" deleted route.route.openshift.io "demo-nginx" deleted $ oc delete project demo-nginx project.project.openshift.io "demo-nginx" deleted $ oc project default Now using project "default" on server "https://127.0.0.1:6443".
今回はMiniShiftのセットアップと簡単な利用までを行いました。 プロジェクトを作成すると、oc new-appコマンドでアプリケーションの作成を行うことをおすすめされます。
$ oc new-project new-project Now using project "new-project" on server "https://192.168.0.56: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=k8s.gcr.io/e2e-test-images/agnhost:2.33 -- /agnhost serve-hostname
ヘルプで確認すると、oc new-app
コマンドでは例えばGitOps的なことができそうですね。
次回 次々回はこのあたりを試してみようと思います。
[08/29/2022 追記]
Gitソースを指定してアプリケーションを構築する関連の機能は、現時点のバージョンでは実装されていないようです(というよりもMicroShiftはEdgeで使う前提なので想定していない?)。
一般的な使い方については、問題なく動作するのを確認しています。
# oc new-project test-app # oc create -f sample-pods.yaml # oc create -f sample-service.yaml # oc get pod,svc NAME READY STATUS RESTARTS AGE pod/nginxapp1-7579cccdf9-jvdrb 1/1 Running 0 21s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginxapp1-lb LoadBalancer 10.43.77.200 <pending> 80:32715/TCP 15s