Minikube は VirtualBox / VMware の VM をノードにして使うケースが多いと思いますが、macOS の Hyperkit や Linux の KVM、そして Windows の Hyper-V などホスト OS の HyperVisor による VM を使うことで、軽量で実行性能の高いノードで環境を構築することができます。
macOS に HpyerKit に特化した Minikube 環境を構築してみました。
https://minikube.sigs.k8s.io/docs/drivers/hyperkit/
すでに Docker Desktop を導入していたので、HyperKit は入っていると思っていたのですが、minikube start してみるとエラーが出たので brew でインストールしました*1。
$ brew install hyperkit
minikube と docker-machine-driver-hyperkit (HyperKit の VM 上の Docker ドライバ) はバージョンを合わせられるよう GitHub の Releases からダウンロードして導入。
Releases · kubernetes/minikube · GitHub
$ curl -Lo minikube https://github.com/kubernetes/minikube/releases/download/v1.4.0/minikube-darwin-amd64 $ chmod u+x minikube $ mv minikube /usr/local/bin/ $ curl -LO https://github.com/kubernetes/minikube/releases/download/v1.4.0/docker-machine-driver-hyperkit chmod u+x docker-machine-driver-hyperkit $ mv docker-machine-driver-hyperkit /usr/local/bin/
Minikube のデフォルト値を設定して、VM Driver として HpyerKit を利用するようにします。その他、仮想マシンの CPU 数やメモリ量なども設定しておきます。
$ minikube config set memory 4096 $ minikube config set cpus 2 $ minikube config set vm-driver hyperkit $ minikube config view - cpus: 2 - memory: 4096 - vm-driver: hyperkit
kubernetes のバージョンもオプションの --kubernetes-version
で指定したり、config に設定しておくことが可能です。
クラスターを構築して起動します。デフォルトでは minikube という名前のクラスターを作成します。
$ minikube start 😄 minikube v1.4.0 on Darwin 10.14.6 💾 Downloading driver docker-machine-driver-hyperkit: > docker-machine-driver-hyperkit.sha256: 65 B / 65 B [---] 100.00% ? p/s 0s > docker-machine-driver-hyperkit: 28.85 MiB / 28.85 MiB 100.00% 4.88 MiB p 🔑 The 'hyperkit' driver requires elevated permissions. The following commands will be executed: $ sudo chown root:wheel /Users/masa/.minikube/bin/docker-machine-driver-hyperkit $ sudo chmod u+s /Users/masa/.minikube/bin/docker-machine-driver-hyperkit 🔥 Creating hyperkit VM (CPUs=2, Memory=4096MB, Disk=20000MB) ... 🐳 Preparing Kubernetes v1.16.0 on Docker 18.09.9 ... 💾 Downloading kubelet v1.16.0 💾 Downloading kubeadm v1.16.0 🚜 Pulling images ... 🚀 Launching Kubernetes ... ⌛ Waiting for: apiserver proxy etcd scheduler controller dns 🏄 Done! kubectl is now configured to use "minikube"
数分で起動し、kubectl の context が minikube にスイッチされます。
$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE docker-desktop docker-desktop docker-desktop * minikube minikube minikube
namespace kube-system で動作している Pod を見てみると通常は、systemd でサービス起動している etcd / kube-api-server / kube-scheduler などが、-minikube
という suffix 付きの Pod として起動していることがわかります。
$ kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE coredns-5644d7b6d9-ghrbq 1/1 Running 0 8m56s coredns-5644d7b6d9-gj8s9 1/1 Running 0 8m56s etcd-minikube 1/1 Running 0 8m9s kube-addon-manager-minikube 1/1 Running 0 7m56s kube-apiserver-minikube 1/1 Running 0 7m46s kube-controller-manager-minikube 1/1 Running 0 7m42s kube-proxy-9mtqh 1/1 Running 0 8m56s kube-scheduler-minikube 1/1 Running 0 8m3s storage-provisioner 1/1 Running 0 8m52s
アクティビティモニタをみると HyperKit が 3GB ちょっとメモリを使用しており、config に指定した 4GBは下回っています。
使わないときは、クラスターを停止しておくことができます。
$ minikube stop ✋ Stopping "minikube" in hyperkit ... 🛑 "minikube" stopped.
これで HyperKit のプロセスは消滅します。
kubectl の向き先を Docker Desktop の Kubernetes に切り替えるには config use を使います。
$ kubectl config use docker-desktop
もう少し簡潔なコマンドエイリアスを提供してくれる kubectx のようなツールもあります。
次に、Windows 10 (Hyper-V) 環境への導入です。
https://minikube.sigs.k8s.io/docs/drivers/hyperv/
PowerShell を管理者モードで起動し、Hyper-V を有効化します。
> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
kubectl と minikube はバイナリを取得して、パスの通ったフォルダに配置します。
https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-windows
Releases · kubernetes/minikube · GitHub
Windows 版はインストーラーもありますが、minikube-windows-amd64.exe をリネームして使えばよいでしょう。
Minikube の start / stop は管理者モードで実行する必要があります。PowerShell や cmd.exe を管理者モードで起動します*2。minikube config で vm-driver に hyperv を設定しておきます。
起動中にダイアログが出るため、PowerShell のメッセージがくずれてしまっていますが・・
起動してしまえば kubectl の実行は非管理者モードで可能です。git-bash などを使った方が作業は楽でしょう。
Minikube はシングルノードであるため Auto Scaling などの機能は使えませんし、いくつかのプロセスをデーモンではなく Pod としてエミュレートしたりしているため、本番環境相当のテストはできませんが、通常の開発用途としては十分な環境と言えるでしょう。
HyperVisor ベースの仮想化技術を使うことで別 OS を起動するオーバーヘッドなく高速・軽量なノードを使えること、Docker Desktop と違って Kubernetes のバージョンの切り替えが簡単なこと、Docker デーモンを常駐させなくても利用可能なことなどもメリットかと思います。