Ubuntu Weekly Recipe

第641回 LXDとmicrok8sでシングルサーバーをKubernetesクラスターにする

この記事を読むのに必要な時間:およそ 9.5 分

第560回のmicrok8sでお手軽Kubernetes環境構築では,⁠シングルノードのみに対応したKubernetes環境構築ツール」としてmicrok8sを紹介しました。その後,このmicrok8sは大幅な進化を遂げて「特定のプロダクション用途でも使える」までになっています。今回はそのmicrok8sに最近追加された,高可用性クラスター機能について紹介しましょう。

密に開発されクラスターにも対応したmicrok8s

第560回の記事が公開されたのはmicrok8sのv1.13がリリースされ,Canonicalとしてもmicrok8sの利用をアピールしだした時期でした。当時はシングルノードにしか対応していないことに加えて,ARM64のサポートを拡充していったことからもわかるように,開発者によるKubernetesの学習用や組み込み用のシンプルなアプリケーションの実行用を主なユースケースとして想定していたようです。

しかしながら世の中の「簡単に導入できるKubernetes環境」への渇望は凄まじく,すでに同等のMinikubeというツールがあるにも関わらず,microk8sの開発者も機能もどんどん増えていくことになりました。第560回ではmicrok8sの「ウィークポイント」として紹介していたマルチノード対応も半年後の2019年9月のv1.16で正式に対応していますし,1年後のv1.18ではWindowsやmacOSへのインストールもサポートされるようになりました※1⁠。今年の8月にリリースされたv1.19に至っては,高可用性クラスタリング機能にも対応したのです※2⁠。

※1
Ubuntu以外のインストール方法については,microk8sのドキュメントにあるWindowsへのインストール方法macOSへのインストール方法をそれぞれ参照してください。
※2
microk8sのバージョンは,サポートするKubernetesのバージョンに準じています。

Canonicalによるアナウンスでも,組み込み機器用・学習用としてだけでなく,日常的なメンテナンスが難しい環境での利用も提案しており,Canonicalによるエンタープライズ向けのサポートを行うことも明言しています※3⁠。

※3
microk8sはワークステーションのような「ちょっと強い」サーバーなどでの利用を想定しているようです。本格的なサーバークラスターで構築する場合は,Charmed Kubernetesと呼ばれるMAASやJujuを組み合わせて構築する環境を推奨しています。

他にもKubeflowやMultusといった人気のアドオンもサポートしている上に,⁠ぐぐったらそれなりに使っている人がいる」ようになったため,⁠Kubernetesを試せる環境を,ちゃちゃーっと社内に用意しておいてくれない?」とかいう上司の非情な要求にも対応できるソリューションに成長したのです。

今回はこのmicrok8sの,クラスター機能と高可用性機能(High Availability機能)について紹介します。とは言え,一般のご家庭にはクラスターを組める台数のマシンは存在しないでしょう。そこでLXDと組み合わせて,⁠ちょっと強い1台のマシン」の上でクラスター化を試みます。

仮想マシン版LXDインスタンスの準備

microk8sそのものはただのKubernetesのインストーラーでしかありませんので,コンテナ版のLXDインスタンスの上でも動きます。しかしながらコンテナ版のLXDでKubernetesを動かすには,名前空間のネストやその他各種権限の調整が必要です。また物理マシンのクラスターをエミュレーションする観点に立つと,仮想マシンを利用したほうがより実態に近くなります。よって今回は仮想マシン版のインスタンスで構築します※4⁠。

※4
コンテナ版の構築手順は公式のドキュメントにある構築手順を参照してください。

おおよそmicrok8sが動くマシンに必要なリソースは次のとおりです。

  • CPU:「2コア x ノードの数」だけCPUコアが必要です。ただしKVMの場合はインスタンスがCPUを占用する必要はありませんし,昨今のそれなりのマシンはCPUのコアが十分に多いと思いますので,そこまで気にする必要はないでしょう。
  • メモリー:最低でも「2GiB x ノードの数」はほしいところです。これもノートPCでもない限り,困ることはないでしょう。
  • ストレージ:microk8sの上で何を動かすかに強く依存します。今回の手順のように本当に小さなコンテナを動かすだけであれば10GiBでも十分です。

ちなみにVirtualBox等の上にインストールしたUbuntuの上で構築することも可能です。VirtualBoxの上で仮想マシン版のLXDを動かす場合は,Nested KVM機能を有効化しておいてください。LXDで仮想マシンインスタンスを作っている部分をVirtualBox上のUbuntuインスタンスに置き換えてもらっても問題ありません※5⁠。もちろんVirtualBoxのインスタンスそのものに,上記に準じたスペックが必要になります。

では,実際にUbuntu 20.04 LTS上のLXD 4.0を利用して仮想マシンを作成しましょう。LXDの仮想マシン機能に関する詳細は第609回のLXDからコンテナではなく仮想マシンを起動するを参照してください。ちなみに当時のLXD 3.19では,cloud-initを利用してアカウントを作成する必要がありましたが,LXD 4.0までに仮想マシン機能が大幅にブラッシュアップされた結果,その手順は不要になりました。LXDそのものについては第521回から始まるLXD関連の記事で解説しています。

※5
要するに1台の強力なVirtualBoxインスタンス上にUbuntuを入れてその上で本記事で説明するようにLXDで複数ノードを作る方法と,LXDは利用せずにVirtualBoxで複数のUbuntuインスタンスを作りそこにそれぞれmicrok8sをインストールする方法の2パターンが考えられるということです。

HA機能を利用するためには最低でも3台のマシンが必要です。よってまずは以下の手順で3台の仮想マシンを作成してください。

$ lxc launch ubuntu:20.04 k8s0 --vm -c limits.cpu=2 -c limits.memory=4GiB
$ lxc launch ubuntu:20.04 k8s1 --vm -c limits.cpu=2 -c limits.memory=4GiB
$ lxc launch ubuntu:20.04 k8s2 --vm -c limits.cpu=2 -c limits.memory=4GiB

--vmで仮想マシンの作成を指定しています。

LXDの仮想マシンインスタンスは何も指定しないと「CPU 1個,メモリ1GiB,ストレージ10GiB」で作成してしまいます。そこで上記ではCPUの数とメモリのサイズを明示的にしています。インスタンス作成後にlxc config set インスタンス名 limits.memory 4GiBと指定してもかまいません。他にもインスタンスタイプで指定する方法もあります。これはAWSのように-t t2.microのような名前で一括してリソースを設定する方法です。名前とリソースの対応表はinstance-typeリポジトリからリンクしているURLを参照してください。

ストレージのサイズも変えたい場合は次のように実行してください。

$ lxc stop k8s0
$ lxc config device override k8s0 root size 40GiB
$ lxc start k8s0

仮想マシンインスタンスの場合,ストレージサイズはシャットダウン状態でのみ変更できます。そこで一旦lxc stopなどでシャットダウンした上で実行してください。lxc config device overrideはルートファイルシステムやeth0のように,プロファイルから継承・生成されたデバイスに対して特定の設定だけを変更したい場合に有効なコマンドです。

必要ならミラーサーバーを設定し,パッケージを最新に更新して,再起動しておきましょう。

$ lxc exec k8s0 -- sed -i 's/archive.ubuntu/jp.archive.ubuntu/' /etc/apt/sources.list
$ lxc exec k8s0 -- sh -c 'apt update && apt full-upgrade -y'
$ lxc restart k8s0 k8s1 k8s2

この3台の仮想マシンインスタンスがKubernetesクラスターの「ノード」になります。ちなみに仮想マシンの場合,lxc restartに時間がかかってタイムアウトエラーが発生するかもしれません。その場合は,lxc statusですべてシャットダウンされたかを確認した上で,手動でlxc startを実行してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。