diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2021-09-28 13:42:55 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-28 13:42:55 -0700 |
| commit | 3683a0ae902c0a46bff36e027fa49250dfcbcb36 (patch) | |
| tree | c9aa46efe5977d10c280d850044ed2d942707500 | |
| parent | 597e2c539cf5a87cae1d15be6951c0c8307ef675 (diff) | |
| parent | 5c2298bd215959d78c881e5d48d96569b83ab3c7 (diff) | |
| download | seaweedfs-csi-driver-3683a0ae902c0a46bff36e027fa49250dfcbcb36.tar.xz seaweedfs-csi-driver-3683a0ae902c0a46bff36e027fa49250dfcbcb36.zip | |
Merge pull request #33 from kvaster/static_mounts
| -rw-r--r-- | README.md | 65 | ||||
| -rw-r--r-- | deploy/helm/seaweedfs-csi-driver/templates/storageclass.yml | 3 | ||||
| -rw-r--r-- | pkg/driver/controllerserver.go | 12 | ||||
| -rw-r--r-- | pkg/driver/driver.go | 2 | ||||
| -rw-r--r-- | pkg/driver/mounter.go | 4 | ||||
| -rw-r--r-- | pkg/driver/mounter_seaweedfs.go | 26 | ||||
| -rw-r--r-- | pkg/driver/nodeserver.go | 16 |
7 files changed, 97 insertions, 31 deletions
@@ -67,13 +67,72 @@ When update DaemonSet ( DS ) break processes who implements fuse mount. And now new pod not remount net device For better safe update use ``node.updateStrategy.type: OnDelete`` in this need manual update. Steps: - - delete DS pods on node where no exists seaweefs PV + - delete DS pods on node where no exists seaweedfs PV - cordon or taint node - evict or delete pods with seaweedfs PV - delete DS pod on node - uncordon or remove taint on node - - repeat all steps on all nodes - + - repeat all steps on [all nodes + +# Static and dynamic provisioning + +By default, driver will create separate folder (`/buckets/<volume-id>`) and will use separate collection (`volume-id`) +for each request. Sometimes we need to use exact collection name or change replication options. +It can be done via creating separate storage class with options: + +``` +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: seaweedfs-special +provisioner: seaweedfs-csi-driver +parameters: + collection: mycollection + replication: "011" +``` + +There is another use case when we need to access one folder from different pods with ro/rw access. +In this case we do not need additional StorageClass. We need to create PersistentVolume: + +``` +apiVersion: v1 +kind: PersistentVolume +metadata: + name: seaweedfs-static +spec: + accessModes: + - ReadWriteMany + capacity: + storage: 1Gi + csi: + driver: seaweedfs-csi-driver + volumeHandle: dfs-test + volumeAttributes: + collection: default + replication: "011" + path: /path/to/files + readOnly: true + persistentVolumeReclaimPolicy: Retain + volumeMode: Filesystem +``` + +and bind ~~PersistentVolumeClaim(s) to it: + +``` +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: seaweedfs-static +spec: + storageClassName: "" + volumeName: seaweedfs-static + accessModes: + - ReadWriteMany + resources: + requests~~: + storage: 1Gi +``` + # License [Apache v2 license](https://www.apache.org/licenses/LICENSE-2.0) diff --git a/deploy/helm/seaweedfs-csi-driver/templates/storageclass.yml b/deploy/helm/seaweedfs-csi-driver/templates/storageclass.yml index c79c29d..c1f8c99 100644 --- a/deploy/helm/seaweedfs-csi-driver/templates/storageclass.yml +++ b/deploy/helm/seaweedfs-csi-driver/templates/storageclass.yml @@ -1,10 +1,11 @@ +{{- if .Values.storageClassName }} kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: {{ .Values.storageClassName }} - namespace: {{ .Release.Namespace }} annotations: {{- if .Values.isDefaultStorageClass }} storageclass.kubernetes.io/is-default-class: "true" {{- end }} provisioner: {{ .Values.driverName }} +{{- end }} diff --git a/pkg/driver/controllerserver.go b/pkg/driver/controllerserver.go index 0e07291..c57a72a 100644 --- a/pkg/driver/controllerserver.go +++ b/pkg/driver/controllerserver.go @@ -39,16 +39,8 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol } params := req.GetParameters() - glog.V(4).Info("params:%v", params) + glog.V(4).Infof("params:%v", params) capacity := req.GetCapacityRange().GetRequiredBytes() - capacityGB := capacity >> 30 - if capacityGB == 0 { - return nil, status.Error(codes.InvalidArgument, "required bytes less than 1GB") - } - seaweedFsVolumeCount := capacityGB / 30 - if seaweedFsVolumeCount == 0 { - seaweedFsVolumeCount = 1 - } if err := filer_pb.Mkdir(cs.Driver, "/buckets", volumeId, nil); err != nil { return nil, fmt.Errorf("Error setting bucket metadata: %v", err) @@ -59,7 +51,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol return &csi.CreateVolumeResponse{ Volume: &csi.Volume{ VolumeId: volumeId, - CapacityBytes: capacity, // 0, // seaweedFsVolumeCount * 1024 * 1024 * 30, + CapacityBytes: capacity, VolumeContext: params, }, }, nil diff --git a/pkg/driver/driver.go b/pkg/driver/driver.go index 9c77adb..9fb08ff 100644 --- a/pkg/driver/driver.go +++ b/pkg/driver/driver.go @@ -61,8 +61,6 @@ func NewSeaweedFsDriver(filer, nodeID, endpoint string) *SeaweedFsDriver { n.AddVolumeCapabilityAccessModes([]csi.VolumeCapability_AccessMode_Mode{ csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER, - }) - n.AddVolumeCapabilityAccessModes([]csi.VolumeCapability_AccessMode_Mode{ csi.VolumeCapability_AccessMode_MULTI_NODE_MULTI_WRITER, }) n.AddControllerServiceCapabilities([]csi.ControllerServiceCapability_RPC_Type{ diff --git a/pkg/driver/mounter.go b/pkg/driver/mounter.go index 5085b49..82da5f6 100644 --- a/pkg/driver/mounter.go +++ b/pkg/driver/mounter.go @@ -20,8 +20,8 @@ type Mounter interface { Mount(target string) error } -func newMounter(bucketName string, driver *SeaweedFsDriver, volContext map[string]string) (Mounter, error) { - return newSeaweedFsMounter(bucketName, driver, volContext) +func newMounter(path string, collection string, readOnly bool, driver *SeaweedFsDriver, volContext map[string]string) (Mounter, error) { + return newSeaweedFsMounter(path, collection, readOnly, driver, volContext) } func fuseMount(path string, command string, args []string) error { diff --git a/pkg/driver/mounter_seaweedfs.go b/pkg/driver/mounter_seaweedfs.go index 5b9ccb1..a35d702 100644 --- a/pkg/driver/mounter_seaweedfs.go +++ b/pkg/driver/mounter_seaweedfs.go @@ -2,13 +2,14 @@ package driver import ( "fmt" - "github.com/chrislusf/seaweedfs/weed/glog" ) // Implements Mounter type seaweedFsMounter struct { - bucketName string + path string + collection string + readOnly bool driver *SeaweedFsDriver volContext map[string]string } @@ -17,25 +18,27 @@ const ( seaweedFsCmd = "weed" ) -func newSeaweedFsMounter(bucketName string, driver *SeaweedFsDriver, volContext map[string]string) (Mounter, error) { +func newSeaweedFsMounter(path string, collection string, readOnly bool, driver *SeaweedFsDriver, volContext map[string]string) (Mounter, error) { return &seaweedFsMounter{ - bucketName: bucketName, + path: path, + collection: collection, + readOnly: readOnly, driver: driver, volContext: volContext, }, nil } func (seaweedFs *seaweedFsMounter) Mount(target string) error { - glog.V(0).Infof("mounting %s %s to %s", seaweedFs.driver.filer, seaweedFs.bucketName, target) + glog.V(0).Infof("mounting %s %s to %s", seaweedFs.driver.filer, seaweedFs.path, target) args := []string{ "mount", "-dirAutoCreate=true", "-umask=000", fmt.Sprintf("-dir=%s", target), - fmt.Sprintf("-collection=%s", seaweedFs.bucketName), + fmt.Sprintf("-collection=%s", seaweedFs.collection), fmt.Sprintf("-filer=%s", seaweedFs.driver.filer), - fmt.Sprintf("-filer.path=/buckets/%s", seaweedFs.bucketName), + fmt.Sprintf("-filer.path=%s", seaweedFs.path), fmt.Sprintf("-cacheCapacityMB=%d", seaweedFs.driver.CacheSizeMB), } @@ -48,9 +51,15 @@ func (seaweedFs *seaweedFsMounter) Mount(target string) error { args = append(args, fmt.Sprintf("-map.uid=%s", value)) case "map.gid": args = append(args, fmt.Sprintf("-map.gid=%s", value)) + case "replication": + args = append(args, fmt.Sprintf("-replication=%s", value)) } } + if seaweedFs.readOnly { + args = append(args, "-readOnly") + } + if seaweedFs.driver.ConcurrentWriters > 0 { args = append(args, fmt.Sprintf("-concurrentWriters=%d", seaweedFs.driver.ConcurrentWriters)) } @@ -63,9 +72,10 @@ func (seaweedFs *seaweedFsMounter) Mount(target string) error { if seaweedFs.driver.GidMap != "" { args = append(args, fmt.Sprintf("-map.gid=%s", seaweedFs.driver.GidMap)) } + err := fuseMount(target, seaweedFsCmd, args) if err != nil { - glog.Errorf("mount %s %s to %s: %s", seaweedFs.driver.filer, seaweedFs.bucketName, target, err) + glog.Errorf("mount %s %s to %s: %s", seaweedFs.driver.filer, seaweedFs.path, target, err) } return err } diff --git a/pkg/driver/nodeserver.go b/pkg/driver/nodeserver.go index 71f40ba..8d2277a 100644 --- a/pkg/driver/nodeserver.go +++ b/pkg/driver/nodeserver.go @@ -2,6 +2,7 @@ package driver import ( "context" + "fmt" "os" "strings" @@ -50,14 +51,19 @@ func (ns *NodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis return &csi.NodePublishVolumeResponse{}, nil } - mo := req.GetVolumeCapability().GetMount().GetMountFlags() - if req.GetReadonly() { - mo = append(mo, "ro") + volContext := req.GetVolumeContext() + + path, ok := volContext["path"] + if !ok { + path = fmt.Sprintf("/buckets/%s", volumeID) } - volContext := req.GetVolumeContext() + collection, ok := volContext["collection"] + if !ok { + collection = volumeID + } - mounter, err := newMounter(volumeID, ns.Driver, volContext) + mounter, err := newMounter(path, collection, req.GetReadonly(), ns.Driver, volContext) if err != nil { return nil, err } |
