[環境]
- Mac M1 Pro Ventura 13.0
- minikube v1.27.1
- Docker for Mac v4.13.0
- rails v5.2.4.6
[前提]
minikube start --driver=docker
でdriverにdockerを指定してminikubeを起動minikube mount マウントするローカルのディレクトリ:/マウント先のディレクトリ
でボリュームマウント- railsアプリケーションのPodを作成
[事象]
railsのサーバ起動やコマンド実行にめちゃくちゃ時間がかかる。
root@web-app:/opt/web-app# time rails version
Rails 5.2.4.6
real 1m5.563s
user 0m2.450s
sys 0m9.606s
つらすぎる…
[推定要因]
minikubeのリファレンスを見ると、
minikube mount
は9Pというファイルシェアリングプロトコルでマウントを実現している様
https://minikube.sigs.k8s.io/docs/handbook/mount/
9Pマウントは600ファイルを超えるとパフォーマンスや信頼性に問題が出てくる様です。
先に挙げた事象もこれが影響していそう。
[対処]
上に挙げたリファレンスでは代替案としてDrive Mountが提示されていますが、
M1 Macだと今のところ掲載されているdriverは使用できません。
ので、9Pマウントを使う前提で改善の余地がないか検討。
minikube mount
は内部でmountコマンドを呼んでおり、–typesオプションでファイルシステムに9Pを指定している様。
https://github.com/kubernetes/minikube/blob/master/cmd/minikube/cmd/mount.go#L88
9Pのオプションで cacheのモードが指定できそう。
https://www.kernel.org/doc/Documentation/filesystems/9p.txt
試行した末、cache=fscacheでオプション指定した場合に事象が改善される事を確認しました。
minikube mount --options cache=fscache,trans=tcp マウントするローカルのディレクトリ:/マウント先のディレクトリ
root@web-app:/opt/web-app# time rails version
Rails 5.2.4.6
real 0m5.843s
user 0m1.145s
sys 0m1.067s
変更前よりは…
ただ、fscacheを指定した場合ファイルがread onlyとして扱われるので、ホスト-クライアント間のファイル変更が自動で同期されません。
暫定運用として、kubectl cp
で反映を行っています。
https://neos21.net/blog/2019/04/15-01.html
https://devops.stackexchange.com/a/3208
より良い案があれば教えて下さいm( _ _)m