概要
ローカル開発環境を完全にkubernetesへ行こうしようとしていたのですが、
ローカルでの開発なのでローカルにあるアプリケーションをそのままマウントして使おうとしたのですが、
なかなか開発できる状態に到達するまで骨が折れたので、その過程を共有しようと思います。
開発環境
- macOS Mojave 10.14.4
- minikube v1.0.0
- kubernetes v1.14.1
- kubectl v1.14.1
1. --vm-driver=virtualboxの場合
VMドライバにVirtualBoxをしようしている場合は、下記の表のように/Users
がminikubeのノード上の/Users
にマウントされるため、以下のようにローカルと同じ絶対パスをボリュームとして割り当てれば良い。
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
labels:
app: sample
spec:
containers:
- name: sample
image: sample
command:
- tail
- -f
- /dev/null
volumeMounts:
- name: app
mountPath: /app
volumes:
- name: app
hostPath:
# ここは現在のディレクトリに変える
path: /Users/user/path/to/app
type: Directory
Driver | OS | HostFolder | VM |
---|---|---|---|
VirtualBox | Linux | /home | /hosthome |
VirtualBox | macOS | /Users | /Users |
VirtualBox | Windows | C://Users | /c/Users |
VMware Fusion | macOS | /Users | /Users |
Xhyve | macOS | /Users | /Users |
2. --vm-driver=hyperkitの場合
Docker Desktop for Macを入れた時に、VirtualBoxよりHyperKitの方が軽いと聞いたので、
せっかくHyperKitが使えるのであれば、HyperKitを使った方がいいんじゃないかと思い、
VirtualBoxからHyperKitにVMドライバを変更しました。
minikube mount
を使ったりminikube start --mount-string <source>:<dist>
を使ったりしたのですがうまくいかず、
結局下記の方法で解決しました。
minikube start --vm-driver hyperkit --nfs-share /Users
--nfs-share <directory>
オプションをつけることでminikubeのノードの/nfsshares
にディレクトリをマウントすることができます。
したがって、下記のようにボリュームとして参照することができます。
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
labels:
app: sample
spec:
containers:
- name: sample
image: sample
command:
- tail
- -f
- /dev/null
volumeMounts:
- name: app
mountPath: /app
volumes:
- name: app
hostPath:
# ここは現在のディレクトリに変える
path: /nfsshares/Users/user/path/to/app
type: Directory
補足
なぜかわからないのですが、--nfs-share <directory>
で/Users/home/dir
のようにUsers
以下のディレクトリを指定したらうまくいきませんでした。
また、/etc/exports
は下記のようにminikube側で書き換えてくれるので、大丈夫だとは思うのですが、
もしダメだった場合は、下記コマンドを実行して設定を追記してください。
# BEGIN: minikube-hyperkit minikube-/Users
/Users 192.168.64.10 -alldirs -mapall=_katomasa
# END: minikube-hyperkit minikube-/Users
"/Users -network 192.168.99.0 -mask 255.255.255.0 -alldirs -maproot="$(id -u)":"$(id -g)" | sudo tee -a /etc/exports && sudo nfsd restart
あとがき
眠いのに目が冴えてる状態でやっていたため、かなり試行錯誤しており、何が正しかったのかダメだったのか把握できてません。
もし、おかしい点がありましたらご指摘よろしくお願いいたします。
あと、ローカルファイルの変更を検知して、ビルドし直してくれたりとかしないため、
ReplicaSet作ってPod消すことでPodを再生成して変更を反映している現状です。
kubernetesの思想とは違うとはわかっているのですが、変更検知してビルドし直してくれる方法を知っている方は教えてください......
自分で検知するシステム作るしかないのかなあ......
追記(2019.04.14)
nfsのPersistentVolumeを作成してマウントして、webpack-dev-serverのwatchOptionをpoll: true
にしたらできました。
ただNFSを使うとwebpack-dev-serverが変更を検知してくれない場合があるようです。
もしかしたら上記も同じ原因なのかもしれないです。
追記(2019.04.18)
やはり、NFSを使うとwebpack-dev-serverが同期が遅いためか変更を検知してくれないことが問題のようです。
PersistentVolumeかminikubeのNFS共有フォルダをhostPathでマウントするかによらず、
watchOptionのpollを設定したらファイル変更を監視してくれました。