NFS(1) Rookで環境を構築してみる

この記事は「[RookだらけのAdvent Calender](https://qiita.com/advent-calendar/2019/rook)」20日目の記事です。

昨日までの4日間、makotowさんによるEdgeFSの解説をお楽しみ頂きました。Cephと並んでRook内でStableであるEdgeFSは国内での情報が非常に少なく、概要レベルの解説や「試してみた」という記事も殆ど見た覚えがありません。
Cephとは異なるCloud NativeなSDSとして期待している人も多いと思いますので、ぜひこうした情報が拡がっていくことを期待しています。

さて、今日からはRookからNFSを利用する手順を解説していきたいと思います。

が、その前に！

# Rook v1.2がリリースされました

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Rook 1.2 is now available! Thank you to everyone in the <a href="https://twitter.com/rook_io?ref_src=twsrc%5Etfw">@rook_io</a> community for getting another great release out. You can read more details in the latest <a href="https://t.co/8ctu2a0Mdr">https://t.co/8ctu2a0Mdr</a> blog post 🤓🎉<a href="https://t.co/YTNQHHK46Z">https://t.co/YTNQHHK46Z</a></p>&mdash; rook (@rook_io) <a href="https://twitter.com/rook_io/status/1207823598603268096?ref_src=twsrc%5Etfw">December 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらの解説もしたいと思っていたのですが、Advent Calenderには間に合わない！
なので、次回のJapan Rook Meetup#2でお話したいと思っています。

# NFSとは
これは改めて説明することでもないですね。
[NetWork File System](https://ja.wikipedia.org/wiki/Network_File_System)の略で、古くから使われている分散ファイルシステムとそのプロトコルです。

コンテナやKubernetesの時代にあってもファイル格納や共有に利用されており、その存在が忘れられることはありません。しかし、一方でNFSが便利すぎる余り、「全部NFSで良いんじゃないの？」という議論も良く聞かれます（稀ではないのです）。

NFS（ファイルストレージ）と他のIFの差異については、ysakashitaさんの[こちらの資料](https://speakerdeck.com/ysakashita/ru-men-kubernetes-persistent-volume?slide=6)や先日Openshift.runでRed Hat宇都宮さんのセッションが参考になります。

また、宇都宮さんの資料はまだ公開されていないため、NFSの問題点として指摘されていたこちらのツイートを共有しておきます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">スタティックプロビジョニングを倒してから行け！ <a href="https://twitter.com/hashtag/openshiftjp?src=hash&amp;ref_src=twsrc%5Etfw">#openshiftjp</a> <a href="https://t.co/rCD5emk3KJ">pic.twitter.com/rCD5emk3KJ</a></p>&mdash; SAKON (@sakon310) <a href="https://twitter.com/sakon310/status/1207942004321083392?ref_src=twsrc%5Etfw">December 20, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# RookでのNFS環境構築
話が逸れました。ここからはRookを使ったNFSの環境構築の解説をしていきます。
例によって、ドキュメントの[QuickstartのNFSのページ](https://rook.io/docs/rook/v1.2/nfs.html)に沿ってインストールをしていきます。

## nfs-operatorのインストール
まずはRookのnfs-operatorをインストールします。これにより、nfs-operatorとnfs-provisionerが立ち上がってきます。

```shell
$ kubectl apply -f cluster/examples/kubernetes/nfs/operator.yaml
（略）

# 起動されたPodを確認
$ kubectl get pod -n rook-nfs-system
NAME                                    READY   STATUS    RESTARTS   AGE
rook-nfs-operator-65548dcccf-8td6v      1/1     Running   0          2h
rook-nfs-provisioner-6b97f4d658-5zfbr   1/1     Running   0          2h
```

## nfs-serverの構築
次に先ほどのnfs-operatorを使って、NFSサーバをPodとして起動します。Quickstartのnfs.yamlでStorageClass周りの設定を少々修正して、applyしていきます。

修正後のyamlは以下になります。

```yaml:nfs-standard.yaml
apiVersion: v1
kind: Namespace
metadata:
  name:  rook-nfs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-default-claim
  namespace: rook-nfs
spec:
  storageClassName: standard
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: nfs.rook.io/v1alpha1
kind: NFSServer
metadata:
  name: rook-nfs
  namespace: rook-nfs
spec:
  serviceAccountName: rook-nfs
  replicas: 1
  exports:
  - name: share1
    server:
      accessMode: ReadWrite
      squash: "none"
    # A Persistent Volume Claim must be created before creating NFS CRD instance.
    persistentVolumeClaim:
      claimName: nfs-default-claim
```

こちらをapplyしていきます。

```shell
$ kubectl apply -f nfs-standard.yaml

# Podの起動状況とそこで利用しているPVCを確認
$ kubectl get pod,pvc -n rook-nfs
NAME             READY   STATUS    RESTARTS   AGE
pod/rook-nfs-0   1/1     Running   0          5m22s

NAME                                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/nfs-default-claim   Bound    pvc-b8cea7eb-bd59-4815-82ea-e1a69cf90911   1Gi        RWO            standard       5m22s
```

上記から分かるようにrook-nfsでは1GBのボリューム（EBS）をアタッチし、それをExportする設定となっています。

今日は構築ということでここまでにしたいと思います。

# まとめ
さて、どうだったでしょうか。

ここからNFSサーバ側の確認をしようと思ったのですが、そもそもNFSのオペレーションを結構忘れていました。明日、クライアント側から利用する際にその辺りも見ていきたいと思います。

よろしくお願いします。