この記事は kubernetes Advent Calendar 2025 および デジタル創作サークル UniProject Advent Calendar 2025 5 日目の記事です。
こんにちは!
デジタル創作サークル UniProjectを運営している あかつきゆいと です。
当サークルでは K8s を運用していますが、メンバーにも貸し出すにあたって、マルチテナント運用を目指して現在構築中です。
結論
NFS CSI はいいぞ!
経緯
今までは NFS サーバーにみんなでアクセスして自分のディレクトリ立ててそこに対して PV/PVC をつけるという運用でした。
ですがこの方法は、全員に等しく NFS サーバーの権限がついてしまうという大きな問題を抱えていました。
netbox などの関係で、nfs-subdir-external-provisioner などはしようしていたものの、全てをそれにするという運用はできていませんでした。
そこで今回、PVC を作ったら PV が生える環境をしっかりと構築しました。
なぜ既存の nfs-subdir-external-provisioner を使わなかったのか
おそらくここは機になる方もいるのではないでしょうか。
すでに使っているのであれば、これをグローバルに展開すれば良いのでは?と思ったのですが、 nfs-subdir-external-provisioner は数年前にプロジェクト自体が停止しておりメンテナンスがあまり行われていないという状態で、これを本番環境で使い続けるにはとても無理があると判断しました。
海外のサイトを見ても、別のプロビジョナーに移行すべきと書かれているものが散見されたので NFS CSI Driver に移行しました。
CSI とは?
CSI とは、Container Storage Interface の略で Kubernetes v1.9 よりサポートされています。
従来のストレージシステムでは、Kubernetes のソースに直に組み込まれる実装(in-tree)でした。そのため、ストレージを提供する 3rd パーティベンダーは K8s のソースコードの変化を伺いながら開発する必要がありました。
それを解決したのが、この Interface で、CSI 自体は K8s と分離して、Docker などのその他のプロジェクトでも利用できるように、CSI コミュニティで仕様が定義されています。
導入
下記リポジトリに nfs-csi-driver のソースがあります。
README を見て構築していきましょう。
helm を使う
何もカスタマイズしなければ、これで導入可能です。
helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system --version 4.12.0
これで何のカスタマイズもなくひとまず構築できました。
ストレージクラスを作成する
helm でデプロイはできましたが、実はこれだけでは動きません。
ストレージクラスを作成しましょう。
storageClasses:
- name: nfs-retain
parameters:
server: nfs-server.default.svc.cluster.local
share: /data
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1
parametersには NFS サーバーの情報を入力しましょう。
また、reclaimPolicyは PVC が消えた時にデータをどうするか決めることができます。
削除する場合はDelete、残す場合はRetainです。
もう一度デプロイし直してみましょう。
helm upgrade --install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system -f values.yaml
これで完了です。
使ってみる
いつも通り PVC を作ってみましょう。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: foo-pvc
spec:
storageClassName: "nfs-retain"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 3Gi
kubectl apply -f pvc.yaml
これで確認してみると、PV が自動的に割りあたっているはずです。
yuito-it@node11:~$ microk8s kubectl get pvc -A
NAMESPACE NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
foo-pvc foo-pvc Bound pvc-d84895f2-c2a8-4c54-ba1e-bf8c4589b114 3Gi RWX nfs-csi <unset> 22d
fsGroupPolicy を有効にする
つまりポイントなのですが、このままでは fsGroupPolicy が適用できません...
ということで、helm の設定をいじりましょう。
storageClasses:
- name: nfs-retain
parameters:
server: nfs-server.default.svc.cluster.local
share: /data
reclaimPolicy: Retain
volumeBindingMode: Immediate
mountOptions:
- nfsvers=4.1
+ feature:
+ enableFSGroupPolicy: true
これで完璧ですね。
最後に
先にもあるように、当サークルでは、積極的にコンテナ技術を採用しています。
これを読んで「さらに学んでみたい」、「K8s も気になる!」という方、当サークルに参加してみませんか?
当サークルは初心者から上級者まで老若男女誰でも参加できるサークルです。
まずは Discord サーバーへ参加してみてください!
みなさんの参加をお待ちしております!
⭐︎ 公式サイト ↓
⭐︎ Discord サーバー ↓
参考文献