Edited at

kubernetesにローカルフォルダをマウントする


概要

ローカル開発環境を完全に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にマウントされるため、以下のようにローカルと同じ絶対パスをボリュームとして割り当てれば良い。


sample-pod.yaml

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にディレクトリをマウントすることができます。

したがって、下記のようにボリュームとして参照することができます。


sample-pod.yaml

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側で書き換えてくれるので、大丈夫だとは思うのですが、

もしダメだった場合は、下記コマンドを実行して設定を追記してください。


/etc/exports

# 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を設定したらファイル変更を監視してくれました。