とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

MicroShiftを動かしてみる

今回のネタについて

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で使う前提なので想定していない?)。

github.com

一般的な使い方については、問題なく動作するのを確認しています。

# 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