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

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

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

microk8sのはじめ方

勉強のためにとか仕事で使うので...とか、Kubernetesを試してみたい時があると思います。 そんな時によく使われるのはminikubeだと思います。ちょっと前にこのブログでも記事が出ています。まだ見られていない方はぜひチェックしてみてください。

devops-blog.virtualtech.jp

今回は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ではマルチノードクラスターを構成することもできますが、これは同じマシン上に環境を作ってマルチノードに見せかけているだけで、実際に動いているのは同じホスト上です。

minikube.sigs.k8s.io

microk8sは完全に環境を分けてマルチノードを構成できます。3台以上のクラスターを構成すると高可用クラスターも構成できます。

https://microk8s.io/docs/clusteringmicrok8s.io

microk8sは一般的なx86マシンでも動作しますが、Raspberry Pi 4などのARM64アーキテクチャーのマシンでも動かすことが可能になっています。普段利用しているWindows, macOS, Linuxマシンへのインストールも可能です。

対応しているアーキテクチャーのマシンであれば動くので、パブリッククラウドのインスタンス上とか、OpenStackのようなプライベートクラウドのインスタンス上でも動かすのも可能です。

minikubeとの共通点

minikubeはアドオンを使ってクラスターの機能追加が簡単に行えます。

minikube.sigs.k8s.io

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を使ってみてください。

こちらにいろいろなチュートリアルが用意されています。

https://microk8s.io/tutorialsmicrok8s.io