勉強のためにとか仕事で使うので...とか、Kubernetesを試してみたい時があると思います。 そんな時によく使われるのはminikubeだと思います。ちょっと前にこのブログでも記事が出ています。まだ見られていない方はぜひチェックしてみてください。
今回はminikubeではなく、microk8sをご紹介します。microk8sとminikubeの違い、microk8sが優れている点などをご紹介できればと思います。
microk8sとは
「マイクロケーエイトエス」と読みます。日本人は「マイクロケーハチエス」なんて呼んだりしますかね?microk8sは「Lightweight Kubernetes」を掲げています。ゼロオペレーションでKubernetesクラスターの実行を開発から本番の環境まで実行可能なソフトウェアとして開発されています。
https://microk8s.io/microk8s.io
minikubeとの違い
microk8sとminikubeの大きな違いは、minikubeはバイナリーのインストール後にminikube start
のように環境を作ってクラスターを実行する必要がありますが、microk8sはインストールすると自動的にシングルクラスターが立ち上がります。
minikubeでクラスターを実行するときに何気なしにminikube start
と実行しているかと思いますが、minikubeはいろいろなプラットフォームや構成で実行できる反面、オペレーションが複雑になりがちです。たとえば、コンテナベースで動かすのかVMベースで動かすのか。OSによって利用できる環境 は異なりますし、バージョンや組み合わせによってうまく動かないという可能性もありえます。動かすホストのOSのバージョンによって取れない構成などもあったりします。
さらにminikubeではマルチノードクラスターを構成することもできますが、これは同じマシン上に環境を作ってマルチノードに見せかけているだけで、実際に動いているのは同じホスト上です。
microk8sは完全に環境を分けてマルチノードを構成できます。3台以上のクラスターを構成すると高可用クラスターも構成できます。
https://microk8s.io/docs/clusteringmicrok8s.io
microk8sは一般的なx86マシンでも動作しますが、Raspberry Pi 4などのARM64アーキテクチャーのマシンでも動かすことが可能になっています。普段利用しているWindows, macOS, Linuxマシンへのインストールも可能です。
対応しているアーキテクチャーのマシンであれば動くので、パブリッククラウドのインスタンス上とか、OpenStackのようなプライベートクラウドのインスタンス上でも動かすのも可能です。
minikubeとの共通点
minikubeはアドオンを使ってクラスターの機能追加が簡単に行えます。
microk8sにも同じようなアドオンを追加する仕組みが実装されています。導入できるアドオンは以下にまとまっています。
https://microk8s.io/docs/addonsmicrok8s.io
microk8sにはCoreアドオンとCommunityアドオンが用意されており、Coreアドオンは開発元のCanonicalがメンテナンスを行っています。Communityアドオンは名前の通り各コミュニティがメンテナンスを行なってる機能であり、代表的なものはKnative、Ingressコントローラーのtraefik、コンテナストレージのOpenEBS、サービスメッシュプラットフォームのIstio、GitOpsを提供するArgocd、ログやモニタリングを提供するFluentdなど、様々なアドオンが用意されています。
microk8sは対応するアドオンが増えてきたのに伴って、K8sクラスターで必須の機能と追加機能にアドオンを分離し、Core機能に集中する戦略をとったようです。Core機能は各バージョンのmicrok8sでテストされていますが、CommunityアドオンについてはK8sのバージョンやクラスターの構成などによっては動作しない場合があるので、動作要件については各コミュニティが提供するドキュメントの確認が必要です。
使ってみる
シングルノードクラスターの実行
まずはシングルノードインストールしてみましょう。各OSによるmicrok8sのインストールについては公式の情報 を見ていただくことにして、本例ではUbuntuで動かす方法についてご紹介します。Ubuntu以外のLinuxで動かす場合はInstalling snapd をご覧ください。ちなみに、今回取り上げた範囲ではどのLinuxでも同じように動きます。筆者はFedoraやRHEL8などで動かしたこともあります。
最新のバージョンのK8sクラスターを動かしたい場合は次のように実行するだけです。
sudo snap install microk8s --classic
バージョンを指定したい場合は、まずsnap info microk8s
で提供されているmicrok8sのsnapパッケージを確認して、次のように実行します。たとえば1.25のクラスターを導入したい場合は...
sudo snap install microk8s --channel=1.25/stable --classic
数分程度待つと、K8sクラスターを実行できます。
microk8s kubectl get nodes
マルチノードクラスターの実行
まず、追加するノードでもシングルノードで動かしたようにmicrok8sをインストールします。
sudo snap install microk8s --channel=1.25/stable --classic
そのあと、1台目のマシンでmicrok8s add-node
コマンドを実行して、画面上に出力されたmicrok8s join
コマンドを追加するノードで実行するだけです。--worker
フラグをつけて実行すると、追加したノードではコントロールプレーンのサービスは実行されなくなるようです。
1台目で実行
まずは1台目のマシンでmicrok8s add-node
を実行します。なお、このコマンドは基本的に1台のノードを追加するたび実行します。
esxinode1:~$ microk8s add-node From the node you wish to join to this cluster, run the following: microk8s join 172.17.28.51:25000/391ff526aaf200718d9d66875d0686f0/1e9571fe3b7e Use the '--worker' flag to join a node as a worker not running the control plane, eg: microk8s join 172.17.28.51:25000/391ff526aaf200718d9d66875d0686f0/1e9571fe3b7e --worker If the node you are adding is not reachable through the default interface you can use one of the following: microk8s join 172.17.28.51:25000/391ff526aaf200718d9d66875d0686f0/1e9571fe3b7e
2台目で実行
追加するノードで、先ほど確認したmicrok8s join
コマンドを実行します。
esxinode2:~$ sudo microk8s join 172.17.28.51:25000/391ff526aaf200718d9d66875d0686f0/1e9571fe3b7e --worker Contacting cluster at 172.17.28.51 The node has joined the cluster and will appear in the nodes list in a few seconds. This worker node gets automatically configured with the API server endpoints. If the API servers are behind a loadbalancer please set the '--refresh-interval' to '0s' in: /var/snap/microk8s/current/args/apiserver-proxy and replace the API server endpoints with the one provided by the loadbalancer in: /var/snap/microk8s/current/args/traefik/provider.yamlesxinode2:~$ sudo microk8s join 172.17.28.51:25000/391ff526aaf200718d9d66875d0686f0/1e9571fe3b7e --worker
1台目で確認
ご覧のように、あっという間にKubernetesクラスターの出来上がりです。
esxinode1:~$ microk8s kubectl get nodes NAME STATUS ROLES AGE VERSION esxinode1 Ready <none> 9m46s v1.25.4 esxinode2 Ready <none> 81s v1.25.4
雑多なコマンド周りのはなし
コマンドを実行するたびに頭にmicrok8s
を打つのが面倒な場合は、sudo snap alias microk8s.kubectl kubectl
コマンドを実行してエイリアスを設定できます(これはsnapdの機能です)。これで、kubectlコマンドだけで操作できるようになります。
また、kubeconfigはmicrok8s config > microk8s-config
で出力できます。IPリーチャブルである必要はありますが、他のクライアントからkubectl CLIを使ってクラスターの操作が可能になります。
アドオンを追加してみる
次のようにmicrok8sに、様々な機能を追加できます。たとえば、開発用のコンテナイメージを管理するためのregistryをデプロイするには、次のように実行します。基本的に追加したアドオンに依存するアドオンは、自動的に有効化されます。
esxinode1:~$ microk8s enable registry Infer repository core for addon registry Infer repository core for addon hostpath-storage Enabling default storage class. WARNING: Hostpath storage is not suitable for production environments. deployment.apps/hostpath-provisioner created storageclass.storage.k8s.io/microk8s-hostpath created serviceaccount/microk8s-hostpath created clusterrole.rbac.authorization.k8s.io/microk8s-hostpath created clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath created Storage will be available soon. The registry will be created with the size of 20Gi. Default storage class will be used. namespace/container-registry created persistentvolumeclaim/registry-claim created deployment.apps/registry created service/registry created configmap/local-registry-hosting configured esxinode1:~$ microk8s status -a registry enabled
追加したレジストリーの使い方はHow to use the built-in registry の通りです。
microk8sの片付け
microk8sが不要になったら、次のように実行するだけです。
sudo snap remove microk8s
これでスッキリしました。
snapパッケージは基本的にいい感じに動いてくれるので、ホストの再起動が必要だからいきなりreboot
コマンドで再起動しても数分程度で元に戻るので、その点も気軽で良いです(ただし複数台からなるクラスターの場合、クラスター情報が壊れる可能性もあるので、ちゃんとバックアップをこまめにとるかDrainを使う方が安全です。推奨は3台以上のクラスターで動かすことです)。
https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/
まとめ
コンテナベースのアプリケーション開発にminikubeを多くの人は使われていると思います。 microk8sも結構簡単に使うことができますので、micnikubeは使ったことがあるけどmicrok8sはまだという方がいらっしゃいましたら、ぜひmicrok8sを使ってみてください。
こちらにいろいろなチュートリアルが用意されています。