おうちKubernetesクラスタでSynology CSI Driverを使う

おうちKubernetesクラスタを運用していると、パブリッククラウドで提供されている永続ボリュームが使えないので「ストレージどうしよう問題」が発生します。

そこで、家にあるNASを使ってストレージに仕立て上げることにチャレンジしました。

Synology CSI Driverの全体像

家にはSynologyのNASがあるのですが、それに対応したCSI DriverがSynologyから提供されています。
(Synologyってその辺のハックにすごく寛容ですよね)

GitHub - SynologyOpenSource/synology-csi
Contribute to SynologyOpenSource/synology-csi development by creating an account on GitHub.

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しておきます

GitHub - SynologyOpenSource/synology-csi
Contribute to SynologyOpenSource/synology-csi development by creating an account on GitHub.

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 を指定すれば行けるよ!(意訳)」とのことだったのですが、指定しても変わらず・・・

Cannot control ownership and permissions for mounted volumes · Issue #7 · SynologyOpenSource/synology-csi
First of all, thank you so much for this driver - it's a great start! After updating images and cluster roles, I have th...

代わりに csi.storage.k8s.io/fstype を指定するようです。

所感

NASなので、所詮は1Gbps接続という、ストレージとしてはやや心許ないかもしれない状況ですが、Nodeとは切り離された大容量のストレージが使えるのはメリットに感じました。

また、1度StorageClassを作成してしまえば、さっとPVを作成できるというのも楽だなと感じています。

参考リンク

Kubernetesにまつわること調べてると必ずヒットする青山さんのブログ

タイトルとURLをコピーしました