今回本当はRancher Labsの k3osを触ってこのブログでご紹介する予定だったのですが、次の情報によるとk3osはRancherOS 2に置き換えるようで、今は使うべきではないようです。 k3osをk3s.ioに移管してコミュニティベースでメンテナンスを継続する案も出ているようです。
Rancher LabsがSUSEに買収されて色々変わったのもあって、k3osのように独自Linuxディストリビューションベースのk3osはやめようとかそんな話になったのかもしれません(詳細はわかりません)。 というわけで今回は、もう一つの候補としてSUSEとコミュニティが開発しているMicroOS(正式にはMicro Service OSですが、以降MicroOSと表記しています)を触ってみることにしました。
その前にopenSUSEについて
SUSEという会社が商用でリリースしているのがSUSE Enterprise Linux。それのオープンソース版がopenSUSEです。 openSUSEには2つの提供形態があって、openSUSE LeapとopenSUSE Tumbleweedがあります。
openSUSE Leapは定期的にバージョンが切られるリリース形態で、はじめてopenSUSEを使う人には最適です。 openSUSE Tumbleweedはローリングリリース版で、特定のリリース間隔によらずに最新の安定版を提供するバージョンです。
双方のバージョンにも一般リリースのopenSUSE、コンテナワークロードに最適なMicroOSが用意されています。 今回利用するのはopenSUSE Tumbleweed版のMicroOSです。
今回M1 Mac miniで仮想マシンでopenSUSEを動かしたのですが、当初使おうと思っていたopenSUSE Leapは15.5 Alphaでもどのバージョンでもインストーラーが起動しなかったので、openSUSE Tumbleweed版を使っています。
MicroOSをセットアップ
次のURLからCPUアーキテクチャーに対応するMicroOSをダウンロードします。今回私の場合はaarch64版をダウンロードしました。
インストールは画面の指示に従ってポチポチするだけです。
再起動後、コンソールにrootユーザーでログインして、SSHログインするためのユーザーを作成します。
実行例
# useradd -m opensuse # passwd opensuse
useraddコマンド実行時に「/etc/nssitch.confなんてファイルはないよ」みたいなエラーが出ますが、無視します。 MicroOSは最小セットアップ、一部のディレクトリーは読み取り専用なファイルシステムで設計されています。 その都合みたいです。
最後に、次のようなコマンドでホスト名を設定しましょう。
# hostnamectl set-hostname microos1
k3sをセットアップ
あとは https://k8s.io を参考に次のコマンドを実行すれば、シングルノードのKubernetesの出来上がりです。
# curl -sfL https://get.k3s.io | sh - # systemctl enable --now k3s # k3s kubectl get no NAME STATUS ROLES AGE VERSION microos1 Ready control-plane,master 8m3s v1.24.4+k3s1
K3sが実行されるとエイリアスがはられるため、k3s kubectl
でもkubectl
コマンドでも操作可能になります。
以降はkubectl
コマンドを利用します。
アプリが動くかテスト
適当なアプリを実行してみましょう。問題なく動作するはずです。
# kubectl create deployment hello-pods --image=docker.io/nginx:alpine deployment.apps/hello-pods created # kubectl get po NAME READY STATUS RESTARTS AGE hello-pods-7874d9db77-l52qs 1/1 Running 0 21s # kubectl exec -it hello-pods-7874d9db77-l52qs -- nginx -v nginx version: nginx/1.23.1 # kubectl delete deployment hello-pods deployment.apps "hello-pods" deleted
ノードの追加
2台目のノードを追加する方法は、GitHubのREADMEに書かれています。
もう一つMicroOSノードを用意します。
1台目のノードで/var/lib/rancher/k3s/server/node-token
のファイルを開き、トークンキーを確認します。
追加したノードにトークンキーとKubernetes APIを指定して、次のコマンドのようにAPIアドレスとトークンを設定してk3sノードを追加します。デプロイが終わったら、k3s-agent.service
を起動します。これで、ノードがクラスターに追加されます。
実行例
# curl -sfL https://get.k3s.io | K3S_URL=https://192.168.205.104:6443 K3S_TOKEN=hogehugahogeeee sh - # systemctl enable --now k3s-agent.service
しばらくしてからkubectl get nodes
を実行すると、ノードが増えているはずです。これでマルチノードのKubernetesクラスターになりました。
# kubectl get no NAME STATUS ROLES AGE VERSION microos1 Ready control-plane,master 8m53s v1.24.4+k3s1 microos2 NotReady <none> 4s v1.24.4+k3s1 ... # kubectl get no NAME STATUS ROLES AGE VERSION microos1 Ready control-plane,master 9m2s v1.24.4+k3s1 microos2 Ready <none> 13s v1.24.4+k3s1
最終的には次のサービスが動きました。
追加ノードのテスト
追加したノードでコンテナーアプリケーションを実行できるかを試してみます。
あまり普通は使わないのですがnodeSelector
を使って、特定のノードを指定してデプロイしてみます。
apiVersion: v1 kind: Pod metadata: name: hello-rhubi9 spec: containers: - name: ubi9 image: docker.io/redhat/ubi9-micro:latest tty: true nodeSelector: kubernetes.io/hostname: microos2
作成したマニフェストでPodを作ってみます。
# kubectl create -f create-pod.yaml pod/hello-rhubi9 created # kubectl get -f create-pod.yaml -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES hello-rhubi9 1/1 Running 0 88s 10.42.1.3 microos2 <none> <none>
これにより、2台目のノード(本例では「microos2」)でPodが作られたことが確認できました。確認が終わったら、Podを削除します。
# kubectl delete -f create-pod.yaml pod "hello-rhubi9" deleted
MicroOSのメリット
MicroOSはインストール直後は1GB以下のストレージしか消費しません。その上、最低限必要なソフトウェア、ライブラリーしかセットアップされていません。 インストールされるパッケージが少ないということは、インストールは極めて短時間ですみます。 さらに一般的なx86サーバーだけでなく、aarch64アーキテクチャーでも動作します。仮想マシン、クラウド、各ハードウェア向けのイメージも用意されています。
コンテナベースのアプリケーション開発からプロダクションのエッジコンピューティング領域などで活用できるのではないかと思います(もちろん、その際はopenSUSE Leap Microをおすすめしますが)。 k3osの代替としてMicroOS + k3sは使えそうな感じがしました。