microk8sによるプライベートクラウド構築およびminikubeによる開発/検証環境の構築
Kubernetes環境のHA(高可用性)クラスターを構築するには、お使いのパソコンまたはサーバーのCPUのコア数が4つ以上あることが前提です。メモリは、最低でも16GB以上が必要です。メモリ16GBのパソコンの場合は、スペックがぎりぎりなので、コンテナや仮想環境関係以外のアプリは可能な限り終了しないと、パソコンがリソース不足でフリーズします。したがって、メモリ16GBを含め、メモリ16GB以下の場合は、「シングルノード構成でKubernetes環境を構築する場合 ( minikube )」に取り組むことを推奨します。
Kubernetesは、クラウドのOS(基本ソフト)と呼ばれます。ここではKubernetesを導入する手段として、microk8sとminikubeを用います。microk8sによるプライベートクラウドとして使えるKubernetesクラスターの作り方と、仮想マシン1台で開発や検証向けのKubernetesクラスターを構築するminikube(みにくべ、みにくーべ)について説明します。
目次
- 1 Kubernetesベースのプライベートクラウド構築 = Newオンプレミス
- 2 シングルノード構成でKubernetes環境を構築する場合 ( minikube )
- 2.1 Macの場合
- 2.1.1 homebrew の有無を確認
- 2.1.2 homebrew のインストール
- 2.1.3 minikubeを動かすプラットフォーム選び
- 2.1.4 kubectl のインストール
- 2.1.5 minikube のインストール
- 2.1.6 クラスター「minikube」の起動
- 2.1.7 クラスター「minikube」の起動確認
- 2.1.8 クラスター「minikube」の停止
- 2.1.9 クラスター「minikube」の削除
- 2.2 Linuxの場合 (WSL2やVM、ベアメタルマシン)
- 2.2.1 homebrew の有無を確認
- 2.2.2 homebrew のインストール
- 2.2.3 Dockerをインストール
- 2.2.3.1 GUI環境を使っていない場合
- 2.2.3.2 GUI環境を使っている場合
- 2.2.4 kubectlのインストール
- 2.2.4.1 CPUが、intel / AMD の場合
- 2.2.4.2 CPUが、Apple M1/M2/M3など、ARM系の場合
- 2.2.5 minikube のインストール
- 2.2.6 クラスター「minikube」の起動
- 2.2.7 クラスター「minikube」の起動確認
- 2.2.8 クラスター「minikube」の停止
- 2.2.9 クラスター「minikube」の削除
- 2.3 Windowsの場合
- 2.3.1 VirtualBoxのインストール
- 2.3.2 Python3とpipのインストール
- 2.3.2.1 Python3 のインストール
- 2.3.2.2 pip のバージョンアップ
- 2.3.3 Chocolatey のインストール
- 2.3.4 kubectl のインストール
- 2.3.5 minikube のインストール
- 2.3.6 クラスター「minikube」の起動
- 2.3.7 クラスター「minikube」 の起動確認
- 2.3.8 クラスター「minikube」の停止
- 2.3.9 クラスター「minikube」の削除
- 2.4 クラスター「minikube」の起動でエラーが起きた場合、別のプラットフォームでminikubeを起動する方法
- 2.1 Macの場合
- 3 djangoプロジェクトをKubernetes環境で動かす手順 ( Helm 非使用 )
- 3.1 必要な環境
- 3.2 pyenvによるPythonのインストール
- 3.2.1 pyenvによるPythonのインストール
- 3.2.2 Pythonのパスを通す
- 3.2.2.1 実行の結果、/bin/zshと表示される場合
- 3.2.2.2 実行の結果、/bin/bash と表示される場合
- 3.2.3 Pythonのパスが通ったことを確認する
- 3.3 pipenvのインストール
- 3.4 djangoのインストールおよびプロジェクトの作成、設定
- 3.5 django向けDockerfileの作成
- 3.6 クラスター「minikube」の起動
- 3.7 ローカルのdockerから、minikube上のdockerに切り替え
- 3.8 コンテナイメージの作成
- 3.9 Kubernetes向けマニフェストファイル(YAMLファイル)の作成
- 3.10 Kubernetesにデプロイ
- 3.11 Webブラウザで起動確認
- 4 Helmチャートを使って、minikubeにアプリケーションをデプロイする場合
- 4.1 Helmをインストール
- 4.1.1 Macの場合
- 4.1.2 Linuxの場合
- 4.1.3 Windowsの場合
- 4.2 Helmチャート用リポジトリの追加
- 4.3 HelmチャートによるWordPressのデプロイ
- 4.3.1 Helmチャートによるデプロイ
- 4.3.2 起動したサービスの確認
- 4.3.3 WordPress 管理者パスワードの取得
- 4.3.3.1 base64のインストール
- 4.3.3.1.1 Macの場合
- 4.3.3.1.2 Linux(Ubuntu)の場合
- 4.3.3.1.3 Windowsの場合
- 4.3.3.2 指定されたコマンドを用いたWordPressの管理者パスワード取得
- 4.3.3.1 base64のインストール
- 4.3.4 Webブラウザで起動確認
- 4.4 Helmチャートで起動したアプリケーションを削除する方法
- 4.1 Helmをインストール
- 5 (発展) kind(Kubernetes in Docker)
- 6 KubernetesのHAクラスターを構築する場合 ( CPU 4コア以上、メモリ16GB以上(できれば24GB以上)のパソコン )
- 6.1 作業用の仮想マシンの作成
- 6.2 ひな形になる仮想マシンの用意
- 6.3 1台目の仮想マシンの作業
- 6.3.1 hostsファイルの編集
- 6.3.2 microk8sのインストール
- 6.3.2.1 microk8sにおけるkubectlの扱い
- 6.3.2.2 microk8sにおけるHelmの扱い
- 6.3.2.3 microk8sの稼働状況の確認
- 6.4 1台目の仮想マシンをバックアップ
- 6.5 仮想マシンの複製
- 6.6 2台目の仮想マシン、個別の作業
- 6.6.1 ホスト名の変更
- 6.6.2 ホストオンリーアダプタの固定IPアドレスを変更
- 6.6.3 再起動
- 6.7 3台目の仮想マシン、個別の作業
- 6.7.1 ホスト名の変更
- 6.7.2 ホストオンリーアダプタの固定IPアドレスを変更
- 6.7.3 再起動
- 6.8 HA(高可用性)クラスターの構成
- 6.8.1 2台目の仮想マシンを1台目に接続
- 6.8.2 3台目の仮想マシンを1台目に接続
- 6.8.3 1台目の仮想マシンでノードの接続確認
- 6.8.4 障害ドメインの設定
- 6.8.5 microk8sのステータス確認
- 6.9 microk8sアドオン(dns, hostpath-storage)の有効化
- 6.10 microk8sアドオン(mtallb)の有効化
- 6.11 HelmによるCMS(Drupal)のデプロイ
- 6.11.1 Helmについて
- 6.11.2 Helmチャート用リポジトリの追加
- 6.11.3 HelmチャートによるDrupalのデプロイ
- 6.11.4 クラスターの外部から、デプロイしたLMSにアクセスするURLの取得
- 6.11.5 稼働中のpodがどこのノードに属しているか確認
- 6.11.6 Moodleの管理者ユーザーのためのパスワードの取得、管理者画面へのログイン
- 6.11.7 稼働中のpodに接続し、bashシェルを使ってコマンド操作を行う方法 ( 作業中 )
- 6.11.8 稼働中のリリースのアンインストール
- 6.11.9 その他のHelmチャート
- 6.12 microk8sの初期化
- 6.12.1 ノードの稼働状況の確認
- 6.12.2 ノードの接続解除
- 6.12.3 microk8sの初期化
- 6.13 ここまでのまとめ
- 6.14 シングルノード構成のmicrok8s環境を使うケース
- 6.15 その他、可能であれば検討すべきこと
- 6.15.1 microk8sにおけるストレージの扱い
- 6.15.2 独自のコンテナレジストリの構築
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ブラウザでアクセスすると、下図のように表示されます。表示されるまで少し時間がかかります。
URLの後ろに、/wp-admin を追加し、Enterキーを押すことで、WordPressの管理画面が表示されます。先ほど確認したWordPress管理者のユーザー名(user)とパスワードを使って、ログインします。
ログインすることで、WordPressの管理者画面にアクセスすることができます。
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™ 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™ URL: http://$SERVICE_IP/"
2. Get your Moodle™ 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™ URL: http://$SERVICE_IP/"
実行結果
Moodle™ 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と同じような操作でデプロイすることができます。
営業活動の見える化と顧客関係管理を行う「SuiteCRM」
企業資源計画や統合業務管理システムと呼ばれる組織の経営管理を行う「Odoo」
ECサイト構築ツール「PrestaShop」
ローコード開発ツール「Appsmith」
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チャートやマニフェストファイル、コンテナイメージを公開したくない場合があります。対策として、独自のコンテナレジストリやリポジトリを構築することを推奨します。