初めに
初めまして.最近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$
最後にブラウザで起動確認をしてみましょう.
最後に
Kubernetesで使用できるストレージの種類はまだまだたくさんあるので今後も色々使ってみたいものですね!
