- はじめに
- minikube とは
- minikube のインストール
- minikube の動作確認
- minikube の driver について
- minikube を起動してみる
- driver = docker 時の挙動
- driver = virtualbox 時の挙動
- おわりに
はじめに
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
の他に hyperkit
や virtualbox
も利用可能である事がわかります (おそらくパラレルデスクトップ等をインストールしているマシンでは 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 で確認すると、一つ仮装環境が立ち上がっている事が確認できます
この状態で 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 になったおかげか、起動や停止、削除などが非常に高速になっており、非常に使いやすくなっているなと感じました