minikubeでローカルKubernetesクラスタを5分でつくる方法

minikubeはKubernetes公式のツールで、フル機能のKubernetesをローカル環境に構築することができます。Kubernetesへデプロイするアプリのテスト時、k8s objectをいじるたびにサーバにデプロイ・・みたいなことをするのがこれまで面倒でしたが、minikubeでだいぶ楽になりました。

## TL;DR

docker-machine + [redspread/localkube](https://github.com/redspread/localkube)よりだいぶ良いです。

~~ただし、5/31現在の0.1.0では、コンテナから外部ホストをDNSで解決できない問題がある（例えば、DatadogコンテナからメトリクスをDatadogへ送れないとか、apt-get updateできないとか)ので、もうしばらく待ちましょう。~~

~~ぼくは、今のところlocalkube+docker-machine最新版+Docker古いの(boot2docker v1.9.1をdocker-machineのオプション指定)で使ってます。DNS問題が解決したら、またminikubeを試してみる予定。~~

~~とりあえず、minikubeにIssue立てました。~~
~~https://github.com/kubernetes/minikube/issues/137
勘違いだったらいいんですが・・。他にもこの問題にあたった人は、ぜひコメントしていただけると。~~

0.2.0で修正されたようです。

2016年12月現在の最新バージョンは0.13.0です。

## minikubeの生い立ち

minikubeはlibmachine + [redspread/localkube](https://github.com/redspread/localkube)で作られています。

## 前提

* 2016/12/2にリリースされたバージョン0.13.0を使います

https://github.com/kubernetes/minikube/releases

## 手順

### minikubeのインストール

```
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.13.0/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
```

### Kubernetesクラスタの作成

```
$ minikube start
Starting local Kubernetes cluster...
Creating CA: /Users/$USER/.minikube/certs/ca.pem
Creating client certificate: /Users/$USER/.minikube/certs/cert.pem
Running pre-create checks...
(minikubeVM) Image cache directory does not exist, creating it at /Users/$USER/.minikube/cache...
Creating machine...
(minikubeVM) Downloading /Users/$USER/.minikube/cache/boot2docker.iso from https://storage.googleapis.com/minikube/minikube-0.1.iso...
(minikubeVM) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
(minikubeVM) Creating VirtualBox VM...
(minikubeVM) Creating SSH key...
(minikubeVM) Starting the VM...
(minikubeVM) Check network to re-create if needed...
(minikubeVM) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
Kubernetes is available at https://192.168.99.101:443.
Run this command to use the cluster:
kubectl config use-context minikube
```

### kubectlの設定

kubectlで操作する対象のKubernetesクラスタは複数設定できるのですが、
実際何らかのコマンドを実行するにあたっては、クラスタ(context)を一つ選ぶ必要があります。

今回、`minikube start`でつくられたクラスタはminikubeという名前のcontextになっているので、それを`kubectl config use-context`で選択します。

```
$ kubectl config use-context minikube
switched to context "minikube".
```

以降は、普通にkubectlコマンドを使えます。

### minikube内のDockerデーモンへアクセスする

kubernetesクラスタの調査などの目的で、直接Dockerコマンドを叩きたい場合もあると思います。
一番よくあるのは、`docker build`したいときでしょうか。
その場合は、`docker`コマンドにdocker daemonの場所を伝えるために所定の環境変数を設定しておく必要があります。

docker-machine + localkubeを利用していた人は、`eval "$(docker-machine env hogehoge)`を利用していたかと思いますが、minikubeにも同様のコマンドが用意されています。

```
$ eval "$(minikube docker-env)"
```

### Dockerバージョンの確認

`docker-machine`をお使いの方は、これまで「machineをアップグレードしたら、Kubernetesが対応していないDocker Engine（1.10とか1.11)になってしまってつらい（しかも完全に動かないわけではないのがつらい)」みたいなことがあったと思います。

`minikube`はちゃんとKubernetesが対応しているバージョンのDockerをインストールしておいてくれます。`docker info`で確認してみましょう。

#### k8s 1.3用のminikube 0.5.0のとき

```
$ docker info
Containers: 32
Images: 102
Server Version: 1.11.1
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 276
 Dirperm1 Supported: true
Logging Driver: json-file
Kernel Version: 4.4.14-boot2docker
Operating System: Boot2Docker 1.11.1 (TCL 7.1); master : 901340f - Fri Jul  1 22:52:19 UTC 2016
CPUs: 1
Total Memory: 995.9 MiB
Name: minikubeVM
ID: W5CC:I65P:4675:OAGY:EDTH:IMI5:IWUG:U2ZR:NSFW:LH25:EFYT:Q7Z2
Debug mode (server): true
 File Descriptors: 56
 Goroutines: 116
 System Time: 2016-07-11T06:59:49.867484291Z
 EventsListeners: 0
 Init SHA1:
 Init Path:
 Docker Root Dir: /mnt/sda1/var/lib/docker
Username: mumoshu
Registry: https://index.docker.io/v1/
Labels:
 provider=virtualbox
```

#### k8s 1.2用のminikube 0.2.0のとき

```
$ docker info
Containers: 4
Images: 23
Server Version: 1.9.1
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 31
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.4.8-boot2docker
Operating System: Boot2Docker 1.9.1 (TCL 7.0); master : 7954f54 - Wed Apr 27 17:59:58 UTC 2016
CPUs: 1
Total Memory: 995.9 MiB
Name: minikubeVM
ID: S5CD:FAFS:AJUW:5MN5:XQXB:4UJO:IJGY:HFDC:FH3W:KZAR:IDK7:NYY2
Debug mode (server): true
 File Descriptors: 35
 Goroutines: 59
 System Time: 2016-05-31T03:49:02.201025026Z
 EventsListeners: 0
 Init SHA1:
 Init Path: /usr/local/bin/docker
 Docker Root Dir: /mnt/sda1/var/lib/docker
Username: mumoshu
Registry: https://index.docker.io/v1/
Labels:
 provider=virtualbox
```

`Server Version: 1.9.1`とあるように、Kubernetes 1.2が前提としているDocker 1.9.1がインストールできていることが確認できました。

### minikube VMにSSH接続する

### k8s 1.3用のminikube 0.5.0以降

以前のバージョンのminikubeと比べて簡単になりました。

```
$ minikube ssh
```

#### k8s 1.2用のminikube 0.2.0のとき

`docker-machine ssh`のようなコマンドはまだ用意されていないので、

* ユーザ名
* 接続先ホスト
* 秘密鍵の場所

を使ってSSHコマンドを実行する必要があります。

ユーザ名はdocker-machine同様dockerで、接続先IPアドレスは`minikube ip`でとれます。秘密鍵は、`~/.minikube`以下に保存されています。

```
$ ssh -i ~/.minikube/machines/minikubeVM/id_rsa docker@$(minikube ip)
```