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

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

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

openSUSE MicroOS+K3sを使って開発用のKubernetesクラスターをサクッと用意する

今回本当は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版をダウンロードしました。

get.opensuse.org

インストールは画面の指示に従ってポチポチするだけです。

ライセンスの同意と言語の設定

インストールのロールの選択

これまでの設定の確認画面

再起動後、コンソールに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は使えそうな感じがしました。