Minikube を macOS (HyperKit) | Windows (Hyper-V) で使う

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は下回っています。

f:id:kondoumh:20191005085717p:plain

使わないときは、クラスターを停止しておくことができます。

$ minikube stop
✋  Stopping "minikube" in hyperkit ...
🛑  "minikube" stopped.

これで HyperKit のプロセスは消滅します。

kubectl の向き先を Docker Desktop の Kubernetes に切り替えるには config use を使います。

$ kubectl config use docker-desktop

もう少し簡潔なコマンドエイリアスを提供してくれる kubectx のようなツールもあります。

github.com

次に、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 を設定しておきます。

f:id:kondoumh:20191005125443p:plain

起動中にダイアログが出るため、PowerShell のメッセージがくずれてしまっていますが・・

起動してしまえば kubectl の実行は非管理者モードで可能です。git-bash などを使った方が作業は楽でしょう。

f:id:kondoumh:20191005125819p:plain

Minikube はシングルノードであるため Auto Scaling などの機能は使えませんし、いくつかのプロセスをデーモンではなく Pod としてエミュレートしたりしているため、本番環境相当のテストはできませんが、通常の開発用途としては十分な環境と言えるでしょう。

HyperVisor ベースの仮想化技術を使うことで別 OS を起動するオーバーヘッドなく高速・軽量なノードを使えること、Docker Desktop と違って Kubernetes のバージョンの切り替えが簡単なこと、Docker デーモンを常駐させなくても利用可能なことなどもメリットかと思います。

*1:Docker Desktop ではランタイムに持っていてシステムのバイナリは使っていないのでしょう。

*2:Preview 版の Windows Terminal で実行しています。