MinikubeでKubernatesのローカル環境を構築する

MinikubeでKubernatesのローカル環境を構築する
目次

builderscon tokyo 2018Kubernates に関する 発表がいくつかありました。業務的に使う機会がなかったのですが、これを機に触ってみようと思い、まずは環境構築から、という話です。

事前準備

以降は以下の環境にて実行することを前提としています。

VirtualBoxのインストール

今回インストールする Minikube では以下のVMをサポートしています。

  • virtualbox
  • vmwarefusion
  • KVM2
  • KVM (deprecated in favor of KVM2)
  • hyperkit
  • xhyve
  • hyperv

なんでも良いのですが、今回は過去に使ったことのある VirtualBox のインストーラをダウンロードし、インストールしました。

Minikube をインストールする

次に、ローカル環境で Kubernates を動かすために、 Minikube をインストールします。

1brew cask install minikube

インストールされたかを確認します。

1minikube version
2
3> minikube version: v0.29.0

これで minikube コマンドが使えるようになりました。

Usageを確認する

minikube help コマンドで、サブコマンドを確認してみます。

 1Minikube is a CLI tool that provisions and manages single-node Kubernetes clusters optimized for development workflows.
 2
 3Usage:
 4  minikube [command]
 5
 6Available Commands:
 7  addons         Modify minikube's kubernetes addons
 8  cache          Add or delete an image from the local cache.
 9  completion     Outputs minikube shell completion for the given shell (bash or zsh)
10  config         Modify minikube config
11  dashboard      Opens/displays the kubernetes dashboard URL for your local cluster
12  delete         Deletes a local kubernetes cluster
13  docker-env     Sets up docker env variables; similar to '$(docker-machine env)'
14  help           Help about any command
15  ip             Retrieves the IP address of the running cluster
16  logs           Gets the logs of the running instance, used for debugging minikube, not user code
17  mount          Mounts the specified directory into minikube
18  profile        Profile sets the current minikube profile
19  service        Gets the kubernetes URL(s) for the specified service in your local cluster
20  ssh            Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'
21  ssh-key        Retrieve the ssh identity key path of the specified cluster
22  start          Starts a local kubernetes cluster
23  status         Gets the status of a local kubernetes cluster
24  stop           Stops a running local kubernetes cluster
25  update-check   Print current and latest version number
26  update-context Verify the IP address of the running cluster in kubeconfig.
27  version        Print the version of minikube
28
29Flags:
30      --alsologtostderr                  log to standard error as well as files
31  -b, --bootstrapper string              The name of the cluster bootstrapper that will set up the kubernetes cluster. (default "kubeadm")
32  -h, --help                             help for minikube
33      --log_backtrace_at traceLocation   when logging hits line file:N, emit a stack trace (default :0)
34      --log_dir string                   If non-empty, write log files in this directory
35      --logtostderr                      log to standard error instead of files
36  -p, --profile string                   The name of the minikube VM being used.
37                                         	This can be modified to allow for multiple minikube instances to be run independently (default "minikube")
38      --stderrthreshold severity         logs at or above this threshold go to stderr (default 2)
39  -v, --v Level                          log level for V logs
40      --vmodule moduleSpec               comma-separated list of pattern=N settings for file-filtered logging

Minikubeの起動/停止

minikube start コマンドで Kubernates クラスタを起動します。

初回実行時、kubeletkubeadm もダウンロードされていることがわかります。

1minikube start
2
3> Starting local Kubernetes v1.10.0 cluster...
4> Starting VM...
5> Downloading Minikube ISO
6>  166.67 MB / 171.87 MB [== (中略)

余談ですが、 kubeadm のダウンロードが終了する前に minikube logs -f コマンドを実行してしまうと、以下のエラーメッセージが表示されます。

1F1005 08:25:45.623595    4174 logs.go:50] Error getting cluster bootstrapper: getting kubeadm bootstrapper: getting ssh client: Error dialing tcp via ssh client: dial tcp 127.0.0.1:22: connect: connection refused

起動確認をしてみます。

1minikube status
2
3> minikube: Running
4> cluster: Running
5> kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

停止するときは以下です。

1minikube stop

Minikubeの設定ファイルを確認する

minikube start にて無事 Minikube の起動が完了すると、~/.minikube/ 配下にファイルが生成されます。

 1/Users/xxxxxxxxxx/.minikube/
 2├── addons
 3├── apiserver.crt
 4├── apiserver.key
 5├── ca.crt
 6├── ca.key
 7├── ca.pem
 8├── cache
 9│   ├── iso
10│   │   └── minikube-v0.29.0.iso
11│   └── v1.10.0
12│       ├── kubeadm
13│       └── kubelet
14├── cert.pem
15├── certs
16│   ├── ca-key.pem
17│   ├── ca.pem
18│   ├── cert.pem
19│   └── key.pem
20├── client.crt
21├── client.key
22├── config
23├── files
24├── key.pem
25├── logs
26├── machines
27│   ├── minikube
28│   │   ├── boot2docker.iso
29│   │   ├── config.json
30│   │   ├── disk.vmdk
31│   │   ├── id_rsa
32│   │   ├── id_rsa.pub
33│   │   └── minikube
34│   │       ├── Logs
35│   │       │   ├── VBox.log
36│   │       │   └── VBox.log.1
37│   │       ├── minikube.vbox
38│   │       └── minikube.vbox-prev
39│   ├── server-key.pem
40│   └── server.pem
41├── profiles
42│   └── minikube
43│       └── config.json
44├── proxy-client-ca.crt
45├── proxy-client-ca.key
46├── proxy-client.crt
47└── proxy-client.key

profiles/minikube/config.json には以下のようにVMの設定と、Kubernates の設定が記載されていました。 これらは minikube start コマンドのオプションとして渡せる値たちですね。

 1{
 2    "MachineConfig": {
 3        "MinikubeISO": "https://storage.googleapis.com/minikube/iso/minikube-v0.29.0.iso",
 4        "Memory": 2048,
 5        "CPUs": 2,
 6        "DiskSize": 20000,
 7        "VMDriver": "virtualbox",
 8        "HyperkitVpnKitSock": "",
 9        "HyperkitVSockPorts": [],
10        "XhyveDiskDriver": "ahci-hd",
11        "DockerEnv": null,
12        "InsecureRegistry": null,
13        "RegistryMirror": null,
14        "HostOnlyCIDR": "192.168.99.1/24",
15        "HypervVirtualSwitch": "",
16        "KvmNetwork": "default",
17        "DockerOpt": null,
18        "DisableDriverMounts": false,
19        "NFSShare": [],
20        "NFSSharesRoot": "/nfsshares",
21        "UUID": "",
22        "GPU": false
23    },
24    "KubernetesConfig": {
25        "KubernetesVersion": "v1.10.0",
26        "NodeIP": "192.168.99.100",
27        "NodeName": "minikube",
28        "APIServerName": "minikubeCA",
29        "APIServerNames": null,
30        "APIServerIPs": null,
31        "DNSDomain": "cluster.local",
32        "ContainerRuntime": "",
33        "NetworkPlugin": "",
34        "FeatureGates": "",
35        "ServiceCIDR": "10.96.0.0/12",
36        "ExtraOptions": null,
37        "ShouldLoadCachedImages": false
38    }
39}

クラスタの削除

minikube delete コマンドは ローカルのクラスタや関連ファイルを削除する ことができます。 実際に試してみたところ、 machines/minikube ディレクトリと profiles/minikube/config.json ファイルが削除されていることを確認できました。

プロファイルによるインスタンスの切り替え

設定ファイルを削除して気づいたのですが、 Minikube には profile の概念があり、 複数の Minikube インスタンスを扱うことができるようです。

デフォルトでは minikube というプロファイルが存在しますが、 minikube profile ${プロファイル名} で現在の Minikube インスタンスを別プロファイルとして扱えます。

例えば、以下のようにしてプロファイル hoge を作成した後、起動すると、

1minikube profile hoge
2
3> minikube profile was successfully set to hoge
4
5minikube start

先程の設定ファイルのディレクトリ内にもプロファイル用の設定が新規で追加されています。なるほどですね。

 1├── machines
 2│   ├── hoge
 3│   │   ├── boot2docker.iso
 4│   │   ├── config.json
 5│   │   ├── disk.vmdk
 6│   │   ├── hoge
 7│   │   │   ├── Logs
 8│   │   │   │   └── VBox.log
 9│   │   │   ├── hoge.vbox
10│   │   │   └── hoge.vbox-prev
11│   │   ├── id_rsa
12│   │   └── id_rsa.pub
13│   ├── minikube
14│   │   ├── boot2docker.iso
15│   │   ├── config.json
16│   │   ├── disk.vmdk
17│   │   ├── id_rsa
18│   │   ├── id_rsa.pub
19│   │   └── minikube
20│   │       ├── Logs
21│   │       │   └── VBox.log
22│   │       ├── minikube.vbox
23│   │       └── minikube.vbox-prev
24│   ├── server-key.pem
25│   └── server.pem
26├── profiles
27│   ├── hoge
28│   │   └── config.json
29│   └── minikube
30│       └── config.json

プロファイルをデフォルトに戻すときは minikube profile default としてあげます。

「あれ?私は今どっちのプロファイルでminikube立ち上げてるんだ?」と都度意識してあげる必要はありそうです。

ダッシュボードを確認する

最後に、ローカル環境で起動した Kubernates クラスタをダッシュボードで確認しましょう。

1minikube dashboard

ここまでできれば、次は開発ができそうです!