3
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?

NASをKubernetesの仲間にした話 〜iSCSIでつなぐ永続ボリューム〜

Posted at

初めに

初めまして.最近Kubernetes上にPodを立てる時にiSCSI経由でNAS上のボリュームを利用してPVを立てる機会がありました.今まではLocalPathストレージや,NFSを使っていたんですけど,新しくやり方覚えたので残しておきます.

iSCSIとは

iSCSIとは, TCP/IP ネットワーク経由で転送する方法を提供するストレージデバイスを接続するためのプロトコルです.

環境

  • Synology NAS(DiskStation Manager バージョン 7.1.1-42962)

  • 物理サーバ(ESXi バージョン8.0)

  • Kubernetesクラスタ用のNode(1台[CPU:4core,RAM:8GB,SSD:40GB])

    • Ubuntu 24.04.2 LTS

ソフトウェア

  • K3s
  • synology-csi
  • Nginx

Kubernetesクラスタ上にsynology-csiを配置

以下のリポジトリを使います.
https://github.com/SynologyOpenSource/synology-csi

なお今後の説明はK3sのクラスタがあることを前提にします.
まだ入れていない人は以下のURLの通りにK3sを入れてみてください.

Step1: 最初にGitHubからコピーしてきましょう.

hirao@automanager:~$ git clone https://github.com/SynologyOpenSource/synology-csi.git
Cloning into 'synology-csi'...
remote: Enumerating objects: 571, done.
remote: Counting objects: 100% (332/332), done.
remote: Compressing objects: 100% (172/172), done.
Receiving objects: 100% (571/571), 169.23 KiB | 8.06 MiB/s, done.
remote: Total 571 (delta 257), reused 160 (delta 160), pack-reused 239 (from 2)
Resolving deltas: 100% (311/311), done.
hirao@automanager:~$ 

中身の確認をしましょう.kubernetes上に立てるので今回は/home/hirao/synology-csi/deploy/kubernetes/v1.20の中を使用します.

hirao@automanager:~$ ls
synology-csi
hirao@automanager:~/synology-csi$ cd deploy/kubernetes/v1.20/
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ ls
controller.yml  csi-driver.yml  namespace.yml  node.yml  pvc-test.yaml  snapshotter  storage-class.yml
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

Step2: Namespaceの作成
synology-csiというNamespaceが作成されればOKです.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl apply -f namespace.yml
namespace/synology-csi created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl get ns
NAME              STATUS   AGE
default           Active   7m29s
kube-node-lease   Active   7m29s
kube-public       Active   7m29s
kube-system       Active   7m29s
synology-csi      Active   6s
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

Step3: CSIDriverの登録

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl apply -f csi-driver.yml
csidriver.storage.k8s.io/csi.san.synology.com created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

Step4: client-info-secretの作成
ここでは,client-info-secretを作成します.NASに接続する際にユーザ名やパスワード,Portを設定します.

apiVersion: v1
kind: Secret
metadata:
  name: client-info-secret
  namespace: synology-csi
type: Opaque
stringData:
  client-info.yml: |
    clients:
      - host: 192.168.100.*
        port: 5001
        https: false
        username: ****
        password: ****

それぞれの箇所にNASにログインする際のホスト名やポート番号,ユーザ名,パスワードを入れます.

確認してみましょう.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl apply -f client-info-secret.yaml 
secret/client-info-secret created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl get secret -n synology-csi
NAME                 TYPE     DATA   AGE
client-info-secret   Opaque   1      4m42s
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

Step5: Controllerの作成
CSIControllerは,PersistentVolumeの作成や削除の制御を行うコンポーネントになります.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl apply -f controller.yml
serviceaccount/csi-controller-sa created
clusterrole.rbac.authorization.k8s.io/synology-csi-controller-role created
clusterrolebinding.rbac.authorization.k8s.io/synology-csi-controller-role created
statefulset.apps/synology-csi-controller created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

Step5: NodeDaemonSetの作成
NodeDaemonSetは,各ノード上でボリュームをマウントする役割があります.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl apply -f node.yml
serviceaccount/csi-node-sa created
clusterrole.rbac.authorization.k8s.io/synology-csi-node-role created
clusterrolebinding.rbac.authorization.k8s.io/synology-csi-node-role created
daemonset.apps/synology-csi-node created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

それぞれのPodがちゃんと出来上がっているのかを確認しましょう!以下のようになっていればOKです.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl get pods -n synology-csi
NAME                        READY   STATUS    RESTARTS   AGE
synology-csi-controller-0   4/4     Running   0          8s
synology-csi-node-fl6z8     2/2     Running   0          14s
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$

Step6: Storageclassの作成

Storageclassの作成の際にはstorage-class.ymlを編集してから作成します.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: synology-iscsi-storage
provisioner: csi.san.synology.com # Synology CSI driver の場合
parameters:
  # Synology DSM の情報
  dsm: 192.168.100.***
  port: "5000"
  protocol: iscsi

  # 認証情報
  username: ****
  password: ****

  # ターゲットの IQN
  targetIQN: ****
  # LUN 名(ボリューム識別子)
  lunName: ****

  # 認証方式
  authType: CHAP

reclaimPolicy: Delete
volumeBindingMode: Immediate                            

設定する箇所はdsm,port,username,password,targetIQN,lunNameになります.それぞれNAS上の設定に合わせておきましょう.

Storageclassを作る際には以下のコマンドをうちましょう.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl apply -f storage-class.yml 
storageclass.storage.k8s.io/synology-iscsi-storage created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl get sc
NAME                     PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)     rancher.io/local-path   Delete          WaitForFirstConsumer   false                  47m
synology-iscsi-storage   csi.san.synology.com    Delete          Immediate              false                  4s
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ 

こんな感じでsynology-iscsi-storageがあればOKです.

StorageclassからPVCとPVが作成されDeploymentを使えるようにできるかの確認

ここまで来ればあとはPVCとPVが作成されるかどうか確認するだけですね.
今回は簡単にNginxで試してみます.

Step1: Namespaceの作成
以下のコマンドをうちます.

hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$ kubectl create namespace nginx
namespace/nginx created
hirao@automanager:~/synology-csi/deploy/kubernetes/v1.20$

Step2: PVCの作成
先にディレクトリを作成しちゃいましょう.

hirao@automanager:~$ mkdir nginx
hirao@automanager:~$ cd nginx/
hirao@automanager:~/nginx$ 

PVC用のYAMLファイルの作成をしましょう.

hirao@automanager:~/nginx$ touch pvc.yaml
hirao@automanager:~/nginx$ ls
pvc.yaml
hirao@automanager:~/nginx$

以下のように簡単なYAMLファイルを作成しました.(viコマンドで)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
  namespace: nginx
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: synology-iscsi-storage   # Synology用 StorageClass 名(kubectl get storageclass で確認)

applyをしましょう!以下のようになればOKです.

hirao@automanager:~/nginx$ kubectl apply -f pvc.yaml 
persistentvolumeclaim/nginx-pvc created
hirao@automanager:~/nginx$ kubectl get pvc -n nginx
NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS             VOLUMEATTRIBUTESCLASS   AGE
nginx-pvc   Bound    pvc-2e292144-a851-440f-98c9-649444647088   1Gi        RWO            synology-iscsi-storage   <unset>                 7s
hirao@automanager:~/nginx$ 

Step3: Deploymentの作成
以下のファイルを作成しましょう.

hirao@automanager:~/nginx$ touch deployment.yaml
hirao@automanager:~/nginx$ ls
deployment.yaml  pvc.yaml
hirao@automanager:~/nginx$ 

以下のように簡単なYAMLファイルを作成しました.(viコマンドで)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-storage
          mountPath: /usr/share/nginx/html  # nginx のドキュメントルートにマウント
      volumes:
      - name: nginx-storage
        persistentVolumeClaim:
          claimName: nginx-pvc

applyをしましょう!以下のようになればOKです.

hirao@automanager:~/nginx$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS             VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-fa37f475-33c6-497a-84d7-f29f460d2ef8   1Gi        RWO            Delete           Bound    nginx/nginx-pvc   synology-iscsi-storage   <unset>                          88s
hirao@automanager:~/nginx$ kubectl get pods -n nginx -w
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5c794987d4-b6m4h   1/1     Running   0          17s
^Chirao@automanager:~/nginx$

ちゃんと立ちましたね!PVもちゃんと作られているのでOKです.

Step4: Serviceの作成

最後にNginxの画面を確認したいのでServiceを作成しましょう.

hirao@automanager:~/nginx$ touch service.yaml
hirao@automanager:~/nginx$ ls
deployment.yaml  pvc.yaml  service.yaml
hirao@automanager:~/nginx$

以下のように簡単なYAMLファイルを作成しました.(viコマンドで)

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30080  

以下のような感じになればOKです!

hirao@automanager:~/nginx$ kubectl get svc -n nginx
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.43.128.142   <none>        80:30080/TCP   6s
hirao@automanager:~/nginx$ 

最後にブラウザで起動確認をしてみましょう.

以下のようにNginxの画面が出ればOKです!
スクリーンショット 2025-10-30 17.53.19.png

最後に

Kubernetesで使用できるストレージの種類はまだまだたくさんあるので今後も色々使ってみたいものですね!

3
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
3
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?