Synology CSI Driver for Kubernetes The official Container Storage Interface driver for Synology NAS. Container Images & Kubernetes Compatib…
Synology CSI Driver for Kubernetes The official Container Storage Interface driver for Synology NAS. Container Images & Kubernetes Compatib…
The official Container Storage Interface driver for Synology NAS.
Driver Name: csi.san.synology.com
| Driver Version | Image | Supported K8s Version |
|---|---|---|
| v1.4.0 | synology-csi:v1.4.0 | 1.20+ |
The Synology CSI driver supports:
USER 1000) to satisfy the Red Hat container certification's RunAsNonRoot requirement. The node component still needs root for mounting, iscsiadm, and the host chroot, so the node DaemonSet in the provided manifests overrides this with securityContext.runAsUser: 0 alongside privileged: true. If you write your own node manifest, keep runAsUser: 0, because privileged: true alone does not change the container's runtime user.Clone the git repository. git clone https://github.com/SynologyOpenSource/synology-csi.git
Enter the directory. cd synology-csi
Copy the client-info-template.yml file. cp config/client-info-template.yml config/client-info.yml
Edit config/client-info.yml to configure the connection information for DSM. You can specify one or more storage systems on which the CSI volumes will be created. Change the following parameters as needed:
host is an IP address and the DSM certificate only has DNS SANs (the default for DSM self-signed certificates). Set this to the hostname in the certificate's CN or SAN field (e.g. synology).tlsCACert instead. A warning will be logged on every connection when this is enabled.Install
YAML
Run ./scripts/deploy.sh run to install the driver. This will be a full deployment, which means you'll be building and running all CSI services as well as the snapshotter. If you want a basic deployment, which doesn't include installing a snapshotter, change the command as instructed below.
./scripts/deploy.sh run./scripts/deploy.sh build && ./scripts/deploy.sh install --basicIf you don’t need to build the driver locally and want to pull the image from Docker instead, run the command as instructed below.
./scripts/deploy.sh install --all./scripts/deploy.sh install --basicRunning the bash script will:
synology-csi". This is where the driver will be installed.client-info-secret" using the credentials from the client-info.yml you configured in the previous step.synology-iscsi-storage" that uses the "Retain" policy.synology-snapshotclass" that uses the "Delete" policy. (Full deployment only)HELM (Local Development)
kubectl create ns synology-csi; kubectl label ns synology-csi pod-security.kubernetes.io/enforce=privileged --overwritekubectl create secret -n synology-csi generic client-info-secret --from-file=./config/client-info.ymlcd deploy/helm; make upCheck if the status of all pods of the CSI driver is Running. kubectl get pods -n synology-csi
Storage classes and the secret are required for the CSI driver to function properly. This section explains how to do the following things:
Create a secret to specify the storage system address and credentials (username and password). Usually the config file sets up the secret as well, but if you still want to create the secret or recreate it, follow the instructions below:
Edit the config file config/client-info.yml or create a new one like the example shown here:
clients:
- host: 192.168.1.1
port: 5000
https: false
username:
password:
- host: 192.168.1.2
port: 5001
https: true
username:
password:
tlsCACert: |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE----- The clients field can contain more than one Synology NAS. Seperate them with a prefix -.
Create the secret using the following command (usually done by deploy.sh):
kubectl create secret -n generic client-info-secret --from-file=config/client-info.ymlsynology-csi. This is the default namespace. Change it to your custom namespace if needed.deploy/kubernetes// are using the secret name you set.Create and apply StorageClasses with the properties you want.
Create YAML files using the one at deploy/kubernetes//storage-class.yml as the example, whose content is as below:
iSCSI Protocol
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "false"
name: synostorage
provisioner: csi.san.synology.com
parameters:
fsType: 'ext4'
dsm: '192.168.1.1'
location: '/volume1'
reclaimPolicy: Retain
allowVolumeExpansion: trueSMB/CIFS Protocol
Before creating an SMB/CIFS storage class, you must create a secret and specify the DSM user whom you want to give permissions to.
apiVersion: v1
kind: Secret
metadata:
name: cifs-csi-credentials
namespace: default
type: Opaque
stringData:
username: # DSM user account accessing the shared folder
password: # DSM user password accessing the shared folderAfter creating the secret, create a storage class and fill the secret for node-stage-secret. This is a required step if you're using SMB, or there will be errors when staging volumes.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: synostorage-smb
provisioner: csi.san.synology.com
parameters:
protocol: "smb"
dsm: '192.168.1.1'
location: '/volume1'
csi.storage.k8s.io/node-stage-secret-name: "cifs-csi-credentials"
csi.storage.k8s.io/node-stage-secret-namespace: "default"
reclaimPolicy: Delete
allowVolumeExpansion: trueNFS Protocol
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: synostorage-nfs
provisioner: csi.san.synology.com
parameters:
protocol: "nfs"
dsm: "192.168.1.1"
location: '/volume1'
mountPermissions: '0755'
mountOptions:
- nfsvers=4.1
reclaimPolicy: Delete
allowVolumeExpansion: trueNVMe/TCP Protocol
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: synology-nvme-storage
provisioner: csi.san.synology.com
parameters:
protocol: "nvme" # required for nvme protocol
# dsm: "192.168.1.1"
# location: '/volume1'
reclaimPolicy: Delete
allowVolumeExpansion: trueConfigure the StorageClass properties by assigning the parameters in the table. You can also leave blank if you don’t have a preference:
| Name | Type | Description | Default | Supported protocols |
|---|---|---|---|---|
| dsm | string | The IPv4 address of your DSM, which must be included in the client-info.yml for the CSI driver to log in to DSM |
- | iSCSI, SMB, NFS |
| location | string | The location (/volume1, /volume2, ...) on DSM where the LUN for PersistentVolume will be created | - | iSCSI, SMB, NFS |
| fsType | string | The formatting file system of the PersistentVolumes when you mount them on the pods. This parameter only works with iSCSI. Supported values are ext4 and xfs; btrfs is no longer supported since v1.4.0 (see the notice below). For SMB, the fsType is always ‘cifs‘. |
'ext4' | iSCSI |
| protocol | string | The storage backend protocol. Enter ‘iscsi’ to create LUNs, 'nvme' to create NVMe namespaces, or ‘smb‘ or 'nfs' to create shared folders on DSM. | 'iscsi' | iSCSI, SMB, NFS, NVMe |
| formatOptions | string | Additional options/arguments passed to mkfs.* command. See a linux manual that corre |
No open issues yet, or sync has not completed.