microk8sによるプライベートクラウド構築およびminikubeによる開発/検証環境の構築

Kubernetes環境のHA(高可用性)クラスターを構築するには、お使いのパソコンまたはサーバーのCPUのコア数が4つ以上あることが前提です。メモリは、最低でも16GB以上が必要です。メモリ16GBのパソコンの場合は、スペックがぎりぎりなので、コンテナや仮想環境関係以外のアプリは可能な限り終了しないと、パソコンがリソース不足でフリーズします。

したがって、メモリ16GBを含め、メモリ16GB以下の場合は、minikubeに取り組むことを推奨します。

Kubernetesは、クラウドのOS(基本ソフト)と呼ばれます。ここではKubernetesを導入する手段として、microk8sとminikubeを用います。microk8sによるプライベートクラウドとして使えるKubernetesクラスターの作り方と、仮想マシン1台で開発や検証向けのKubernetesクラスターを構築するminikube(みにくべ、みにくーべ)について説明します。

目次

Kubernetesベースのプライベートクラウド構築 = Newオンプレミス

コンテナオーケストレーションツールの「Kubernetes」が登場して以降、Kubernetesは、クラウドOSと言われています。OS、つまり基本ソフトです。事実、Kubernetesの元々の設計・作成は、Googleであり、多くの人がクラウドコンピューティングの例として取り上げるGoogleのサービスは、大量のコンテナで運用されています。

大量のコンテナを運用するツールとして、Kubernetesの前身でGoogle内で設計・作成・運用されたものが、オープンソースソフトウェアとして公開され、現在のKubernetesとなっています。つまり、規模の違いはありますが、Kubernetesを使うことで、自分たち専用のクラウドコンピューティング環境、つまりプライベートクラウドを構築することができます。

プライベートクラウドといえば、VM(仮想マシン)で構成させることが多いですが、現在はコンテナといったクラウドネイティブな技術で構成したプライベートクラウド = Newオンプレミス の手法が広まりつつあり、特に、ゲーム等のエンターテイメント、IoTやAI (人工知能)が関わる場合は、クラウドネイティブな技術を使った方が、急なアクセス増加対応、アップデート時にシステムを止めずに継続運用といったニーズに対応することができるため好まれる。

 

<< Newオンプレミス = クラウドネイティブ前提のプライベートクラウドイメージ図 >>

役割

プライベートクラウドを構成する基盤名

役割

必要となる、仮想マシンまたは物理マシンの台数

プライベートクラウドを構成する基盤名

役割

必要となる、仮想マシンまたは物理マシンの台数

Kubernetes(略称 k8s)

スケールアウトによる負荷分散や障害時の自動復旧が必須と判断されるアプリケーションは、Kubernetes上での運用が考えられる。

3台以上

Docker Engine(略称 Docker)

k8sのマネジメントツールである「Rancher」や「Portainer」は、Docker Engine上でコンテナとして稼働する。その他、k8sよりも、Dockerの方が向いていると判断したアプリケーションも動かす。

1台以上

Other

k8sやDockerにおけるコンテナ以外のものは、Other、つまり仮想マシンや物理マシン上で動かす。たとえば監視システムやオブジェクトストレージ、NFS(ネットワークファイルシステム)、 cバックアップシステム等がある。

1台以上

 

シングルノード構成でKubernetes環境を構築する場合 ( minikube )

CPU 4コア、メモリ16GBのパソコンでも、情報技術やデジタル技術を学ぶ上ではぎりぎりのスペックですが、それを満たさないパソコンを使っている場合、あるいは、HA(高可用性)構成のようなクラスター環境ではなく、開発や検証につかうKubernetes環境を用意する方法について説明します。

Macの場合

Intel CPU搭載のMacおよびApple Silicon搭載のMacで、minikubeを使い、Kubernetes環境を構築する手順を説明します。

homebrew の有無を確認

homebrewがインストールされているかどうかの確認

brew --version

homebrewのバージョン情報が表示されれば、homebrewがインストールされていることになる。アップデートが必要な場合は、次のコマンドを実行する。

brew update brew --version

アップデートが出来れば、homebrewを改めてインストールする必要はない。「homebrewのインストール」を飛ばす。

homebrew のインストール

macおよびLinux用パッケージマネージャである「homebrew」を、次のコマンドを実行してインストール。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Enterキーを押す

ところどころ、Macのパスワード入力を求められるので、パスワード入力を求められた場合は、パスワードを入力し、Enterキーを押す。

インストール結果と次の指示が表示されるので、表示された指示に従って進める。

実行例 ( 各自で異なるので、必ず画面で指示されたコマンドを実行 )

実行結果

minikubeを動かすプラットフォーム選び

Hyperkitの確認 ( Intel搭載Macの場合 )

Mac用ハイパーバイザーの「Hyperkit」の有無を確認する必要があり、次のコマンドを実行する。

実行結果

Hyperkitが入っていれば、次のように表示される。この場合は、kubectlのインストールに進む。

Hyperkitが入っていない場合、次のように表示される。この場合は、homebrewを使って、hyperkitをインストールします。

Docker Desktopの確認 ( Apple Silicon搭載Macの場合 )

Applie Silicon搭載MacではHyperkitをサポートしていないため、Docker を使うことが手軽です。Macのアプリケーションディレクトリに、Dockerのアイコンがあるか確認しましょう。Dockerのアイコンがあれば、Docker Desktopはインストール済みとなるので、Dockerのアイコンをダブルクリックして、Docker Desktopを起動します。

インストールされていない場合は、Docker Desktopをダウンロードしてインストールしてください。https://www.docker.com/products/docker-desktop/ << こちらにアクセスしてダウンロード。

kubectl のインストール

Kubernetesを制御するツール、kubectl をインストールするために、次のコマンドを実行する。

インストールしたkubectlのバージョン確認を行うため、次のコマンドを実行する。

実行結果

minikube のインストール

シングルノードのKubernetees環境を構築する、「minikube」をインストールするため、次のコマンドを実行する。

インストール確認として、バージョン確認コマンドを実行

実行結果

minikubeの使い方を確認する場合は、ヘルプコマンドを実行すれば良い。

クラスター「minikube」の起動

次のコマンドを実行します。

途中、Macのパスワード入力を求められるので、パスワードを入力し、Enterキーを押す。

minikubeで使用するVM(仮想マシン)ブートイメージのダウンロードが始まる。

起動に成功すると、実行結果として次のように表示される。

クラスター「minikube」の起動確認

次のコマンドを実行します。

実行結果

全てのネームスペースのpodと、podが稼働するノードについて取得してみる。

実行結果

これで、minikube を使えるようになったことが確認できた。

クラスター「minikube」の停止

minikubeでの操作を止めたい時に行うための説明です。
停止には、次のコマンドを実行します。

実行結果

クラスター「minikube」の削除

minikubeでの操作が終わった時、あるいは、「minikube start」でなんらかのトラブルにあい、やりなおしたい時には「delete」を行います。
削除する際には、次のコマンドを実行します。

Linuxの場合 (WSL2やVM、ベアメタルマシン)

WindowsでWSL2を使って、Ubuntuを使っている場合はこちらの手順を使ってください。

Dockerをインストール

minikubeの実行基盤として、dockerを用いるため。下記は、Ubuntu 20.04 / Ubuntu 22.04 を使用した場合。次のコマンドを一行ずつコピー&貼り付けを行って実行。

sudoなしでDockerを実行できるにするために、次のコマンドを実行する。

GUI環境を使っていない場合

一度ログアウト

再度SSH接続を行います。WSL2を使っている場合は、画面が閉じるので、再度Ubuntuを実行すること。

GUI環境を使っている場合

GUI環境を使っている場合は、再起動してください。

kubectlのインストール

minikube含め、Kubernetes環境を制御するために、kubectlをインストールする。

CPUが、intel / AMD の場合

kubectlのバイナリをダウンロードする

kubectlをインストールする。

CPUが、Apple M1/M2/M3など、ARM系の場合

kubectlのバイナリをダウンロードする

kubectlをインストールする。

minikube のインストール

次のコマンドを実行して、minikubeをインストールする。

インストール確認として、バージョン確認コマンドを実行

実行結果

minikubeの使い方を確認する場合は、ヘルプコマンドを実行すれば良い。

クラスター「minikube」の起動

次のコマンドを実行します。

途中、Linuxのパスワード入力を求められるので、パスワードを入力し、Enterキーを押す。minikubeで使用するVM(仮想マシン)ブートイメージのダウンロードが始まる。ログを見ると、Dockerを基盤に使っていることがわかる。

起動に成功すると、実行結果として次のように表示される。

クラスター「minikube」の起動確認

次のコマンドを実行します。

実行結果

全てのネームスペースのpodと、podが稼働するノードについて取得してみる。

実行結果

これで、minikube を使えるようになったことが確認できた。

クラスター「minikube」の停止

minikubeでの操作を止めたい時に行うための説明です。
停止には、次のコマンドを実行します。

実行結果

クラスター「minikube」の削除

minikubeでの操作が終わった時、あるいは、「minikube start」でなんらかのトラブルにあい、やりなおしたい時には「delete」を行います。
削除する際には、次のコマンドを実行します。

実行結果

「minikube start」を実行すると、再び、minikube環境が構築される。

Windowsの場合

Windows 搭載のパソコンで、minikubeを使い、Kubernetes環境を構築する手順を説明します。
Windows 10 以降を使用しましょう。Windows 7 や 8、8.1はサポートが終了してますので、使用は危険です。

VirtualBoxのインストール

スタートメニューに「Oracle VM VirtualBox」が表示されていれば、VirtualBoxがインストールされていることになります。
また、VirtualBoxを起動すると、次のように表示されます。

インストールされていない場合は、VirtualBoxをダウンロードしてインストールしてください。https://www.virtualbox.org/ << こちらにアクセスしてダウンロードしましょう。

なお、VirtualBoxを使えない場合は、Hyper-VやDocker Desktopを使って、minikubeを起動することもできます。Hyper-Vは、通常は無効化されていますが、Windowsの基本機能として備わっているハイバーバイザーです。

Python3とpipのインストール

Python3 のインストール

Microsoft Storeを使って、Pythonのインストールを行う。「Microsoft Store」は、スタートメニューから起動することができる。Microsoft StoreからPython 3.11 をインストール。Python 3.10 でもよい。

pip のバージョンアップ

pipを最新版にバージョンアップする。次のコマンドを実行。

Chocolatey のインストール

Chocolateyは、Chocolatey Software社が開発しているWindows向けのパッケージ管理ツール、ソフトウェアインストールツールです。MacやLinuxであれば、homebrewのようなものです。コマンドラインで操作します。Chocolateyのインストールには、PowerShellを管理者として実行する必要があります。

Windowsのスタートメニューで、「PowerShell」を探し、「管理者として実行する」をクリックします。PowerShellは、Windows 7 以降に標準搭載されているCLIツールです。

PowerShell上で、次のコマンドを実行します。

インストールが出来たかどうか確認するため、バージョン確認を行います。次のコマンドを実行します。

実行結果 ( 2023年4月5日現在 )

Chocolatey をしばらく使っていなかった場合のバージョンアップ方法

しばらく使っていなかった場合、バージョンアップには次のコマンドを実行します。

確認が表示されるので、yes と入力し、Enterキーを押します。

kubectl のインストール

chocolateyを使って、kubectlのインストールを行う。次のコマンドを実行。

確認を求められるので、yes を入力し、Enterキーを押す

インストールしたkubectlのバージョン確認を行うため、次のコマンドを実行する。

実行結果

minikube のインストール

chocolateyを使って、minikubeのインストールを行う。次のコマンドを実行。

インストール確認として、バージョン確認コマンドを実行

実行結果

minikubeの使い方を確認する場合は、ヘルプコマンドを実行すれば良い。

クラスター「minikube」の起動

次のコマンドを実行します。

途中、Windowsのパスワード入力を求められるので、パスワードを入力し、Enterキーを押す。

minikubeで使用するVM(仮想マシン)ブートイメージのダウンロードが始まる。

起動に成功すると、実行結果として次のように表示される。( Windows 11 Pro を使っている場合 )

クラスター「minikube」 の起動確認

VirtualBoxを使っている場合は、VirtualBoxの画面に、起動中のminikube用仮想マシンが表示されます。

次のコマンドを実行します。

実行結果

全てのネームスペースのpodと、podが稼働するノードについて取得してみる。

実行結果

これで、minikube を使えるようになったことが確認できた。

クラスター「minikube」の停止

minikubeでの操作を止めたい時に行うための説明です。
停止には、次のコマンドを実行します。

実行結果

クラスター「minikube」の削除

minikubeでの操作が終わった時、あるいは、「minikube start」でなんらかのトラブルにあい、やりなおしたい時には「delete」を行います。
削除する際には、次のコマンドを実行します。

実行結果

クラスター「minikube」の起動でエラーが起きた場合、別のプラットフォームでminikubeを起動する方法

Hyper-V、Hyperkit、VirtualBoxなど、様々なプラットフォーム上でminikubeは起動できます。ここでは、VirutalBox上でminikubeを起動しようとしたが、エラーが生じたため、Docker Desktopを使ってminikubeを起動し直す方法について説明します。

たとえば、「minikube status」を実行した際に、次のように表示され、minikubeが正常に起動しなかった場合が考えられます。

エラー状態とはいえ、minikubeのクラスターができているの削除します。

Docker Desktopを起動します。インストールされていない場合は、https://www.docker.com/products/docker-desktop/ からインストーラーをダウンロードしてインストールしてください。

minikubeのドライバーとして、Dockerを指定し、minikubeを起動します。

クラスター「minikube」 の起動確認のため、次のコマンドを実行します。

実行結果

正常に起動したことを確認しました。

djangoプロジェクトをKubernetes環境で動かす手順 ( Helm 非使用 )

Kubernetes環境として、minikube を使います。Mac環境を例に説明しています。

MacおよびLinuxではターミナルアプリを前提に書いています。Windows環境の場合は、管理者モードで実行したPowerShellを使いましょう。

必要な環境

  • minikube環境

  • Python3 << Python3.10.10 以上で確認済み

  • pip << pip 23.0 で確認済み

pyenvによるPythonのインストール (既にPython環境がある場合は飛ばす)

pipenvをインストールするため、Python環境を整える必要があり、pyenvをインストールします。

Python 3.11.9 のパスを通すために、次のコマンドを実行します。

Pythonのパスが通り、pyenvを使ってインストールした、Python 3.11.9 のパスが通っているか確認します。

実行結果

pipenvのインストール

Pythonには、pipがインストールされているので、pipを使って、pipenvをインストールします。次のコマンドを実行します。

実行結果

djangoのインストールおよびプロジェクトの作成、設定

作業用ディレクトリの作成と、作業用ディレクトリへの移動

django および関連ソフトウェアのインストール ( django は基本として、あとはそれぞれよく使うもの )

django プロジェクトの作成

次のコマンドを実行することで、project 1という名前のプロジェクトができがる。project 1 ディレクトリも作成される。

プロジェクトの名前を付けるとき、組み込みの Python モジュールや Django のコンポーネントの名前を使わないようにしましょう。

django プロジェクトの設定を調整するため、次のコマンドを実行します。

開発/検証環境として使うため、「settings.py」の「ALLOWED_HOST」では、ワイルドカードを使い全ての接続を許可するように設定。

「settings.py」の「INSTALLED_APPS」で、django-filterなどdjango関連のソフトウェアについて記述します。

「settings.py」で、言語や時間設定箇所を変更します。

django向けDockerfileの作成

Kubernetes環境では、Dockerfileをもとにビルドして作成したコンテナイメージを使います。

Dockerfile の記述内容はこちら

本番環境向けのDockerfileを作成する場合は、「python manage.py collectstatic」や「pipenv run gunicorn」の実行に対応するように、Dockerfileを記述する必要がある。

クラスター「minikube」の起動

既にminikubeが起動済みの場合は、この操作は飛ばしてください。

ローカルのdockerから、minikube上のdockerに切り替え

コンテナイメージの作成

Dockerfileをビルドして、コンテナイメージを作成します。

ビルドしたコンテナイメージを確認する

実行結果 << ビルドした、コンテナイメージ 「myimage/django:1」が表示されていることがわかる。

Kubernetes向けマニフェストファイル(YAMLファイル)の作成

ビルドしたコンテナイメージを使って、Kubernetes環境にデプロイするための、定義ファイルであるマニフェストファイルを作成します。

djangoapp.yaml の記述内容はこちら

Kubernetesにデプロイ

実行結果

Webブラウザで起動確認

minikubeを使っているので、minikubeの作法により、minikube service サービス名を実行することで、Webブラウザが起動し、「djangoapp.yaml」で定義し、デプロイしたKubernetes Service「django-svc」を中継するトンネルを作り、Kubernetes環境の外からアクセスできるようにします。

Webブラウザで、次のように表示されます。django が動いていることがわかります。

Kubernetes Serviceは、podに対する外部からアクセスに対する公開、負荷分散、およびサービス検出を行う仕組みです。minikubeでは、minikubeが動くパソコン(ローカルという)から、minikubeで動くKubernetes環境には直接接続ができないため、トンネルと呼ばれる中継ネットワークを設けてローカルから、Kuberbetes上で稼働するアプリケーションに接続できるようにします。

ターミナルに表示される実行結果のURLは、各自の環境によって異なります。

作業を再開したい時は、Ctrl + c キーを押すことで、minikube service が停止します。

Helmチャートを使って、minikubeにアプリケーションをデプロイする場合

Kubernetes環境として、minikube を使います。

Helmをインストール

Kubernetesのパッケージ管理ツールである「Helm」をインストールします。

Macの場合

Homebrewを使って、Helmをインストールします。次のコマンドを実行します。

Linuxの場合

インストール用のスクリプトファイルをダウンロードして、Helmをインストールします。次のコマンドを実行します。

 

Windowsの場合

Chocolateyを使って、Helmをインストールします。次のコマンドを実行します。

確認を求められるので、yes を入力し、Enterキーを押す

Helmチャート用リポジトリの追加

Helmチャートを配布しているリポジトリを登録します。

実行結果

もしリポジトリを最新の状態にする必要がある場合は、次のコマンドを実行します。

HelmチャートによるWordPressのデプロイ

Helmチャートによるデプロイ

minikubeで、次のコマンドを実行します。コマンド内の「my-release」に該当する箇所をリリースと言い、Helmチャートをインストールすると、指定したリリース名を持つリソースが作成されます。デプロイにより作成されたKubernetesのリソースは、Helmではリリースという概念で一括りに管理します。リリースは、サーバーラックやグループのイメージに近い。

実行結果

起動したサービスの確認

「1. Get the Keycloak URL by running these commands」以下にて、次の作業メッセージが表示されています。

作成されたサービスの確認を行います。

実行結果 << 「my-release-wordpress」というサービス名で起動していることがわかります。表示後、Ctrl + cキーを押します。

WordPress 管理者パスワードの取得

WordPressにログインするための「Username」は、「user」と表示されていますが、パスワードについては、指示されたコマンドを実行する必要があります。

base64のインストール

指定のコマンドを見ると、base64 がありますので、base64をインストールします。

Macの場合

Homebrewを使って、base54をインストールします。次のコマンドを実行します。

Linux(Ubuntu)の場合

インストールは不要です。

Windowsの場合

Chocolateyを使って、base64をインストールします。次のコマンドを実行します。

確認を求められるので、yes を入力し、Enterキーを押す

指定されたコマンドを用いたWordPressの管理者パスワード取得

実行結果 << 表示される文字列は、各環境毎に異なるので、必ず自分の環境でコマンドを実行しましょう。

Webブラウザで起動確認

minikubeを使っているので、minikubeの作法により、minikube service サービス名を実行することで、デプロイしたKubernetes Service「my-release-wordpress」を中継するトンネルを作り、Kubernetes環境の外からアクセスできるようにします。

PowerShell 上で、[default my-release-wordpress http://127.0.0.1:44087 と表示(コマンド実行タイミングにより異なりますので注意)されているので、表示されたURLにアクセスします。表示されるURLは、各環境毎に異なるので、必ず自分の環境でコマンドを実行しましょう。

Webブラウザでアクセスすると、下図のように表示されます。

URLの後ろに、/wp-admin を追加し、Enterキーを押すことで、WordPressの管理画面が表示されます。先ほど確認したWordPress管理者のユーザー名(user)とパスワードを使って、ログインします。

ログインすることで、WordPressの管理者画面にアクセスすることができます。

Webサイト制作をITエンジニアとして取り組むのであれば、WordPressを扱えるようになりましょう。

Helmチャートで起動したアプリケーションを削除する方法

「minikube service 」を実行中の場合は、Ctrl + c キーを押して、アプリケーションの起動を停止します。
その後、次のコマンドを実行し、アプリケーションを削除します。

実行例

実行結果

Kubernetes Service がどうなったか確認します。

実行結果

WordPressのサービスが終了していることがわかります。minikubeで、Helmチャートを使って、アプリケーションを動かし、開発したり検証することができます。

KubernetesのHAクラスターを構築する場合 ( CPU 4コア以上、メモリ16GB以上のパソコン )

ここでは、プライベートクラウドにおけるKuberneteesの部分について、本家のKubernetesよりも要求スペックの低い「microk8s」を使い、実際に手を動かして体験してみます。

作業用の仮想マシンの作成

microk8s をインストールした仮想マシンを3台用意する必要があります。そこで、microk8sをインストールした仮想マシンを1台作成し、それをひな形として複製する方向で作業の短縮を図ります。

  • 1台目の仮想マシン : ホスト名 node0 , 固定IPアドレス 192.168.125.100

  • 2台目の仮想マシン : ホスト名 node1 , 固定IPアドレス 192.168.125.101

  • 3台目の仮想マシン : ホスト名 node2 , 固定IPアドレス 192.168.125.102

仮想マシンではなく、物理メモリが8GB以上の中古のデスクトップパソコンを3台用意しても構いません。物理マシンなので、ネットワーク機器(スイッチ)も忘れずに用意しましょう。中古のデスクトップパソコンを用意する場合は、OS(基本ソフト)は、Ubuntu 22.04 以上を使いましょう。

ひな形になる仮想マシンの用意

もしくは を参考に、Ubuntu 20.04 または、Ubuntu 22.04 Serverを用いた仮想マシンを作成します。Intel・AMD系CPU向けISOイメージはこちら。こうした仮想マシンは1つ作っておくと使い回すことができます。

  • 仮想マシン名:Ubuntu VM node 0

  • 仮想マシンに割り当てるメモリ:2048MB

  • 仮想マシンに割り当てるプロセッサー数:1

  • 仮想マシンのファイルサイズ:64GB

  • ホストオンリーアダプタの固定IPアドレス:192.168.125.100

  • ホスト名:node0

  • ユーザー名 : vboxuser

  • パスワード : zxcvfr45

1台目の仮想マシンの作業

仮想マシンにSSH接続を行い、作業を行います。Macの人は「ターミナル」、Windowsの人は「Tera Term」が定番です。

hostsファイルの編集

/etc/hosts ファイルを編集します。次のコマンドを実行します。

修正前

修正後

書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

microk8sのインストール

microk8sのインストールを実施するため、次のコマンドを実行します。

実行結果

HA構成には、バージョン1.19以降が必要なので、これでOK

現在のユーザーでmicrok8sを操作できるように、microk8sのgroupに追加するため、次のコマンドを実行します。

microk8sにおけるkubectlの扱い

プレフィックスなしで、kubectlを使うために、次のコマンドを実行。microk8sでkubectlを実行するには、何もしなければ、microk8s.kubectl コマンドを使うことになるので、面倒であれば、kubectl だけで、kubectlコマンドを実行できるように変更します。

実行結果

microk8sにおけるHelmの扱い

「microk8s」で、Kubernetesのパッケージ管理ツールである「Helm」を利用にするは、kubectlのように「microk8s」というプレフィックスを付与してHelmに関するコマンドを実行します。

たとえば、microk8s.helm3 install リリース名 チャート名 のようになります。毎回、プレフィックスを付与するのは面倒なので、エイリアスを設定しプレフィックスを不要にします。

実行結果

microk8sの稼働状況の確認

一度ログアウトし、再度SSH接続を行います。

microk8sの稼働状況の確認コマンドを実行します。

実行結果

microk8sのアドオンのうち、既に「ha-cluster」「helm」「helm3」の3つが有効(enabled)になっていることがわかります。しかし、「high-availability: no」となっているので、シングルノード構成のmicrok8sになっています。これが初期状態です。シングルノード状態でもKubernetes環境として利用することができます。シングルノード状態の場合は、本番運用よりも、開発環境やエッジデバイス(IoT向け)としての利用が向きます。また、microk8sには、coreアドオンとcommunityアドオンがあり、coreアドオンは、microk8sを提供するCanonical社がメンテナンスしています。

1台目の仮想マシンをバックアップ

後々作業しやすいように、microk8sをインストールした仮想マシンをバックアップしておきましょう。

稼働中の仮想マシンをシャットダウンします。

Virtual Box上で、「ファイル」>>「仮想マシンのエクスポート」の順にクリックします。

「仮想マシンのエクスポート」画面が表示されます。エクスポートしたい仮想マシンをクリックして選びます。「次へ」をクリックします。

「Format settings」画面が表示されます。ファイルの保存先と保存時のファイル名が表示されます。特に変更する必要はないので、そのまま「次へ」をクリックします。ファイルの保存先はWindows環境では「ドキュメント」フォルダとなり、Macの場合は「書類」フォルダに標準では指定されています。

「仮想アプライアンスの設定」画面が表示されます。「名前」など表示されている項目名をダブルクリックすることで、表示されている情報を編集することができます。必要に応じて編集しておきます。その後、「完了」をクリックします。

「Format settings」画面が表示されたファイルの保存先に、.ovaの拡張子で保存されていることが確認できます。

仮想マシンの複製

1台目の仮想マシンが起動中の場合は次のコマンドを実行し、シャットダウンします。既にシャットダウン済みの場合は、このコマンドは飛ばしてください。

Virtual Box上で、クローン操作を行います。

クローン時の仮想マシンの名前は、次のようにしましょう。

  • 2台目の仮想マシン:例 Ubuntu 22.04 node 1 , クローンのタイプは「すべてをクローン」を選択

  • 3台目の仮想マシン:例 Ubuntu 22.04 node 2 , クローンのタイプは「すべてをクローン」を選択

クローン後、3台の仮想マシンが揃うと下記のようになります。

2台目の仮想マシン、個別の作業

起動前に、仮想マシンに割り当てるメモリを4096MBに変更します。

Virtual Box上で、Ubuntu 22.04 node 1 を起動します。SSH接続せずに、起動した仮想マシンの画面内で、Enterキーを押して、ログインを行います。

起動後、ホスト名と固定IPアドレスを変更します。ホスト名と固定IPアドレスの変更作業は、SSH接続を行わずに仮想マシンのウィンドウから直接操作します。

ホスト名の変更

/etc/hosts と /etc/hostname の2つを変更する必要があります。

/etc/hosts から変更します。次のコマンドを実行します。

修正前

修正後

書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

/etc/hostname を変更します。

node1 を node 2 に書き換えます。書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

ホストオンリーアダプタの固定IPアドレスを変更

ネットワーク設定ファイルを変更し、仮想マシンに割り当てられてる固定IPアドレスを、1台目のものから2台目のものに変更します。

192.168.125.100 は、1台目の仮想マシンの固定IPアドレスなので、2台目の仮想マシンの固定IPアドレスとして、192.168.125.101 に書き換えます。書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

再起動

書き換え内容を反映させるため、2台目の仮想マシンを再起動します。

3台目の仮想マシン、個別の作業

起動前に、仮想マシンに割り当てるメモリを4096MBに変更します。

Virtual Box上で、Ubuntu 22.04 node 2 を起動します。SSH接続せずに、起動した仮想マシンの画面内で、Enterキーを押して、ログインを行います。

起動後、ホスト名と固定IPアドレスを変更します。ホスト名と固定IPアドレスの変更作業は、SSH接続を行わずに仮想マシンのウィンドウから直接操作します。

ホスト名の変更

/etc/hosts と /etc/hostname の2つを変更する必要があります。

/etc/hosts から変更します。次のコマンドを実行します。

修正前

修正後

書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

/etc/hostname を変更します。

node1 を node 3 に書き換えます。書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

ホストオンリーアダプタの固定IPアドレスを変更

ネットワーク設定ファイルを変更し、仮想マシンに割り当てられてる固定IPアドレスを、1台目のものから2台目のものに変更します。

192.168.125.100 は、1台目の仮想マシンの固定IPアドレスなので、3台目の仮想マシンの固定IPアドレスとして、192.168.125.102 に書き換えます。書き換え後、Ctrl + x キーを押し、yキーを押して保存です。

再起動

書き換え内容を反映させるため、3台目の仮想マシンを再起動します。

HA(高可用性)クラスターの構成

microk8sでは、HAクラスターを構成するためには3台以上のサーバー(物理サーバーまたは仮想サーバー)が必要です。

2台目と3台目の仮想マシンが起動した状態を維持しつつ、1台目の仮想マシンを起動します。「microk8s add-node」コマンドは、基本的に1台のノードを追加するたび実行します。

2台目の仮想マシンを1台目に接続

1台目の仮想マシンで稼働するmicrok8sに2台目の仮想マシンで稼働するmicrok8sを接続するために必要な「microk8s join」から始まるコマンドを生成します。

1台目の仮想マシンで次のコマンドを実行します。

実行結果

上記の実行結果は、add-nodeコマンドの実行毎に異なるため、自分の画面に表示された値を使いましょう。2台目の仮想マシンで使用するコマンドは、1台目の固定IPアドレスが書かれた4つ目です。

2台目の仮想マシンを1台目に接続するため、2台目の仮想マシンにSSH接続し、1台目の仮想マシンの固定IPアドレスが書かれている4つ目のコマンドを実行します。

実行結果

3台目の仮想マシンを1台目に接続

1台目の仮想マシンで稼働するmicrok8sに3台目の仮想マシンで稼働するmicrok8sを接続するために必要な「microk8s join」から始まるコマンドを生成します。

1台目の仮想マシンで次のコマンドを実行します。

実行結果

上記の実行結果は、add-nodeコマンドの実行毎に異なるため、自分の画面に表示された値を使いましょう。3台目の仮想マシンで使用するコマンドは、1台目の固定IPアドレスが書かれた4つ目です。つまり2台目と同じものを使ってはいけません。

3台目の仮想マシンを1台目に接続するため、3台目の仮想マシンにSSH接続し、1台目の仮想マシンの固定IPアドレスが書かれている4つ目のコマンドを実行します。

実行結果

1台目の仮想マシンでノードの接続確認

1台目の仮想マシンで次のコマンドを実行し、各ノードの接続状況を確認します。

実行結果

障害ドメインの設定

障害ドメインは、同じ電源やスイッチを共有している範囲のことで、サーバーラックのようにひとかたまりのグループのイメージです。

microk8sのノードとして起動している各仮想マシン(1台目、2台目、3台目)で、それぞれ次のコマンドを実行します。

microk8sのステータス確認

microk8sのステータスコマンドを実行します。

実行結果

「high-availability: yes」と表示されていることがわかります。HAクラスター構成になっていることを示しています。HA クラスターのすべてのノード(microk8sが稼働中のサーバー)がコントロール プレーンを実行するため、ノードの 1 つがクラッシュした場合、データストアが他のノードに移動して、中断することなく作業を続けることができます。

プライベートクラウド構築では、こうしたHAクラスター構成を出来ることが必須になっています。

microk8sアドオン(dns, hostpath-storage)の有効化

microk8sではアドオンを有効化することで、様々な機能を追加することができます。ここでは「dns」と「hostpath-storage」アドオンを有効化するために次のコマンドを実行します。

node1(仮想マシン1台目)で、実施します。

実行結果

microk8sのステータスコマンドを実行します。なお、ドットの代わりに、半角スペースにすることも可能です。

実行結果

microk8sアドオン(mtallb)の有効化

metallbを使い、クラスターの外側からアクセスできるように、metallbを使うため、関連アドオンとともにmetallbのアドオンを有効化します。

node1(仮想マシン1台目)で、次のコマンドを実行します。

metallbのアドオンを有効化しようとしているので、ロードバランサーで使用可能なIPアドレスを指定します。

ここでは、仮想マシン3台で使っているIPアドレスを指定しました。IPアドレスの範囲を入力後、Enterキーを押します。

実行結果

microk8sのステータス確認を行います。

実行結果

「metallb」のアドオンが有効になったことがわかります。

1台目の仮想マシン上のmicrok8sで有効にしたアドオンは、2台目や3台目の仮想マシン上のmicrok8sでも有効になっています。

HelmによるCMS(Drupal)のデプロイ

Helmについて

「Helm」は、Kubernetesのパッケージ管理ツールとして広く知られています。Helmにはチャートと呼ばれる、Kubernetesでアプリケーションを動かすための定義ファイルの集まりがあり、チャートを使うことで、シンプルなコマンドでインストールやアンインストールといった操作を行うことができます。

Helmチャート用リポジトリの追加

ホスト名 node1(仮想マシン1台目)で、次のコマンドを実行します。

実行結果

「bitnami」という名称で追加したリポジトリは、Helmチャートを公開しているVMware社のソリューションの1つです。下記にアクセスすることで、Bitnamiで公開しているアプリケーションとHelmチャートによるデプロイのためのコマンドを確認することができます。https://bitnami.com/stacks/helm

アクセスしてみると、WordPressやDrupalといった定番のCMSの他に、eラーニングや顧客管理システム(CRM)、企業資源計画(ERP)といった業務に使うための各パッケージから、JasperReportsやRe:dashといった分析ツール、Apache SparkやMongoDBといった基盤系まで多数揃えていることがわかります。

Kubernetesでは、Helmチャートが提供されているのであれば、よほどのカスタマイズが生じない限り、Helmチャートを使った方が管理は楽です。

HelmチャートによるDrupalのデプロイ

node1(仮想マシン1台目)で、次のコマンドを実行します。

実行結果

デプロイ後の操作について指示が書かれているので、数分(5分程度)待ったのち、指示の英文を参考に作業を進めます。

クラスターの外部から、デプロイしたLMSにアクセスするURLの取得

LMS(Moodle)に接続するために、External-IPとしてクラスター上のロードバランサー(metallb)から払い出されたIPアドレスを引き出し、CMSへの接続URLを取得します。次のコマンドを実行します。

引き出したIPアドレスを表示します。

実行結果

このIPアドレスの場合は、1台目の仮想マシンを指していることになります。Webブラウザで、上記URLにアクセスすることで、起動したMoodleを表示することができます。

External-IPとしてクラスター上のロードバランサー(metallb)から払い出されたIPアドレスを確認するだけであれば、次のコマンドでも確認することができます。

実行結果

実行結果の数値は、構成したクラスター環境で用いているIPアドレス等の各種設定により異なりますので、必ず自分の環境でコマンドを実行して確認しましょう。

稼働中のpodがどこのノードに属しているか確認

Kubernetesでは、コンテナ化されたアプリケーションやデータベース、ボリュームを「pod」と言います。podが、どこのノード(仮想マシン)で動いているか確認します。

実行結果

この結果から、データベース用のpodは、node2 上にあり、アプリケーション本体のpodは、node1 上で稼働していることがわかります。

また、イメージ図にすると、次のようになります。「node0」上で稼働するLB(Load Balancer)を通して、「node1」と「node2」で構成し稼働するpod上のMoodleにアクセスするようになっています。

Moodleの管理者ユーザーのためのパスワードの取得、管理者画面へのログイン

Helmチャートでデプロイした際に、「2.Get your Moodle™ login credentials by running:」の下に、「echo Username:」の続きに表示された文字列が、管理者画面のユーザー名です。

先ほどのデプロイでは、次のように表示されていました。ユーザー名は、user となっています。

デプロイしたMoodleの管理者画面のログイン時に使用するパスワードを確認するために、次のコマンドを実行します。

実行結果

実行結果は、コマンドの実行毎に異なるので、必ず自分の画面で表示されたパスワードの文字列を使います。

Webブラウザで、起動中のDrupalにアクセスし、画面右上の「Log In」をクリックします。確認した管理者ユーザー名とパスワードを入力し、「Log in」をクリックします。

ログインが成功すると、下記のように表示されます。「Got it」をクリックします。画面左上の「三」をクリックし、「Site administration」をクリックすることでMoodleの管理者画面表示されます。画面を大きくしている場合は画面左上の「三」は表示されず、「Site administration」をクリックすることで、Moodleの管理者画面となります。

稼働中のpodに接続し、bashシェルを使ってコマンド操作を行う方法 ( 作業中 )

次のコマンドを実行します。

稼働中のリリースのアンインストール

次のコマンドを実行することで、「my-moodle」というリリース名で管理されるリソースをまとめて削除し、Helmチャートを使いインストールした稼働中のアプリケーションの利用を終了することができます。

実行結果

podを確認します。

実行結果

「my-moodle」のリリース名を持つpodが削除されていることがわかります。

その他のHelmチャート

他のHelmチャートを試すのであれば、以下もDrupalと同じような操作でデプロイすることができます。

  • 営業活動の見える化と顧客関係管理を行う「SuiteCRM」

  • 企業資源計画や統合業務管理システムと呼ばれる組織の経営管理を行う「Odoo」

  • ECサイト構築ツール「PrestaShop」

  • ローコード開発ツール「Appsmith」

microk8sの初期化

いろいろ試していると、自分で問題を解決することができず、まっさらに初期化したいことがあります。そうした時は、次の手順を取ります。

ノードの稼働状況の確認

次のコマンドを実行します。

実行結果

ノードの接続解除

node1は2台目の仮想マシン、node2は3台目の仮想マシンです。この2つを、node0を示す1台目の仮想マシンとの接続を解除します。解除には、2台目の仮想マシンと3台目の仮想マシンでそれぞれ、microk8s leave コマンドを実行します。

2台目の仮想マシンで、次のコマンドを実行します。

実行結果

3台目の仮想マシンで、次のコマンドを実行します。

実行結果

1台目の仮想マシンで、次のコマンドを実行します。

実行結果

1台目の仮想マシン上のmicrok8sでは、node1とnode2を認識しているため、microk8s remove-node コマンドを使います。

ノードの状況を確認します。

実行結果

これで、node1 が認識されなくなりました。同じ要領で、node2 に対しても、microk8s remove-node コマンドを使います。

ノードの状況を確認します。

実行結果

microk8sの初期化

実行結果

microk8sのステータスコマンドを実行します。

実行結果

「high-availability: no」となっていることに注目です。HAクラスター構成では、「high-availability: yes」ですから、「high-availability: no」ということは、microk8sの初期状態であるシングルノード構成に戻ったことを示します。3台の仮想マシンは3台ともシャットダウンコマンドを実行して閉じておきましょう。

ここまでのまとめ

VirtualBox上で3台の仮想マシンを動かすことで、microk8sによるHAクラスター構成の構築に取り組みました。教育機関や生涯学習講座、企業等で使うパソコンのうち、物理メモリが多いパソコンとして、物理メモリが16GBのものが一般的であるため、物理メモリ16GB搭載のパソコンを前提にした影響で基本的な操作を確認するにとどまります。
microk8sによるKubernetesクラスター環境は、32GB以上の物理メモリを搭載するパソコンが理想です。これでも、本家のKubernetesのメモリ64GB以上と比べて、microk8sは必要なリソース(メモリやCPU等)が少ない方なので、家電量販店で買えるパソコンで動かすことができますし、Raspberry Pi 4のようなIoT向けのエッジデバイスでも取り組みやすいです。

シングルノード構成のmicrok8s環境を使うケース

microk8sは、minikubeのように仮想マシンまたは物理マシン1台だけで運用するシングルノード構成を利用することができます。シングルノード構成は、次のような用途で用います。

  • 仮想マシン、あるいは物理マシンのスペックから、シングルノード構成で運用が足りると判断した場合

  • 様々なアプリケーションを開発し、microk8sで動作を確認するための検証環境として使う場合

  • 手元のパソコンのメモリが8GBで、CPUが2コアしか載っていない場合

その他、可能であれば検討すべきこと

microk8sにおけるストレージの扱い

microk8sのストレージのうち、hostpath-storageは、ノードに紐づけられているため、稼働中のpodを他のノードに容易に移行できないことを示しています。そこで、選択肢としては2つありますので、本番環境ではどちらかを選ぶ必要があります。

  • OpenEBS mayastorを、ストレージとして使う方法

  • hostpath-storageは、/var/snap/microk8s/common/default-storage にノード上で稼働するpodのデータは格納されているので、これを別のストレージにマウントし、ノードのディスク容量がいっぱいになることを回避する方法

独自のコンテナレジストリの構築

この教材では公開されているHelmチャートやKubernetesマニフェストファイルを使っています。本番環境ではHelmチャートやマニフェストファイル、コンテナイメージを公開したくない場合があります。対策として、独自のコンテナレジストリやリポジトリを構築することを推奨します。