Add NFS and iSCSI Storage Classes

This commit is contained in:
Daniel Cosme
2026-04-30 10:41:19 -04:00
parent d5ac075b68
commit 17c86db116
9 changed files with 105 additions and 15 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ module danicos.dev/daniel/homelab
go 1.26.2 go 1.26.2
require ( 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/fatih/color v1.19.0
github.com/fluxcd/helm-controller/api v1.5.4 github.com/fluxcd/helm-controller/api v1.5.4
github.com/fluxcd/kustomize-controller/api v1.8.3 github.com/fluxcd/kustomize-controller/api v1.8.3
+2 -2
View File
@@ -1,5 +1,5 @@
danicos.dev/daniel/go-kube v1.9.0 h1:agofABwT1oa/gaxV4Q/KvUvxz1iVr8aiAB+X41WSv8s= danicos.dev/daniel/go-kube v1.10.0 h1:woCiANl8hSEXZYkDXWNeei+JYlls322EoIVekUF4hZs=
danicos.dev/daniel/go-kube v1.9.0/go.mod h1:MBGwFBrGyqkEQ55mK0PP2TdKO1oQSih4hLiPjye+8Gg= 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 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= 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= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -1,7 +1,7 @@
apiVersion: storage.k8s.io/v1 apiVersion: storage.k8s.io/v1
kind: CSIDriver kind: CSIDriver
metadata: metadata:
name: csi.truenas.io name: cis.truenas.io
spec: spec:
attachRequired: true attachRequired: true
fsGroupPolicy: File fsGroupPolicy: File
@@ -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
@@ -4,14 +4,16 @@ metadata:
name: truenas-csi name: truenas-csi
namespace: truenas-csi namespace: truenas-csi
resources: resources:
- CSIDriver.yaml
- nfs-storage-class.yaml
- namespace.yaml - namespace.yaml
- controller-deployment.yaml - controller-service-account.yaml
- controller-cluster-role.yaml - controller-cluster-role.yaml
- node-cluster-role.yaml
- node-deamonset.yaml
- config.yaml
- iscsi-storage-class.yaml
- controller-deployment.yaml
- controller-binding.yaml - controller-binding.yaml
- node-service-account.yaml - node-service-account.yaml
- node-cluster-role.yaml
- controller-service-account.yaml
- node-binding.yaml - node-binding.yaml
- node-deamonset.yaml
- CSIDriver.yaml
- config.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
+6
View File
@@ -19,6 +19,12 @@ var Linkding = Service{
var ( var (
Longhorn = "longhorn" Longhorn = "longhorn"
Monitoring = "monitoring" Monitoring = "monitoring"
)
var (
TrueNAS_CSI = "truenas-csi" TrueNAS_CSI = "truenas-csi"
TrueNASURL = "apex-truenas.orca-uaru.ts.net" TrueNASURL = "apex-truenas.orca-uaru.ts.net"
TrueNASProvisioner = "cis.truenas.io"
TrueNASSTorageClassNFS = "truenas-nfs"
TrueNASSTorageClass_iSCSI = "truenas-iscsi"
) )
+56
View File
@@ -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
*/
+3 -1
View File
@@ -83,8 +83,10 @@ func Stack() stack.Stack {
"node-cluster-role": nodeRole, "node-cluster-role": nodeRole,
"node-binding": kube.ClusterRoleBinding(nodeRole.Name+"-binding", nodeSA, nodeRole), "node-binding": kube.ClusterRoleBinding(nodeRole.Name+"-binding", nodeSA, nodeRole),
"node-deamonset": nodeCSI(), "node-deamonset": nodeCSI(),
"CSIDriver": CSIDriver("csi.truenas.io"), "CSIDriver": CSIDriver(root.TrueNASProvisioner),
"config": config, "config": config,
"nfs-storage-class": NFSStorageClass,
"iscsi-storage-class": iSCSIStorageClass,
}, },
) )
return kz.Stack(root.TrueNAS_CSI) return kz.Stack(root.TrueNAS_CSI)