Edited at

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

More than 1 year has passed since last update.


環境

MacBook Pro Mid 2014

macOS High Sierra

Homebrew 1.6.1


ローカルで Kubernetes

もともと開発環境として Docker for Mac で docker-compose を利用していたが

Kubernetes 触ってみたいということで色々設定したときのメモ


前提

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


  1. Minikube

  2. Docker for Mac (Edge)

どっちがいいのかわからんということで2つ入れてみる

後述するが Minikube を先に入れる方が良い


Homebrew

本記事では Homebrew を使ってインストールしていく

もちろんバイナリからやってもOK

Homebrew のインストールは公式ページから


Minikube

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

$ brew cask install virtualbox

$ brew cask install minikube

Homebrew で minikube を入れると kubernetes-cli という fomula も一緒に入ってくるが

こいつの中に kubectl も入っているっぽいので kubectl を別途インストールする必要はない

$ 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 を消しておく必要はなさそう

2018-04-17 18.41.30.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/

にアクセス

2018-04-17 19.31.46.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 とか使って色々やってみたい