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

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

Kubernetes環境のHA(高可用性)クラスターを構築するには、お使いのパソコンまたはサーバーのCPUのコア数が4つ以上あることが前提です。メモリは、最低でも16GB以上が必要です。メモリ16GBのパソコンの場合は、スペックがぎりぎりなので、コンテナや仮想環境関係以外のアプリは可能な限り終了しないと、パソコンがリソース不足でフリーズします。したがって、メモリ16GBを含め、メモリ16GB以下の場合は、「シングルノード構成でKubernetes環境を構築する場合 ( 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環境である「minikube」に取り組みましょう。

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キーを押す

Press RETURN/ENTER to continue or any other key to abort:

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

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

==> Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: (echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') >> /Users/あなたの名前/.profile eval "$(/usr/local/bin/brew shellenv)" - Run brew help to get started

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

(echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') >> /Users/nishikawa.kohei/.profile eval "$(/usr/local/bin/brew shellenv)" brew help

実行結果

Example usage: brew search TEXT|/REGEX/ brew info [FORMULA|CASK...] brew install FORMULA|CASK... brew update brew upgrade [FORMULA|CASK...] brew uninstall FORMULA|CASK... brew list [FORMULA|CASK...] Troubleshooting: brew config brew doctor brew install --verbose --debug FORMULA|CASK Contributing: brew create URL [--no-fetch] brew edit [FORMULA|CASK...] Further help: brew commands brew help [COMMAND] man brew https://docs.brew.sh

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

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

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

which hyperkit

実行結果

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

/usr/local/bin/hyperkit

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

brew install 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/ << こちらにアクセスしてダウンロード。Docker Desktopがエラーになる場合は、https://orbstack.dev/ をインストールしてください。

kubectl のインストール

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

brew install kubernetes-cli

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

kubectl version --client --output=json

実行結果

{ "clientVersion": { "major": "1", "minor": "25", "gitVersion": "v1.25.0", "gitCommit": "a866cbe2e5bbaa01cfd5e969aa3e033f3282a8a2", "gitTreeState": "clean", "buildDate": "2022-08-23T17:44:59Z", "goVersion": "go1.19", "compiler": "gc", "platform": "darwin/amd64" }, "kustomizeVersion": "v4.5.7" }

minikube のインストール

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

brew install minikube

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

minikube version

実行結果

minikube version: v1.32.0 commit: 08896fd1dc362c097c925146c4a0d0dac715ace0

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

minikube help

クラスター「minikube」の起動

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

minikube start

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

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

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

👍 minikube クラスター中のコントロールプレーンの minikube ノードを起動しています 💾 ロード済み Kubernetes v1.26.3 をダウンロードしています... > preloaded-images-k8s-v18-v1...: 397.02 MiB / 397.02 MiB 100.00% 1.14 Mi 🔥 hyperkit VM (CPUs=2, Memory=4000MB, Disk=20000MB) を作成しています... 🐳 Docker 20.10.23 で Kubernetes v1.26.3 を準備しています... ▪ 証明書と鍵を作成しています... ▪ コントロールプレーンを起動しています... ▪ RBAC のルールを設定中です... 🔗 bridge CNI (コンテナーネットワークインターフェース) を設定中です... ▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています 🔎 Kubernetes コンポーネントを検証しています... 🌟 有効なアドオン: default-storageclass, storage-provisioner 🏄 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました

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

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

minikube status

実行結果

minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured

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

kubectl get pod -A -o wide

実行結果

NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-787d4945fb-zjpzz 1/1 Running 0 10m 10.244.0.2 minikube <none> <none> kube-system etcd-minikube 1/1 Running 0 10m 192.168.64.14 minikube <none> <none> kube-system kube-apiserver-minikube 1/1 Running 0 10m 192.168.64.14 minikube <none> <none> kube-system kube-controller-manager-minikube 1/1 Running 0 10m 192.168.64.14 minikube <none> <none> kube-system kube-proxy-lzq25 1/1 Running 0 10m 192.168.64.14 minikube <none> <none> kube-system kube-scheduler-minikube 1/1 Running 0 10m 192.168.64.14 minikube <none> <none> kube-system storage-provisioner 1/1 Running 1 (10m ago) 10m 192.168.64.14 minikube <none> <none>

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

クラスター「minikube」の停止

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

minikube stop

実行結果

✋ 「minikube」ノードを停止しています... 🛑 1 台のノードが停止しました。

クラスター「minikube」の削除

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

minikube delete

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

Linux(Ubuntu)を使っている場合はこちらの手順を使ってください。minikubeを使うため、GUI環境をLinuxにインストールしておくことを推奨します。仮想マシンにGUIを追加する手順 (Ubuntu)

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キーを押す

Press RETURN/ENTER to continue or any other key to abort:

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

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

==> Next steps: - Run these commands in your terminal to add Homebrew to your PATH: echo >> /home/あなたのユーザー名/.bashrc echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/あなたのユーザー名/.bashrc eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" - Install Homebrew's dependencies if you have sudo access: sudo apt-get install build-essential For more information, see: https://docs.brew.sh/Homebrew-on-Linux - We recommend that you install GCC: brew install gcc - Run brew help to get started - Further documentation: https://docs.brew.sh

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

echo >> /home/あなたのユーザー名/.bashrc echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> /home/あなたのユーザー名/.bashrc eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" sudo apt-get install build-essential brew install gcc brew help

実行結果

Example usage: brew search TEXT|/REGEX/ brew info [FORMULA|CASK...] brew install FORMULA|CASK... brew update brew upgrade [FORMULA|CASK...] brew uninstall FORMULA|CASK... brew list [FORMULA|CASK...] Troubleshooting: brew config brew doctor brew install --verbose --debug FORMULA|CASK Contributing: brew create URL [--no-fetch] brew edit [FORMULA|CASK...] Further help: brew commands brew help [COMMAND] man brew https://docs.brew.sh

Dockerをインストール

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

curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh

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

getent group docker sudo gpasswd -a $USER docker

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

一度ログアウト

exit

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

GUI環境を使っている場合

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

sudo reboot

kubectlのインストール

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

CPUが、intel / AMD の場合

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

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

kubectlをインストールする。

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

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

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

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl"

kubectlをインストールする。

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

minikube のインストール

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

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb sudo dpkg -i minikube_latest_amd64.deb

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

minikube version

実行結果

minikube version: v1.32.0 commit: 8220a6eb95f0a4d75f7f2d7b14cef975f050512d

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

minikube help

クラスター「minikube」の起動

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

minikube start

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

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

😄 minikube v1.32.0 on Ubuntu 22.04 (amd64) ✨ Automatically selected the docker driver. Other choices: none, ssh 📌 Using Docker driver with root privileges 👍 Starting control plane node minikube in cluster minikube 🚜 Pulling base image ... 💾 Downloading Kubernetes v1.28.3 preload ... > preloaded-images-k8s-v18-v1...: 403.35 MiB / 403.35 MiB 100.00% 4.86 Mi > gcr.io/k8s-minikube/kicbase...: 453.90 MiB / 453.90 MiB 100.00% 4.59 Mi 🔥 Creating docker container (CPUs=2, Memory=2200MB) ... 🐳 Preparing Kubernetes v1.28.3 on Docker 24.0.7 ... ▪ Generating certificates and keys ... ▪ Booting up control plane ... ▪ Configuring RBAC rules ... 🔗 Configuring bridge CNI (Container Networking Interface) ... 🔎 Verifying Kubernetes components... ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5 🌟 Enabled addons: storage-provisioner, default-storageclass 💡 kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A' 🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

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

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

minikube status

実行結果

minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured

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

kubectl get pod -A -o wide

実行結果

NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-5dd5756b68-mms99 1/1 Running 0 43s 10.244.0.2 minikube <none> <none> kube-system etcd-minikube 1/1 Running 0 56s 192.168.49.2 minikube <none> <none> kube-system kube-apiserver-minikube 1/1 Running 0 56s 192.168.49.2 minikube <none> <none> kube-system kube-controller-manager-minikube 1/1 Running 0 56s 192.168.49.2 minikube <none> <none> kube-system kube-proxy-2bltk 1/1 Running 0 43s 192.168.49.2 minikube <none> <none> kube-system kube-scheduler-minikube 1/1 Running 0 56s 192.168.49.2 minikube <none> <none> kube-system storage-provisioner 1/1 Running 1 (12s ago) 55s 192.168.49.2 minikube <none> <none>

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

クラスター「minikube」の停止

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

minikube stop

実行結果

✋ Stopping node "minikube" ... 🛑 Powering off "minikube" via SSH ... 🛑 1 node stopped.

クラスター「minikube」の削除

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

minikube delete

実行結果

🔥 Deleting "minikube" in docker ... 🔥 Deleting container "minikube" ... 🔥 Removing /home/kolinz/.minikube/machines/minikube ... 💀 Removed all traces of the "minikube" cluster.

「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を最新版にバージョンアップする。次のコマンドを実行。

python.exe -m pip install --upgrade pip

Chocolatey のインストール

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

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

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

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

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

choco -v

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

1.3.1

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

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

choco upgrade chocolatey

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

Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): yes

kubectl のインストール

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

choco install kubernetes-cli

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

Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): yes

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

kubectl version --client --output=json

実行結果

{ "clientVersion": { "major": "1", "minor": "26", "gitVersion": "v1.26.3", "gitCommit": "9e644106593f3f4aa98f8a84b23db5fa378900bd", "gitTreeState": "clean", "buildDate": "2023-03-15T13:40:17Z", "goVersion": "go1.19.7", "compiler": "gc", "platform": "windows/amd64" }, "kustomizeVersion": "v4.5.7" }

minikube のインストール

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

choco install minikube

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

minikube version

実行結果

minikube version: v1.30.1 commit: 08896fd1dc362c097c925146c4a0d0dac715ace0

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

minikube help

クラスター「minikube」の起動

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

minikube start

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

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

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

* Microsoft Windows 10 Pro 10.0.19045.2673 Build 19045.2673 上の minikube v1.30.1 * virtualbox ドライバーが自動的に選択されました * VM ブートイメージをダウンロードしています... > minikube-v1.30.1-amd64.iso....: 65 B / 65 B [---------] 100.00% ? p/s 0s > minikube-v1.30.1-amd64.iso: 282.84 MiB / 282.84 MiB 100.00% 507.89 KiB * minikube クラスター中のコントロールプレーンの minikube ノードを起動しています * ロード済み Kubernetes v1.26.3 をダウンロードしています... > preloaded-images-k8s-v18-v1...: 397.02 MiB / 397.02 MiB 100.00% 676.24 * virtualbox VM (CPUs=2, Memory=4000MB, Disk=20000MB) を作成しています... ! この VM は https://registry.k8s.io アクセスにおける問題があります * 外部イメージを取得するためには、プロキシーを設定する必要があるかも知れません: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/ * Docker 20.10.23 で Kubernetes v1.26.3 を準備しています... - 証明書と鍵を作成しています... - コントロールプレーンを起動しています... - RBAC のルールを設定中です... * bridge CNI (コンテナーネットワークインターフェース) を設定中です... - gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています * Kubernetes コンポーネントを検証しています... * 有効なアドオン: storage-provisioner, default-storageclass * 終了しました!kubectl がデフォルトで「minikube」クラスターと「default」ネームスペースを使用するよう設定されました

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

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

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

minikube status

実行結果

minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured

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

kubectl get pod -A -o wide

実行結果

NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-system coredns-787d4945fb-hkznq 1/1 Running 0 2m58s 10.244.0.2 minikube <none> <none> kube-system etcd-minikube 1/1 Running 0 3m10s 192.168.59.100 minikube <none> <none> kube-system kube-apiserver-minikube 1/1 Running 0 3m10s 192.168.59.100 minikube <none> <none> kube-system kube-controller-manager-minikube 1/1 Running 0 3m10s 192.168.59.100 minikube <none> <none> kube-system kube-proxy-d4scg 1/1 Running 0 2m58s 192.168.59.100 minikube <none> <none> kube-system kube-scheduler-minikube 1/1 Running 0 3m11s 192.168.59.100 minikube <none> <none> kube-system storage-provisioner 1/1 Running 0 3m6s 192.168.59.100 minikube <none> <none>

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

クラスター「minikube」の停止

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

minikube stop

実行結果

* 「minikube」ノードを停止しています... * SSH 経由で「minikube」の電源をオフにしています... * 1 台のノードが停止しました。

クラスター「minikube」の削除

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

minikube delete

実行結果

* virtualbox の「minikube」を削除しています... * クラスター「minikube」の全てのトレースを削除しました。

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

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

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

E0406 23:14:13.187702 21560 status.go:263] The "minikube" host does not exist! minikube type: Control Plane host: Nonexistent kubelet: Nonexistent apiserver: Nonexistent kubeconfig: Nonexistent

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

minikube delete

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

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

minikube start --driver=docker

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

minikube status

実行結果

minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured

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

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

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

MacおよびLinuxではターミナルアプリを前提に書いています。

必要な環境

  • minikube環境

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

  • pip << pip 23.0 で確認済み

pyenvによるPythonのインストール

pyenvによるPythonのインストール

pipenvをインストールするため、Python環境を整える必要があり、pyenvをインストールします。pyenvを使うことで、複数のPythonのバージョンを使い分けることができます。

brew update brew install pyenv pyenv install 3.11.9 pyenv global 3.11.9

Python 3.11.9 のパスを通すために、次のコマンドを実行します。シェルの種別を確認します。

echo $SHELL

Pythonのパスを通す

実行の結果、/bin/zshと表示される場合

最新のMacOSの適用で、zshになっていることがあります。その場合、次のコマンドを実行します。

open ~/.zshrc

テキストエディットアプリが起動し、.zshrc ファイルが編集できるようになるので、下記を追記します。追記後、保存します。

export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/shims:$PATH" eval "$(pyenv init -)"

.zshrcの追記内容を反映するため、次のコマンドを実行します。

source ~/.zshrc
実行の結果、/bin/bash と表示される場合

下記を実行します。

echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile echo 'export PATH="$PYENV_ROOT/shims:$PATH"' >> ~/.bash_profile echo 'eval "$(pyenv init -)"' >> ~/.bash_profile source .bash_profile

Pythonのパスが通ったことを確認する

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

python -V

実行結果

Python 3.11.9

pipenvのインストール

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

pip install --upgrade pip pip install pipenv pipenv --version

実行結果

pipenv, version 2024.4.1

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

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

mkdir -p minikube-django && cd minikube-django

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

touch Pipfile pipenv --python=3.11.9 pipenv install django pipenv install django-filter pipenv install django-crispy-forms pipenv install numpy pipenv install matplotlib

django プロジェクトの作成

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

pipenv run django-admin startproject project1 .

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

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

vi project1/settings.py

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

ALLOWED_HOSTS = ['*']

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

INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_filters', 'crispy_forms', ]

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

# Internationalization # https://docs.djangoproject.com/en/4.2/topics/i18n/ LANGUAGE_CODE = 'ja' TIME_ZONE = 'Asia/Tokyo' USE_I18N = True USE_TZ = True

django向けDockerfileの作成

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

vi Dockerfile

Dockerfile の記述内容はこちら

FROM python:3.11.9 RUN mkdir /code/ COPY ./ /code/ WORKDIR /code/ RUN pip install --upgrade pip && \ pip install pipenv && \ pipenv --python /usr/local/bin/python RUN pipenv install CMD pipenv run python manage.py runserver 0:8000

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

クラスター「minikube」の起動

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

minikube start

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

eval $(minikube docker-env)

コンテナイメージの作成

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

docker build -t myimage/django:1 .

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

docker images

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

REPOSITORY TAG IMAGE ID CREATED SIZE myimage/django 1 419237515010 57 seconds ago 1.15GB registry.k8s.io/kube-apiserver v1.26.3 3f1ae10c5c85 3 weeks ago 129MB registry.k8s.io/kube-proxy v1.26.3 c859f97be11a 3 weeks ago 61.9MB registry.k8s.io/kube-controller-manager v1.26.3 3b6ac91ff8d3 3 weeks ago 119MB registry.k8s.io/kube-scheduler v1.26.3 fa167119f9a5 3 weeks ago 54.9MB registry.k8s.io/etcd 3.5.6-0 ef2458028240 4 months ago 181MB registry.k8s.io/pause 3.9 829e9de338bd 5 months ago 514kB registry.k8s.io/coredns/coredns v1.9.3 b19406328e70 10 months ago 47.7MB gcr.io/k8s-minikube/storage-provisioner v5 ba04bb24b957 2 years ago 29MB

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

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

vi djangoapp.yaml

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

apiVersion: apps/v1 kind: Deployment metadata: name: django spec: replicas: 1 selector: matchLabels: app: django template: metadata: labels: app: django spec: containers: - name: django image: "myimage/django:1" imagePullPolicy: Never ports: - containerPort: 8000 name: django --- apiVersion: v1 kind: Service metadata: name: django-svc spec: selector: app: django ports: - protocol: TCP port: 8000 name: django type: NodePort

Kubernetesにデプロイ

kubectl create -f djangoapp.yaml

実行結果

deployment.apps/django created service/django-svc created

Webブラウザで起動確認

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

minikube service django-svc

Webブラウザにアクセスできる場合は、Webブラウザで、次のように表示されます。django が動いていることがわかります。

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

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

|-----------|------------|-------------|----------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|------------|-------------|----------------------------| | default | django-svc | django/8000 | http://192.168.64.14:32370 | |-----------|------------|-------------|----------------------------| 🎉 デフォルトブラウザーで default/django-svc サービスを開いています...

Webブラウザが使えない場合は、curlコマンドを使って確認しましょう。例えば、表示されたURLが、http://192.168.64.14:32370 であれば、

curl http://192.168.64.14:32370

実行結果

<!doctype html> <html lang="ja" dir="ltr"> <head> <meta charset="utf-8"> <title>インストールは成功しました!おめでとうございます!</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> html { line-height: 1.15; } a { color: #092e20; 以下続く

上記のように表示されれば、Djangoアプリが起動していることが確認できる。

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

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

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

Helmをインストール

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

Macの場合

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

brew install kubernetes-helm

Linuxの場合

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

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh

Windowsの場合

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

choco install kubernetes-helm

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

Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): yes

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

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

helm repo add bitnami https://charts.bitnami.com/bitnami

実行結果

"bitnami" has been added to your repositories

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

helm repo update

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

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

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

helm install my-release bitnami/wordpress

実行結果

NAME: my-release LAST DEPLOYED: Thu Apr 6 23:54:22 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: wordpress CHART VERSION: 15.3.0 APP VERSION: 6.2.0 ** Please be patient while the chart is being deployed ** Your WordPress site can be accessed through the following DNS name from within your cluster: my-release-wordpress.default.svc.cluster.local (port 80) To access your WordPress site from outside the cluster follow the steps below: 1. Get the WordPress URL by running these commands: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace default -w my-release-wordpress' export SERVICE_IP=$(kubectl get svc --namespace default my-release-wordpress --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") echo "WordPress URL: http://$SERVICE_IP/" echo "WordPress Admin URL: http://$SERVICE_IP/admin" 2. Open a browser and access WordPress using the obtained URL. 3. Login with the following credentials below to see your blog: echo Username: user echo Password: $(kubectl get secret --namespace default my-release-wordpress -o jsonpath="{.data.wordpress-password}" | base64 -d)

起動したサービスの確認

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

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

kubectl get svc --namespace default -w my-release-wordpress

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

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-release-wordpress LoadBalancer 10.108.24.81 <pending> 80:31015/TCP,443:32029/TCP 18s

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

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

base64のインストール

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

Macの場合

ターミナルアプリで、別のタブを開き、Homebrewを使って、base54をインストールします。次のコマンドを実行します。

brew install base64
Linux(Ubuntu)の場合

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

Windowsの場合

PowerShellやターミナルアプリで別のタブを開き、Chocolateyを使って、base64をインストールします。次のコマンドを実行します。

choco install base54

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

Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): yes

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

ターミナルアプリで、別のタブを開き、次のコマンドを実行します。

(kubectl get secret --namespace default my-release-wordpress -o jsonpath="{.data.wordpress-password}" | base64 -d)

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

lFYjGfGKmF

Webブラウザで起動確認

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

minikube service my-release-wordpress

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

Webブラウザでアクセスすると、下図のように表示されます。表示されるまで少し時間がかかります。

スクリーンショット 2025-04-15 17.16.33.png

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

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

image-20240407-155232.png

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

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

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

helm delete リリース名

実行例

helm delete my-release

実行結果

release "my-release" uninstalled

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

kubectl get svc --namespace default -w my-release-wordpress

実行結果

Error from server (NotFound): services "my-release-wordpress" not found

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

(発展) kind(Kubernetes in Docker)

Kubernetes環境をローカルで用意する方法として、DockerおよびDocker互換環境上で、仮想のKubernetesのHAクラスターを構築できる「kind(カインド)」を試してみましょう。Minikube以外に気軽にKubernetes環境を用意する手段として「kind」があります。Minikubeとkindは本番向けではなく、開発や検証向けです。

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

ここでは、プライベートクラウドにおける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 以上を使いましょう。

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

Mac(Intel系)で仮想マシンを作る(VirtualBox) もしくはWindows で仮想マシンを作る(VirtualBox) を参考に、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 ファイルを編集します。次のコマンドを実行します。

sudo nano /etc/hosts

修正前

127.0.0.1 localhost 127.0.1.1 node0

修正後

127.0.0.1 localhost 127.0.1.1 node0 192.168.125.100 node0 192.168.125.101 node1 192.168.125.102 node2

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

microk8sのインストール

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

sudo snap install microk8s --classic --channel=1.26/stable

実行結果

microk8s (1.26/stable) v1.26.1 from Canonical? installed

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

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

sudo usermod -a -G microk8s $USER sudo chown -f -R $USER ~/.kube

microk8sにおけるkubectlの扱い

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

sudo snap alias microk8s.kubectl kubectl

実行結果

Added: - microk8s.kubectl as kubectl

microk8sにおけるHelmの扱い

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

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

sudo snap alias microk8s.helm3 helm

実行結果

Added: - microk8s.helm3 as helm

microk8sの稼働状況の確認

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

exit

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

microk8s status --wait-ready

実行結果

microk8s is running high-availability: no datastore master nodes: 127.0.0.1:19001 datastore standby nodes: none addons: enabled: ha-cluster # (core) Configure high availability on the current node helm # (core) Helm - the package manager for Kubernetes helm3 # (core) Helm 3 - the package manager for Kubernetes disabled: cert-manager # (core) Cloud native certificate management community # (core) The community addons repository dashboard # (core) The Kubernetes dashboard dns # (core) CoreDNS gpu # (core) Automatic enablement of Nvidia CUDA host-access # (core) Allow Pods connecting to Host services smoothly hostpath-storage # (core) Storage class; allocates storage from host directory ingress # (core) Ingress controller for external access kube-ovn # (core) An advanced network fabric for Kubernetes mayastor # (core) OpenEBS MayaStor metallb # (core) Loadbalancer for your Kubernetes cluster metrics-server # (core) K8s Metrics Server for API access to service metrics minio # (core) MinIO object storage observability # (core) A lightweight observability stack for logs, traces and metrics prometheus # (core) Prometheus operator for monitoring and logging rbac # (core) Role-Based Access Control for authorisation registry # (core) Private image registry exposed on localhost:32000 storage # (core) Alias to hostpath-storage add-on, deprecated

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

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

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

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

sudo shutdown -h now

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

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

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

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

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

仮想マシンの複製

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

sudo shutdown -h now

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 から変更します。次のコマンドを実行します。

sudo nano /etc/hosts

修正前

127.0.0.1 localhost 127.0.1.1 node0 192.168.125.100 node0 192.168.125.101 node1 192.168.125.102 node2

修正後

127.0.0.1 localhost 127.0.1.1 node1 192.168.125.100 node0 192.168.125.101 node1 192.168.125.102 node2

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

/etc/hostname を変更します。

sudo nano /etc/hostname

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

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

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

sudo nano /etc/netplan/00-installer-config.yaml

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 から変更します。次のコマンドを実行します。

sudo nano /etc/hosts

修正前

127.0.0.1 localhost 127.0.1.1 node1 192.168.125.100 node1 192.168.125.101 node2 192.168.125.102 node3

修正後

127.0.0.1 localhost 127.0.1.1 node3 192.168.125.100 node1 192.168.125.101 node2 192.168.125.102 node3

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

/etc/hostname を変更します。

sudo nano /etc/hostname

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

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

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

sudo nano /etc/netplan/00-installer-config.yaml

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台目の仮想マシンで次のコマンドを実行します。

microk8s add-node

実行結果

From the node you wish to join to this cluster, run the following: microk8s join 10.0.2.15:25000/f0bd5a04e93c0ed631481386f24be7f9/e43da4c4b976 Use the '--worker' flag to join a node as a worker not running the control plane, eg: microk8s join 10.0.2.15:25000/f0bd5a04e93c0ed631481386f24be7f9/e43da4c4b976 --worker If the node you are adding is not reachable through the default interface you can use one of the following: microk8s join 10.0.2.15:25000/f0bd5a04e93c0ed631481386f24be7f9/e43da4c4b976 microk8s join 192.168.125.100:25000/f0bd5a04e93c0ed631481386f24be7f9/e43da4c4b976

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

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

microk8s join 192.168.125.100:25000/f0bd5a04e93c0ed631481386f24be7f9/e43da4c4b976

実行結果

Contacting cluster at 192.168.125.100 Waiting for this node to finish joining the cluster. .. .. .. vboxuser@node1:~$

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

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

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

microk8s add-node

実行結果

From the node you wish to join to this cluster, run the following: microk8s join 10.0.2.15:25000/e83769367bb5140974337edeb748c374/e43da4c4b976 Use the '--worker' flag to join a node as a worker not running the control plane, eg: microk8s join 10.0.2.15:25000/e83769367bb5140974337edeb748c374/e43da4c4b976 --worker If the node you are adding is not reachable through the default interface you can use one of the following: microk8s join 10.0.2.15:25000/e83769367bb5140974337edeb748c374/e43da4c4b976 microk8s join 192.168.125.100:25000/e83769367bb5140974337edeb748c374/e43da4c4b976

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

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

microk8s join 192.168.125.100:25000/e83769367bb5140974337edeb748c374/e43da4c4b976

実行結果

Contacting cluster at 192.168.125.100 Waiting for this node to finish joining the cluster. .. .. .. vboxuser@node2:~$

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

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

kubectl get nodes

実行結果

NAME STATUS ROLES AGE VERSION node2 Ready <none> 113s v1.26.1 node1 Ready <none> 111s v1.26.1 node0 Ready <none> 7m13s v1.26.1

障害ドメインの設定

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

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

echo "failure-domain=42" > /var/snap/microk8s/current/args/ha-conf microk8s.stop microk8s.start

microk8sのステータス確認

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

microk8s.status

実行結果

microk8s is running high-availability: yes datastore master nodes: 192.168.125.100:19001 192.168.125.101:19001 192.168.125.102:19001 datastore standby nodes: none addons: enabled: ha-cluster # (core) Configure high availability on the current node helm # (core) Helm - the package manager for Kubernetes helm3 # (core) Helm 3 - the package manager for Kubernetes disabled: cert-manager # (core) Cloud native certificate management community # (core) The community addons repository dashboard # (core) The Kubernetes dashboard dns # (core) CoreDNS gpu # (core) Automatic enablement of Nvidia CUDA host-access # (core) Allow Pods connecting to Host services smoothly hostpath-storage # (core) Storage class; allocates storage from host directory ingress # (core) Ingress controller for external access kube-ovn # (core) An advanced network fabric for Kubernetes mayastor # (core) OpenEBS MayaStor metallb # (core) Loadbalancer for your Kubernetes cluster metrics-server # (core) K8s Metrics Server for API access to service metrics observability # (core) A lightweight observability stack for logs, traces and metrics prometheus # (core) Prometheus operator for monitoring and logging rbac # (core) Role-Based Access Control for authorisation registry # (core) Private image registry exposed on localhost:32000 storage # (core) Alias to hostpath-storage add-on, deprecated

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

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

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

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

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

microk8s enable dns hostpath-storage

実行結果

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.

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

microk8s.status

実行結果

microk8s is running high-availability: yes datastore master nodes: 192.168.125.100:19001 192.168.125.101:19001 192.168.125.102:19001 datastore standby nodes: none addons: enabled: dns # (core) CoreDNS ha-cluster # (core) Configure high availability on the current node helm # (core) Helm - the package manager for Kubernetes helm3 # (core) Helm 3 - the package manager for Kubernetes hostpath-storage # (core) Storage class; allocates storage from host directory storage # (core) Alias to hostpath-storage add-on, deprecated disabled: cert-manager # (core) Cloud native certificate management community # (core) The community addons repository dashboard # (core) The Kubernetes dashboard gpu # (core) Automatic enablement of Nvidia CUDA host-access # (core) Allow Pods connecting to Host services smoothly ingress # (core) Ingress controller for external access kube-ovn # (core) An advanced network fabric for Kubernetes mayastor # (core) OpenEBS MayaStor metallb # (core) Loadbalancer for your Kubernetes cluster metrics-server # (core) K8s Metrics Server for API access to service metrics minio # (core) MinIO object storage observability # (core) A lightweight observability stack for logs, traces and metrics prometheus # (core) Prometheus operator for monitoring and logging rbac # (core) Role-Based Access Control for authorisation registry # (core) Private image registry exposed on localhost:32000

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

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

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

microk8s enable metallb

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

Enter each IP address range delimited by comma (e.g. '10.64.140.43-10.64.140.49,192.168.0.105-192.168.0.111'):

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

192.168.125.100-192.168.125.102

実行結果

MetalLB is enabled

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

microk8s.status

実行結果

microk8s is running high-availability: yes datastore master nodes: 192.168.125.100:19001 192.168.125.101:19001 192.168.125.102:19001 datastore standby nodes: none addons: enabled: dns # (core) CoreDNS ha-cluster # (core) Configure high availability on the current node helm # (core) Helm - the package manager for Kubernetes helm3 # (core) Helm 3 - the package manager for Kubernetes hostpath-storage # (core) Storage class; allocates storage from host directory metallb # (core) Loadbalancer for your Kubernetes cluster storage # (core) Alias to hostpath-storage add-on, deprecated disabled: cert-manager # (core) Cloud native certificate management community # (core) The community addons repository dashboard # (core) The Kubernetes dashboard gpu # (core) Automatic enablement of Nvidia CUDA host-access # (core) Allow Pods connecting to Host services smoothly ingress # (core) Ingress controller for external access kube-ovn # (core) An advanced network fabric for Kubernetes mayastor # (core) OpenEBS MayaStor metrics-server # (core) K8s Metrics Server for API access to service metrics minio # (core) MinIO object storage observability # (core) A lightweight observability stack for logs, traces and metrics prometheus # (core) Prometheus operator for monitoring and logging rbac # (core) Role-Based Access Control for authorisation registry # (core) Private image registry exposed on localhost:32000

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

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

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

Helmについて

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

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

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

helm repo add bitnami https://charts.bitnami.com/bitnami

実行結果

"bitnami" has been added to your repositories

「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台目)で、次のコマンドを実行します。

helm install my-moodle bitnami/moodle

実行結果

NAME: my-moodle LAST DEPLOYED: Sat Feb 25 22:24:51 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: CHART NAME: moodle CHART VERSION: 14.3.8 APP VERSION: 4.1.1** Please be patient while the chart is being deployed ** 1. Get the Moodle&trade; URL: NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace default -w my-moodle' export SERVICE_IP=$(kubectl get svc --namespace default my-moodle --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}") echo "Moodle&trade; URL: http://$SERVICE_IP/" 2. Get your Moodle&trade; login credentials by running: echo Username: user echo Password: $(kubectl get secret --namespace default my-moodle -o jsonpath="{.data.moodle-password}" | base64 -d)

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

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

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

export SERVICE_IP=$(kubectl get svc --namespace default my-moodle --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")

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

echo "Moodle&trade; URL: http://$SERVICE_IP/"

実行結果

Moodle&trade; URL: http://192.168.125.100/

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

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

kubectl get svc --namespace default my-moodle

実行結果

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-moodle LoadBalancer 10.152.183.129 192.168.125.100 80:31039/TCP,443:30432/TCP 15m

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

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

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

kubectl get pods -o wide

実行結果

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-moodle-mariadb-0 1/1 Running 0 11m 10.1.104.4 node2 <none> <none> my-moodle-7bb99c9bc4-x9scz 1/1 Running 0 11m 10.1.166.131 node1 <none> <none>

この結果から、データベース用の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 となっています。

echo Username: user

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

echo Password: $(kubectl get secret --namespace default my-moodle -o jsonpath="{.data.moodle-password}" | base64 -d)

実行結果

Password: 8NayJKMZWp

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

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

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

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

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

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

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

helm uninstall my-moodle

実行結果

release "my-moodle" uninstalled

podを確認します。

kubectl get pods -o wide

実行結果

No resources found in default namespace.

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

その他のHelmチャート

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

microk8sの初期化

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

ノードの稼働状況の確認

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

kubectl get node -o wide

実行結果

NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME node2 Ready <none> 38m v1.26.1 192.168.125.102 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8 node1 Ready <none> 39m v1.26.1 192.168.125.101 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8 node0 Ready <none> 61m v1.26.1 192.168.125.100 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8

ノードの接続解除

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

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

microk8s leave

実行結果

Generating new cluster certificates. Waiting for node to start.

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

microk8s leave

実行結果

Generating new cluster certificates. Waiting for node to start.

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

kubectl get node -o wide

実行結果

NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME node0 Ready <none> 71m v1.26.1 192.168.125.100 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8 node2 NotReady <none> 47m v1.26.1 192.168.125.102 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8 node1 NotReady <none> 48m v1.26.1 192.168.125.101 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8

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

microk8s remove-node node1

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

kubectl get node -o wide

実行結果

NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME node2 NotReady <none> 51m v1.26.1 192.168.125.102 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8 node0 Ready <none> 75m v1.26.1 192.168.125.100 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8

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

microk8s remove-node node2

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

kubectl get node -o wide

実行結果

NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME node0 Ready <none> 75m v1.26.1 192.168.125.100 <none> Ubuntu 22.04.1 LTS 5.15.0-60-generic containerd://1.6.8

microk8sの初期化

sudo microk8s reset

実行結果

Disabling all addons Disabling addon : core/cert-manager Disabling addon : core/dashboard Disabling addon : core/dns Disabling addon : core/gpu Disabling addon : core/helm Disabling addon : core/helm3 Disabling addon : core/host-access Disabling addon : core/hostpath-storage Disabling addon : core/ingress Disabling addon : core/kube-ovn Disabling addon : core/mayastor Disabling addon : core/metallb Disabling addon : core/metrics-server Disabling addon : core/minio Disabling addon : core/observability Disabling addon : core/prometheus Disabling addon : core/rbac Disabling addon : core/registry Disabling addon : core/storage All addons are disabled. Deleting the CNI Cleaning resources in namespace kube-system Cleaning resources in namespace kube-public Cleaning resources in namespace kube-node-lease Cleaning resources in namespace default Removing CRDs Removing PriorityClasses Removing StorageClasses Restarting cluster Stopped. Setting up the CNI

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

microk8s.status

実行結果

microk8s is running high-availability: no datastore master nodes: 192.168.125.100:19001 datastore standby nodes: none addons: enabled: ha-cluster # (core) Configure high availability on the current node helm # (core) Helm - the package manager for Kubernetes helm3 # (core) Helm 3 - the package manager for Kubernetes disabled: cert-manager # (core) Cloud native certificate management community # (core) The community addons repository dashboard # (core) The Kubernetes dashboard dns # (core) CoreDNS gpu # (core) Automatic enablement of Nvidia CUDA host-access # (core) Allow Pods connecting to Host services smoothly hostpath-storage # (core) Storage class; allocates storage from host directory ingress # (core) Ingress controller for external access kube-ovn # (core) An advanced network fabric for Kubernetes mayastor # (core) OpenEBS MayaStor metallb # (core) Loadbalancer for your Kubernetes cluster metrics-server # (core) K8s Metrics Server for API access to service metrics minio # (core) MinIO object storage observability # (core) A lightweight observability stack for logs, traces and metrics prometheus # (core) Prometheus operator for monitoring and logging rbac # (core) Role-Based Access Control for authorisation registry # (core) Private image registry exposed on localhost:32000 storage # (core) Alias to hostpath-storage add-on, deprecated

「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チャートやマニフェストファイル、コンテナイメージを公開したくない場合があります。対策として、独自のコンテナレジストリやリポジトリを構築することを推奨します。