24
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事は 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 でデプロイはできましたが、実はこれだけでは動きません。
ストレージクラスを作成しましょう。

values.yaml
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 を作ってみましょう。

pvc.yaml
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 の設定をいじりましょう。

values.yaml
  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 サーバー ↓

参考文献

24
0
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
24
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?