Minikubeであれやりたいときのtips

# はじめに
「Minikubeで〇〇したい」を集めたTipsです。
minikube v1.17.1で確認しました。

# Minikubeで〇〇やりたい

## NodeのCPU/Memoryを設定したい

```bash
minikube start --cpus 2 --memory 2G
```

## VMじゃなくてdockerでNodeを起動したい

```bash
minikube start --driver docker
```

実はdriverはいろいろ選ぶことができます。
`virtualbox`, `vmwarefusion`, `kvm2`, `vmware`, `none`, `docker`, `podman` (experimental), `ssh`

## ローカルのコンテナイメージを使いたい

「いちいちContainer Registryにpushして疎通するの面倒くさい！」という時にお勧めです。

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

上記コマンド実行後に`docker build`すると、minikubeのNode上にイメージがよしなにされます。
ただし`latest`以外のタグを利用してください。`latest`を指定すると外部を参照しに行ってErrImagePullになります。

## 複数Nodeのクラスタを作りたい

実はMulti-Nodeクラスタも作れます。
これでTaintやNodeSelector、Pod (Anti) Affinityの確認もできます。

```bash
minikube start --nodes 3
```

構築結果

```bash
$ kubectl get nodes
NAME           STATUS   ROLES                  AGE   VERSION
minikube       Ready    control-plane,master   76s   v1.20.2
minikube-m02   Ready    <none>                 42s   v1.20.2
minikube-m03   Ready    <none>                 19s   v1.20.2
```

## Kubernetesのバージョンを指定したい

```bash
minikube start --kubernetes-version v1.20.2
```

## type: LoadbalancerなServiceを使いたい

Minikubeのクラスタで`type: LoadBalancer`なService Resourceを作成しても、通常はEXTERNAL-IPは`Pending`になってしまいますが、サブコマンドの`tunnel`で解決できます。

### `type: LoadBalancer`なServiceとそれに紐づくDeploymentの作成

```bash
$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created

$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed

$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.105.111.30   <pending>     8080:30427/TCP   5s
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          5m20s
```

### 別ターミナルで`minikube tunnelを実行

```bash
$ minikube tunnel
Status:	
	machine: minikube
	pid: 23411
	route: 10.96.0.0/12 -> 192.168.49.2
	minikube: Running
	services: [hello-node]
    errors: 
		minikube: no errors
		router: no errors
		loadbalancer emulator: no errors

```

### ServiceのEXTERNAL-IPを確認

```bash
gashirar:~$ kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
hello-node   LoadBalancer   10.105.111.30   10.105.111.30   8080:30427/TCP   3m31s
kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP          8m46s
```

### 疎通

```bash
$ curl 10.105.111.30:8080
CLIENT VALUES:
client_address=192.168.49.2
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://10.105.111.30:8080/

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

HEADERS RECEIVED:
accept=*/*
host=10.105.111.30:8080
user-agent=curl/7.68.0
BODY:
-no body in request-
```

## Nodeの中に入りたい

```bash
minikube ssh
```

kubeletプロセスの確認もできます。

```bash
$ minikube ssh
docker@minikube:~$ sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
     Loaded: loaded (/lib/systemd/system/kubelet.service; disabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/kubelet.service.d
             └─10-kubeadm.conf
     Active: active (running) since Tue 2021-02-09 12:02:22 UTC; 20min ago
       Docs: http://kubernetes.io/docs/
   Main PID: 2395 (kubelet)
      Tasks: 21 (limit: 23919)
     Memory: 51.6M
     CGroup: /docker/3914f62704ff9cbd7ea263df7287ac734d30983a5bcf9f1b5127825434093f64/system.slice/kubelet.service
             └─2395 /var/lib/minikube/binaries/v1.20.2/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --config=/var/lib/kubelet/config.yaml --container-runtime=docker --hostna
me-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --network-plugin=cni --node-ip=192.168.49.2
```


## Proxy環境下で実行したい

TBD（構築はできたので後で手順をまとめます）

## metrics-serverを導入したい

```bash
minikube addons enable metrics-server
```

## Istioを導入したい

```bash
minikube addons enable istio-provisioner
minikube addons enable istio
```

## EFK Stackを導入したい

```bash
minikube addons enable efk
```

KibanaのDashboardが見たいときは`minikube service`コマンドを実行すると良いです。

```
$ minikube service -n kube-system kibana-logging
|-------------|----------------|-------------|---------------------------|
|  NAMESPACE  |      NAME      | TARGET PORT |            URL            |
|-------------|----------------|-------------|---------------------------|
| kube-system | kibana-logging |        5601 | http://192.168.49.2:30003 |
|-------------|----------------|-------------|---------------------------|
🎉  Opening service kube-system/kibana-logging in default browser...
```

kibanaもバッチリみられます。
![スクリーンショット 2021-02-09 211603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116002/74724696-a98e-d2e2-f33f-e69ec09af1dc.png)


## (補足) minikube addons list

metrics-serverやefk、istio以外にもいろいろなaddonが提供されています。


```bash
$ minikube addons list
|-----------------------------|----------|--------------|
|         ADDON NAME          | PROFILE  |    STATUS    |
|-----------------------------|----------|--------------|
| ambassador                  | minikube | disabled     |
| csi-hostpath-driver         | minikube | disabled     |
| dashboard                   | minikube | disabled     |
| default-storageclass        | minikube | enabled ✅   |
| efk                         | minikube | disabled     |
| freshpod                    | minikube | disabled     |
| gcp-auth                    | minikube | disabled     |
| gvisor                      | minikube | disabled     |
| helm-tiller                 | minikube | disabled     |
| ingress                     | minikube | disabled     |
| ingress-dns                 | minikube | disabled     |
| istio                       | minikube | disabled     |
| istio-provisioner           | minikube | disabled     |
| kubevirt                    | minikube | disabled     |
| logviewer                   | minikube | disabled     |
| metallb                     | minikube | disabled     |
| metrics-server              | minikube | disabled     |
| nvidia-driver-installer     | minikube | disabled     |
| nvidia-gpu-device-plugin    | minikube | disabled     |
| olm                         | minikube | disabled     |
| pod-security-policy         | minikube | disabled     |
| registry                    | minikube | disabled     |
| registry-aliases            | minikube | disabled     |
| registry-creds              | minikube | disabled     |
| storage-provisioner         | minikube | enabled ✅   |
| storage-provisioner-gluster | minikube | disabled     |
| volumesnapshots             | minikube | disabled     |
|-----------------------------|----------|--------------|
```

# おわりに

Docker Driverの対応に加えてMulti-Node Clusterも可能になったMinikube。
ぜひいろいろ遊んでみてください。