minikubeを開発用クラスタとして利用する際の基本的な使い方

# 概要
minikubeでk8sのローカルクラスタを構築して、開発環境として利用する際のコマンド例などのメモです。

Docker Desktopに付属のk8sクラスタの代替として利用するようなシンプルな利用方法を想定しています。またMac上で動かすことを想定に記載していますが、OS環境に依存する部分はほとんどありません。

# 基本的な使い方
## クラスタの作成（初回起動）

初回起動時に色々なパラメータを指定した上で `start` コマンドを実行することでクラスタを作成します。

### 主なパラメータ

- `p`: クラスタを識別するためのプロファイル名（省略可能ですがとりあえず付けておくのがオススメです）
- `cpus`: コア数
- `memory`: メモリサイズ[MB]
- `disk-size`: ディスクサイズ
- `driver`: 仮想化に利用するドライバーの種別（Macでは `hyperkit` がIdle時のCPU使用率的にはオススメです）
- `kubernetes-version`: Kubernetesバージョン（無指定だとデフォルトのバージョンが使われます）

### 実行例

```console
$ minikube start -p minikube-dev1 --cpus 2 --memory 4096 --disk-size 50g --driver hyperkit
😄  [minikube-dev1] minikube v1.21.0 on Darwin 11.4
✨  Using the hyperkit driver based on user configuration
👍  Starting control plane node minikube-dev1 in cluster minikube-dev1
🔥  Creating hyperkit VM (CPUs=2, Memory=4096MB, Disk=51200MB) ...
🐳  Preparing Kubernetes v1.20.7 on Docker 20.10.6 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube-dev1" cluster and "default" namespace by default
```

## クラスタの停止

クラスタを停止する際は `stop` コマンドで停止します。
k8sはアイドル時も一定のCPUを消費するので、不要になったクラスタは停止しておいた方がマシンに優しくなります。（ただし後述するauto-pause add-onを入れておけば、アイドル時のCPU消費を大幅に削減できるので無理に止めなくても良いかもしれません）

### 実行例

```console
$ minikube stop -p minikube-dev1
✋  Stopping node "minikube-dev1"  ...
🛑  1 nodes stopped.
```

## スタート（２回目以降）

停止したクラスタを再度起動する場合は単純に `start` コマンドを実行します。

### 実行例

```console
$ minikube start -p minikube-dev1
😄  [minikube-dev1] minikube v1.21.0 on Darwin 11.4
✨  Using the hyperkit driver based on existing profile
👍  Starting control plane node minikube-dev1 in cluster minikube-dev1
🔄  Restarting existing hyperkit VM for "minikube-dev1" ...
🐳  Preparing Kubernetes v1.20.7 on Docker 20.10.6 ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube-dev1" cluster and "default" namespace by default
```

## クラスタの削除

不要になったクラスタを削除する場合は `delete` コマンドで削除します。

### 実行例

```console
$ minikube delete -p minikube-dev1
🔥  Deleting "minikube-dev1" in hyperkit ...
💀  Removed all traces of the "minikube-dev1" cluster.
```

## デフォルトプロファイルの指定

デフォルトプロファイルを指定しておくと各種コマンドで `-p` でのプロファイル指定が不要となります。
特定のクラスタを定常的に利用する場合は設定しておくと便利です。

### 実行例

```console
$ minikube profile minikube-dev1
✅  minikube profile was successfully set to minikube-dev1
```

## プロファイルのリスト表示

`list` コマンドでプロファイルのリストと動作状態を確認することができます。

### 実行例

```console
$ minikube profile list
|---------------|-----------|---------|---------------|------|---------|---------|-------|
|    Profile    | VM Driver | Runtime |      IP       | Port | Version | Status  | Nodes |
|---------------|-----------|---------|---------------|------|---------|---------|-------|
| minikube      | hyperkit  | docker  | 192.168.64.2  | 8443 | v1.19.4 | Stopped |     1 |
| minikube-dev1 | hyperkit  | docker  | 192.168.64.10 | 8443 | v1.20.7 | Running |     1 |
|---------------|-----------|---------|---------------|------|---------|---------|-------|
```

## クラスタ設定の変更
### 実行例

クラスタのオプション設定は `config set` コマンドで変更することができます。
指定できるオプションは起動時に指定するものと同じです。

```console:cpuコア数の変更
$ minikube config set cpus 3
❗  These changes will take effect upon a minikube delete and then a minikube start
```

# オススメのAddons

開発用に利用する際に入れておくと良いものをリストアップしています。
以降のコマンド例はデフォルトプロファイルの指定を実施済みの想定で `-p` オプションは省略しています。

## metrics-server

Metrics(CPU/Memory使用量）を取得できるようにするための add-on です。

```console
$ minikube addons enable metrics-server
    ▪ Using image k8s.gcr.io/metrics-server/metrics-server:v0.4.2
🌟  The 'metrics-server' addon is enabled
```

これで `kubectl top` でリソース使用量が確認できるようになります。

```console
$ kubectl top pods -n kube-system --use-protocol-buffers
NAME                                    CPU(cores)   MEMORY(bytes)
coredns-74ff55c5b-kks2v                 3m           8Mi
etcd-minikube-dev1                      13m          26Mi
kube-apiserver-minikube-dev1            59m          286Mi
kube-controller-manager-minikube-dev1   16m          43Mi
kube-proxy-zjhbd                        1m           16Mi
kube-scheduler-minikube-dev1            3m           13Mi
metrics-server-7894db45f8-5nsv2         4m           13Mi
storage-provisioner                     3m           8Mi
```

## （α版） auto-pause

一定時間クラスタへの操作がないと kube-system で動いているコンテナを pause してくれる add-on です。アイドル時のCPU使用率を低下させることができます。

α版な影響か原理的な問題なのか動作が不安定になる部分がありますが、Kubernetesはアイドル時のCPU使用率が比較的高めなので、マシンに優しくする目的ではオススメです。

```console
$ minikube addons enable auto-pause
    ▪ Using image gcr.io/k8s-minikube/auto-pause-hook:v0.0.2
    ▪ auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.
    ▪ https://github.com/kubernetes/minikube/labels/co/auto-pause
🌟  The 'auto-pause' addon is enabled
```

## ingress

Ingress を利用できるようにする add-on です。

```console
$ minikube addons enable ingress
    ▪ Using image k8s.gcr.io/ingress-nginx/controller:v0.44.0
    ▪ Using image docker.io/jettech/kube-webhook-certgen:v1.5.1
    ▪ Using image docker.io/jettech/kube-webhook-certgen:v1.5.1
🔎  Verifying ingress addon...
🌟  The 'ingress' addon is enabled
```

### Ingressへのアクセス方法

minikube では `ip` コマンドでPodが動作するノードのIPアドレスが分かります。

```console
$ minikube ip
192.168.64.6
```

この値を `/etc/hosts` に設定してIngressでアクセスしたいホスト名を解決できるようにします。
例えば、Ingressのホスト名が `hello.test` であれば下記の値を設定します。

```conf:/etc/hosts
192.168.64.6    hello.test
```

これでcurlやWebブラウザで `hello.test` を指定することでIngressに対してリクエストが送れます。

# その他
## 全部消してリセット

何か困ったことが起きた時は、とりあえず全部消してリセットしてみると治る場合があります。

```console
$ minikube delete --purge --all
```