LoginSignup
7
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-13

概要

ローカル開発環境を完全に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を設定したらファイル変更を監視してくれました。

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4