minikube の driver について
minikube の driver について

minikube の driver について

はじめに

kubernetes の設定確認などで minikube で動作検証を行うという事は良くあると思いますが、 minikube に暫く触っていなかった結果、挙動が少し変わっていたのでメモがてら記事にします

minikube とは

minikube は mac, linux, windows 環境において local の kubernetes クラスターを作るためのツールです。基本的には開発や検証用途を目的に作られており、本番環境での利用は想定されていません

本番の kubernetes cluster は複数の node 上で動く事を想定していますが、minikube は検証用なので 1 node 上で動かす kubernetes cluster というものになります

この記事では minikube を使って検証する際に理解しておくべきネットワークの概要についてまとめます。なお、検証につかった minikube の version は v1.22.0 になります

$ minikube version
minikube version: v1.22.0
commit: a03fbcf166e6f74ef224d4a63be4277d017bb62e

minikube のインストール

以下の手順に沿ってインストールしていきます

MacOS x86-64 Stable の場合は以下のようになります (ちなみに 2021年9月時点だと architecture は x86-64 と ARM64 のみだったので M1 の場合どうなるんだろう、と思いました...)

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

minikube の動作確認

minikube がインストールできたら起動できますが、その前に driver について少し解説します

minikube の driver について

minikube は Docker や Virtual Machine 上で動き、動作させる環境を driver を使って指定する事が可能です。サポートされている driver は OS によって変わりますが、MaxOSX だと以下の Driver がサポートされています (2021年9月)

Docker - VM + Container (preferred)
Hyperkit - VM
VirtualBox - VM
Parallels - VM
VMware - VM
SSH - remote ssh

それぞれの driver の説明に公式ページから飛べますが、正直多くの情報は記載されていない印象です

どの driver が default で使われるかは、minikube の version によって変わり、ソースコードから確認でき、docker driver はどうやら下記の PR で default となったみたいです

私はこの default driver が変更になった事に全く気が付いていなかったので、local での動作確認に手間取ってしまいました (具体的には minikube ip コマンドで取得できる ip に host マシンから直接接続できると思い込んでしまっていました...)

minikube を起動してみる

driver について少し理解した所で、minikube を実際に起動してみます

以下のコマンドで起動ができます

$ minikube start

以下のように docker driver が自動的に選択された事がわかります

😄  Darwin 10.14.6 上の minikube v1.22.0
✨  dockerドライバーが自動的に選択されました。他の選択肢:  hyperkit, virtualbox, ssh

私の環境では docker の他に hyperkitvirtualbox も利用可能である事がわかります (おそらくパラレルデスクトップ等をインストールしているマシンでは Parallels なども選択可能なのではと思います)

driver = docker 時の挙動

こちら のチュートリアルに従って deployments と service を作って動作確認をしてみます

kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080

service を確認すると NodePort が node にあけた port が確認できます (ここでは 31976 です)

$ kubectl get svc
NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.99.106.111   <none>        8080:31976/TCP   9s
kubernetes       ClusterIP   10.96.0.1       <none>        443/TCP          55s

<NodeのIP>:<NodePortがあけたPort> で接続できそうなので、試してみます

Node の IP は minikube ip で確認できます

$ minikube ip
192.168.49.2

この例では minikube の ip は 192.168.49.2 なので 192.168.49.2:31976 で接続できそうですが、ここで curl などで接続を試みても接続できません

# 接続できない
$ curl 192.168.49.2:31976

driver が docker の場合は minikube ip で取得できる node の ip に host のネットワークから直接アクセスができないようです

docker driver の場合は変わりに minikube service コマンド を使って host からアクセス可能な url を発行する必要があります

$ minikube service hello-minikube 
|-----------|----------------|-------------|---------------------------|
| NAMESPACE |      NAME      | TARGET PORT |            URL            |
|-----------|----------------|-------------|---------------------------|
| default   | hello-minikube |        8080 | http://192.168.49.2:31976 |
|-----------|----------------|-------------|---------------------------|
🏃  Starting tunnel for service hello-minikube.
|-----------|----------------|-------------|------------------------|
| NAMESPACE |      NAME      | TARGET PORT |          URL           |
|-----------|----------------|-------------|------------------------|
| default   | hello-minikube |             | http://127.0.0.1:53845 |
|-----------|----------------|-------------|------------------------|

これで 127.0.0.1:53845 にへのアクセスを 192.168.49.2:31976 に forward してくれるようになります

$ curl http://127.0.0.1:53845
CLIENT VALUES:
client_address=172.17.0.1
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://127.0.0.1:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=127.0.0.1:53845
user-agent=curl/7.54.0
BODY:

driver = virtualbox 時の挙動

driver として virtualbox を指定すると以下のように virtual box で起動してくれます

* ただし virtualbox の起動は非常に遅く、数分程度は余裕でかかります

$ minikube start --driver=virtualbox --cpus=2
😄  Darwin 10.14.6 上の minikube v1.22.0
✨  設定を元に、 virtualbox ドライバを使用します
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🔥  virtualbox VM (CPUs=2, Memory=6000MB, Disk=20000MB) を作成しています...

起動が終わって Virtual Box の Application で確認すると、一つ仮装環境が立ち上がっている事が確認できます

image

この状態で docker driver の時と同様に deployments と service を作って動作確認をしてみます

kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080

service を確認すると以下のように NodePort があけた port (下では 30751) が確認できます

$ kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
hello-minikube   NodePort    10.102.139.101   <none>        8080:30751/TCP   99s
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          7m17s

ここで minikube の ip (virtual box の ip) を確認してアクセスすると接続が確認できます

$ IP=`minikube ip`
$ curl curl $IP:30751

また minikube service コマンドを使うと、 minikube ip で取得できる ip と同じ ip が返される事がわかります

$ minikube service hello-minikube
|-----------|----------------|-------------|-----------------------------|
| NAMESPACE |      NAME      | TARGET PORT |             URL             |
|-----------|----------------|-------------|-----------------------------|
| default   | hello-minikube |        8080 | http://192.168.99.101:30751 |
|-----------|----------------|-------------|-----------------------------|

特に tunnel を作る必要が無い場合は作らないようになっていると思われます

おわりに

minikube の docker と virtualbox driver それぞれで、service に host から接続しつつ、挙動を確認しました。私は minikube の driver は virtualbox だと思い込んでいたせいで service への接続に手間取ってしまいましたが、ブランクがある際は公式をチェックするのは大事だなと改めておもいました

また、以前は virtualbox 環境の起動が非常に遅かった印象でしたが、driver が docker になったおかげか、起動や停止、削除などが非常に高速になっており、非常に使いやすくなっているなと感じました