From 17c86db1162b466e488f54a28e1aff38143c3c85 Mon Sep 17 00:00:00 2001 From: Daniel Cosme Date: Thu, 30 Apr 2026 10:41:19 -0400 Subject: [PATCH] Add NFS and iSCSI Storage Classes --- go.mod | 2 +- go.sum | 4 +- .../hydra/truenas-csi/CSIDriver.yaml | 2 +- .../truenas-csi/iscsi-storage-class.yaml | 13 +++++ .../hydra/truenas-csi/kuztomization.yaml | 14 +++-- .../hydra/truenas-csi/nfs-storage-class.yaml | 11 ++++ pkg/root/services.go | 14 +++-- pkg/truenas/storageclass.go | 56 +++++++++++++++++++ pkg/truenas/truenas.go | 4 +- 9 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 infrastructure/hydra/truenas-csi/iscsi-storage-class.yaml create mode 100644 infrastructure/hydra/truenas-csi/nfs-storage-class.yaml create mode 100644 pkg/truenas/storageclass.go diff --git a/go.mod b/go.mod index 5c754e3..ae1b6fd 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module danicos.dev/daniel/homelab go 1.26.2 require ( - danicos.dev/daniel/go-kube v1.9.0 + danicos.dev/daniel/go-kube v1.10.0 github.com/fatih/color v1.19.0 github.com/fluxcd/helm-controller/api v1.5.4 github.com/fluxcd/kustomize-controller/api v1.8.3 diff --git a/go.sum b/go.sum index 7585be5..3814e54 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -danicos.dev/daniel/go-kube v1.9.0 h1:agofABwT1oa/gaxV4Q/KvUvxz1iVr8aiAB+X41WSv8s= -danicos.dev/daniel/go-kube v1.9.0/go.mod h1:MBGwFBrGyqkEQ55mK0PP2TdKO1oQSih4hLiPjye+8Gg= +danicos.dev/daniel/go-kube v1.10.0 h1:woCiANl8hSEXZYkDXWNeei+JYlls322EoIVekUF4hZs= +danicos.dev/daniel/go-kube v1.10.0/go.mod h1:MBGwFBrGyqkEQ55mK0PP2TdKO1oQSih4hLiPjye+8Gg= github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= diff --git a/infrastructure/hydra/truenas-csi/CSIDriver.yaml b/infrastructure/hydra/truenas-csi/CSIDriver.yaml index bfe2ff6..8b7e149 100644 --- a/infrastructure/hydra/truenas-csi/CSIDriver.yaml +++ b/infrastructure/hydra/truenas-csi/CSIDriver.yaml @@ -1,7 +1,7 @@ apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: - name: csi.truenas.io + name: cis.truenas.io spec: attachRequired: true fsGroupPolicy: File diff --git a/infrastructure/hydra/truenas-csi/iscsi-storage-class.yaml b/infrastructure/hydra/truenas-csi/iscsi-storage-class.yaml new file mode 100644 index 0000000..7d85937 --- /dev/null +++ b/infrastructure/hydra/truenas-csi/iscsi-storage-class.yaml @@ -0,0 +1,13 @@ +allowVolumeExpansion: true +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: truenas-iscsi +parameters: + compression: LZ4 + iscsi.blocksize: "4096" + protocol: iscsi + volblocksize: 16K +provisioner: cis.truenas.io +reclaimPolicy: Delete +volumeBindingMode: Immediate diff --git a/infrastructure/hydra/truenas-csi/kuztomization.yaml b/infrastructure/hydra/truenas-csi/kuztomization.yaml index 186d17e..eb68d30 100644 --- a/infrastructure/hydra/truenas-csi/kuztomization.yaml +++ b/infrastructure/hydra/truenas-csi/kuztomization.yaml @@ -4,14 +4,16 @@ metadata: name: truenas-csi namespace: truenas-csi resources: +- CSIDriver.yaml +- nfs-storage-class.yaml - namespace.yaml -- controller-deployment.yaml +- controller-service-account.yaml - controller-cluster-role.yaml +- node-cluster-role.yaml +- node-deamonset.yaml +- config.yaml +- iscsi-storage-class.yaml +- controller-deployment.yaml - controller-binding.yaml - node-service-account.yaml -- node-cluster-role.yaml -- controller-service-account.yaml - node-binding.yaml -- node-deamonset.yaml -- CSIDriver.yaml -- config.yaml diff --git a/infrastructure/hydra/truenas-csi/nfs-storage-class.yaml b/infrastructure/hydra/truenas-csi/nfs-storage-class.yaml new file mode 100644 index 0000000..ea82931 --- /dev/null +++ b/infrastructure/hydra/truenas-csi/nfs-storage-class.yaml @@ -0,0 +1,11 @@ +allowVolumeExpansion: true +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: truenas-nfs +parameters: + compression: LZ4 + protocol: nfs +provisioner: cis.truenas.io +reclaimPolicy: Retain +volumeBindingMode: Immediate diff --git a/pkg/root/services.go b/pkg/root/services.go index 8241564..1fe3ef4 100644 --- a/pkg/root/services.go +++ b/pkg/root/services.go @@ -17,8 +17,14 @@ var Linkding = Service{ } var ( - Longhorn = "longhorn" - Monitoring = "monitoring" - TrueNAS_CSI = "truenas-csi" - TrueNASURL = "apex-truenas.orca-uaru.ts.net" + Longhorn = "longhorn" + Monitoring = "monitoring" +) + +var ( + TrueNAS_CSI = "truenas-csi" + TrueNASURL = "apex-truenas.orca-uaru.ts.net" + TrueNASProvisioner = "cis.truenas.io" + TrueNASSTorageClassNFS = "truenas-nfs" + TrueNASSTorageClass_iSCSI = "truenas-iscsi" ) diff --git a/pkg/truenas/storageclass.go b/pkg/truenas/storageclass.go new file mode 100644 index 0000000..41becde --- /dev/null +++ b/pkg/truenas/storageclass.go @@ -0,0 +1,56 @@ +package truenas + +import ( + "danicos.dev/daniel/go-kube/pkg/kube" + "danicos.dev/daniel/homelab/pkg/root" + core "k8s.io/api/core/v1" + storage "k8s.io/api/storage/v1" +) + +var NFSStorageClass storage.StorageClass +var iSCSIStorageClass storage.StorageClass + +func init() { + /* + From: https://github.com/truenas/truenas-csi + */ + NFSStorageClass = storage.StorageClass{ + TypeMeta: kube.StorageClassMeta, + ObjectMeta: kube.ObjectMeta(root.TrueNASSTorageClassNFS, ""), + Provisioner: root.TrueNASProvisioner, + Parameters: map[string]string{ + "protocol": "nfs", + "compression": "LZ4", + // Custom NFS mount options passed to clients + // "nfs.mountOptions": "hard,nfsvers=4.1", + }, + ReclaimPolicy: new(core.PersistentVolumeReclaimRetain), + VolumeBindingMode: new(storage.VolumeBindingImmediate), + AllowVolumeExpansion: new(true), + } + iSCSIStorageClass = storage.StorageClass{ + TypeMeta: kube.StorageClassMeta, + ObjectMeta: kube.ObjectMeta(root.TrueNASSTorageClass_iSCSI, ""), + Provisioner: root.TrueNASProvisioner, + Parameters: map[string]string{ + "protocol": "iscsi", + "compression": "LZ4", + "volblocksize": "16K", + "iscsi.blocksize": "4096", + }, + ReclaimPolicy: new(core.PersistentVolumeReclaimDelete), + VolumeBindingMode: new(storage.VolumeBindingImmediate), + AllowVolumeExpansion: new(true), + } +} + +/* +NFS Parameters +Parameter Description Example + +nfs.hosts Allowed hosts 10.0.0.0/8,192.168.1.0/24 +nfs.networks Allowed networks 10.0.0.0/8 +nfs.mountOptions Client mount options hard,nfsvers=4.1 +nfs.mapAllUser NFS user mapping (default: root) postgres +nfs.mapAllGroup NFS group mapping (default: wheel) postgres +*/ diff --git a/pkg/truenas/truenas.go b/pkg/truenas/truenas.go index 75ccabb..6e5c997 100644 --- a/pkg/truenas/truenas.go +++ b/pkg/truenas/truenas.go @@ -83,8 +83,10 @@ func Stack() stack.Stack { "node-cluster-role": nodeRole, "node-binding": kube.ClusterRoleBinding(nodeRole.Name+"-binding", nodeSA, nodeRole), "node-deamonset": nodeCSI(), - "CSIDriver": CSIDriver("csi.truenas.io"), + "CSIDriver": CSIDriver(root.TrueNASProvisioner), "config": config, + "nfs-storage-class": NFSStorageClass, + "iscsi-storage-class": iSCSIStorageClass, }, ) return kz.Stack(root.TrueNAS_CSI)