おうちKubernetesクラスタを運用していると、パブリッククラウドで提供されている永続ボリュームが使えないので「ストレージどうしよう問題」が発生します。
そこで、家にあるNASを使ってストレージに仕立て上げることにチャレンジしました。
Synology CSI Driverの全体像
家にはSynologyのNASがあるのですが、それに対応したCSI DriverがSynologyから提供されています。
(Synologyってその辺のハックにすごく寛容ですよね)

NASのVolumeに対応したStorageClassを作成し、それを使ってPersistentVolumeを作成すると、NAS側でVolumeからLUNを切り出してAttachできるようにします。
(NAS側の)Volumeは物理的なストレージプールの上に論理的に作成するものなので、SSD/HDDやRAIDの構成の差異によって、Volumeを複数作成→ユースケースに合ったStorageClassを使用することができるようです。
利用可能にしてみる
Volumeの作成
まずは、「ストレージ マネージャ」でVolumeを作成します。

ストレージプールと、Volumeに割り当てる容量を設定します。
この後、Persistent Volumeに切り分けることもあるので、大きめにしておくと良いかもしれません。

検証用に2つ目のVolumeを作成しています。
(「ボリューム2」の方)
Kubernetes用のユーザーを作成
KubernetesからSynology NASのAPIを叩くため、ユーザーを作成しておきます。
CSI Driverのclone
↓のリポジトリをCloneしておきます
NASの設定情報を用意しておく
NASのログイン情報やIPアドレスなどを設定するためのConfigファイルを作成します。
cloneしたフォルダの config/client-info-template.yml
をコピーし、 config/client-info.yml
を作成します。
clients:
- host: 192.168.1.1 # NASのIPアドレス
port: 5000 # NASのポート番号(多分5000)
https: false # httpsを有効化するか
username: username # ログインするユーザー名
password: password # パスワード
CSI Driverのインストール
./scripts/deploy.sh run
でインストールできるのですが、これだと余計なimage buildまで走ってしまうため、READMEにも記載がありますが以下のコマンドを使うと、単にmanifestのapplyのみをしてくれるようです。
./scripts/deploy.sh install --all
ここで、先ほど用意した client-info
もSecretになって作成されます。
StorageClassの作成
いよいよ、Volumeに対応するStorageClassを作成します。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "false" # これtrueにすると、何もしなくてもこのStorageClass使うことができる?
name: synology-iscsi-storage
provisioner: csi.san.synology.com
parameters:
csi.storage.k8s.io/fstype: ext4
dsm: '10.0.0.3' # client-config.ymlに存在している必要がある
location: '/volume2' # Volumeのパス(今回だと /volume2 )
type: thin
protocol: iscsi
reclaimPolicy: Delete
allowVolumeExpansion: true
applyすることで、StorageClassを作成できます。
PersistentVolumeClaimを作成する
早速、PVCを作成します。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
resources:
requests:
storage: 10Gi
accessModes:
- ReadWriteOnce
storageClassName: synology-iscsi-storage # ここでStorageClassの名前を設定する
これでapplyすると、PVC/PVが作成されます。
「SAN Manager」から、切り出したLUNなどの情報を閲覧することができます。

ハマったところ
読み書き権限
作成したPVをpodにmountしたところ、所有者がrootになってしまい、rootで動いていないコンテナからは書き込みができない状態になってしまいました。
似たような事象でissueが立っており、「StorageClassで fsType
を指定すれば行けるよ!(意訳)」とのことだったのですが、指定しても変わらず・・・
代わりに csi.storage.k8s.io/fstype
を指定するようです。
所感
NASなので、所詮は1Gbps接続という、ストレージとしてはやや心許ないかもしれない状況ですが、Nodeとは切り離された大容量のストレージが使えるのはメリットに感じました。
また、1度StorageClassを作成してしまえば、さっとPVを作成できるというのも楽だなと感じています。