Minikube と Docker for Mac (Edge) を共存させる

# 環境

MacBook Pro Mid 2014
macOS High Sierra
Homebrew 1.6.1

# ローカルで Kubernetes 

もともと開発環境として Docker for Mac で docker-compose を利用していたが
Kubernetes 触ってみたいということで色々設定したときのメモ

## 前提

ローカルで Kubernetes といえばおそらく次の二択

1. Minikube
1. Docker for Mac (Edge)

どっちがいいのかわからんということで2つ入れてみる
後述するが Minikube を先に入れる方が良い

## Homebrew

本記事では Homebrew を使ってインストールしていく
もちろんバイナリからやってもOK
Homebrew のインストールは[公式ページ](https://brew.sh)から

## Minikube

ハイパーバイザが必要なので VirtualBox も一緒にインストールする

```bash
$ brew cask install virtualbox
$ brew cask install minikube
```

Homebrew で minikube を入れると `kubernetes-cli` という fomula も一緒に入ってくるが
こいつの中に kubectl も入っているっぽいので kubectl を別途インストールする必要はない

```bash
$ which kubectl

/usr/local/bin/kubectl
```

minikube を起動して確認

```
$ minikube start
$ minikube status
```

kubectl の接続先が minikube になっていることを確認する

```
$ kubectl config get-contexts

CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         minikube             minikube                     minikube      
```

dashboard にアクセスするために service 一覧を取得

```
$ kubectl get svc --all-namespaces

NAMESPACE     NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
default       kubernetes             ClusterIP   10.96.0.1       <none>        443/TCP         1m
kube-system   kube-dns               ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP   1m
kube-system   kubernetes-dashboard   NodePort    10.109.106.12   <none>        80:30000/TCP    1m
```

EXTERNAL-IP が設定されてないためアクセスできない…（※proxy すれば良い）
と思いきや別の方法があった

```
$ minikube service list

|-------------|----------------------|-----------------------------|
|  NAMESPACE  |         NAME         |             URL             |
|-------------|----------------------|-----------------------------|
| default     | kubernetes           | No node port                |
| kube-system | kube-dns             | No node port                |
| kube-system | kubernetes-dashboard | http://192.168.99.100:30000 |
|-------------|----------------------|-----------------------------|
```

これで dashboard が確認できる
（デフォルトで日本語になっていてびっくり）

minikube を止めるときは

```
$ minikube stop
```

## Docker for Mac (Edge)

Stable 版を入れている人は一度アンインストールすること
せっかくなので Homebrew からインストール

```
$ brew tap caskroom/versions
$ brew cask install docker-edge
```

Docker が起動したら Kubernetes を有効にする（数分かかる）
本来はここで kubectl が入ってくるのだが
先ほどの Minikube インストール時にすでに入っているので競合するかと思った
でも特にエラーは起こらなかったので kubectl を消しておく必要はなさそう

<img width="502" alt="2018-04-17 18.41.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/199914/40b65580-c78a-99f6-c7b2-fded347ecbfa.png">

context を変更して確認する
`set-context` ではないことに注意（やらかしました）

```
$ kubectl config use-context docker-for-desktop

Switched to context "docker-for-desktop".
```

```
$ kubectl config get-contexts

CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
*         docker-for-desktop   docker-for-desktop-cluster   docker-for-desktop   
          minikube             minikube                     minikube  
```

dashboard がデフォルトで入っていないのでデプロイしてみる
公式の手順に従っただけ

https://github.com/kubernetes/dashboard

```
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

secret "kubernetes-dashboard-certs" created
serviceaccount "kubernetes-dashboard" created
role "kubernetes-dashboard-minimal" created
rolebinding "kubernetes-dashboard-minimal" created
deployment "kubernetes-dashboard" created
service "kubernetes-dashboard" created
```

Kubernetes proxy を起動

```
$ kubectl proxy
```

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
にアクセス

<img width="800" alt="2018-04-17 19.31.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/199914/915eab6b-db04-c2d0-409e-21c924967622.png">

なんだこれ…さっきは出なかったぞ…
とりあえずスキップできる

proxy を使えば minikube でも同じようになるはずだけど
minikube は自動で port-forward を設定してくれていたということなんでしょうか（詳しい方教えてください）



# 注意点

## kubectl の競合

先に Docker for Mac の Kubernetes を有効にしていると
minikube のインストール時にエラーが出る（インストール自体は成功する）
また、後々 Kubernetes を無効にしたときに kubectl が迷子になってしまう

kubectl が Docker for Mac 由来のものになっているのが原因？

GKE を使う人は google cloud SDK でも kubectl を入れられるが

```
$ gcloud components install kubectl
```

今回は既に入っているので要らない

## docker ps コマンドについて

ホスト上で見える docker コンテナは全て Docker for Mac によるもの

```
$ docker ps
```

minikube のコンテナを見るときは一度接続する必要がある

```
$ minikube ssh
                         _             _            
            _         _ ( )           ( )           
  ___ ___  (_)  ___  (_)| |/')  _   _ | |_      __  
/' _ ` _ `\| |/' _ `\| || , <  ( ) ( )| '_`\  /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )(  ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)

$ docker ps
```

こんな感じで環境は作れたので
helm とか使って色々やってみたい