configure filer via CLI
This commit is contained in:
parent
002acd516d
commit
77697d3433
@ -10,9 +10,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
endpoint = flag.String("endpoint", "unix://tmp/seaweedfs-csi.sock", "CSI endpoint to accept gRPC calls")
|
filer = flag.String("filer", "localhost:8888", "filer server")
|
||||||
nodeID = flag.String("nodeid", "", "node id")
|
endpoint = flag.String("endpoint", "unix://tmp/seaweedfs-csi.sock", "CSI endpoint to accept gRPC calls")
|
||||||
version = flag.Bool("version", false, "Print the version and exit.")
|
nodeID = flag.String("nodeid", "", "node id")
|
||||||
|
version = flag.Bool("version", false, "Print the version and exit.")
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@ -28,6 +29,6 @@ func main() {
|
|||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
drv := driver.NewSeaweedFsDriver(*nodeID, *endpoint)
|
drv := driver.NewSeaweedFsDriver(*filer, *nodeID, *endpoint)
|
||||||
drv.Run()
|
drv.Run()
|
||||||
}
|
}
|
||||||
|
|||||||
102
deploy/kubernetes/provisioner.yaml
Normal file
102
deploy/kubernetes/provisioner.yaml
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ServiceAccount
|
||||||
|
metadata:
|
||||||
|
name: csi-provisioner-sa
|
||||||
|
namespace: default
|
||||||
|
---
|
||||||
|
kind: ClusterRole
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: external-provisioner-runner
|
||||||
|
rules:
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["secrets"]
|
||||||
|
verbs: ["get", "list"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["persistentvolumes"]
|
||||||
|
verbs: ["get", "list", "watch", "create", "delete"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["persistentvolumeclaims"]
|
||||||
|
verbs: ["get", "list", "watch", "update"]
|
||||||
|
- apiGroups: ["storage.k8s.io"]
|
||||||
|
resources: ["storageclasses"]
|
||||||
|
verbs: ["get", "list", "watch"]
|
||||||
|
- apiGroups: [""]
|
||||||
|
resources: ["events"]
|
||||||
|
verbs: ["list", "watch", "create", "update", "patch"]
|
||||||
|
---
|
||||||
|
kind: ClusterRoleBinding
|
||||||
|
apiVersion: rbac.authorization.k8s.io/v1
|
||||||
|
metadata:
|
||||||
|
name: csi-provisioner-role
|
||||||
|
subjects:
|
||||||
|
- kind: ServiceAccount
|
||||||
|
name: csi-provisioner-sa
|
||||||
|
namespace: default
|
||||||
|
roleRef:
|
||||||
|
kind: ClusterRole
|
||||||
|
name: external-provisioner-runner
|
||||||
|
apiGroup: rbac.authorization.k8s.io
|
||||||
|
---
|
||||||
|
kind: Service
|
||||||
|
apiVersion: v1
|
||||||
|
metadata:
|
||||||
|
name: csi-provisioner-seaweedfs
|
||||||
|
namespace: default
|
||||||
|
labels:
|
||||||
|
app: csi-provisioner-seaweedfs
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: csi-provisioner-seaweedfs
|
||||||
|
ports:
|
||||||
|
- name: dummy
|
||||||
|
port: 12345
|
||||||
|
---
|
||||||
|
kind: StatefulSet
|
||||||
|
apiVersion: apps/v1beta1
|
||||||
|
metadata:
|
||||||
|
name: csi-provisioner-seaweedfs
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
serviceName: "csi-provisioner-seaweedfs"
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: csi-provisioner-seaweedfs
|
||||||
|
spec:
|
||||||
|
serviceAccount: csi-provisioner-sa
|
||||||
|
containers:
|
||||||
|
- name: csi-provisioner
|
||||||
|
image: quay.io/k8scsi/csi-provisioner:v1.1.0
|
||||||
|
args:
|
||||||
|
- "--provisioner=seaweedfs-csi-driver"
|
||||||
|
- "--csi-address=$(ADDRESS)"
|
||||||
|
- "--v=4"
|
||||||
|
env:
|
||||||
|
- name: ADDRESS
|
||||||
|
value: /var/lib/kubelet/plugins/seaweedfs-csi-driver/csi.sock
|
||||||
|
imagePullPolicy: "IfNotPresent"
|
||||||
|
volumeMounts:
|
||||||
|
- name: socket-dir
|
||||||
|
mountPath: /var/lib/kubelet/plugins/seaweedfs-csi-driver
|
||||||
|
- name: csi-seaweedfs
|
||||||
|
image: seaweedfs/csi:v1.1.1
|
||||||
|
args:
|
||||||
|
- "--endpoint=$(CSI_ENDPOINT)"
|
||||||
|
- "--nodeid=$(NODE_ID)"
|
||||||
|
- "--v=4"
|
||||||
|
env:
|
||||||
|
- name: CSI_ENDPOINT
|
||||||
|
value: unix:///var/lib/kubelet/plugins/seaweedfs-csi-driver/csi.sock
|
||||||
|
- name: NODE_ID
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: spec.nodeName
|
||||||
|
imagePullPolicy: "Always"
|
||||||
|
volumeMounts:
|
||||||
|
- name: socket-dir
|
||||||
|
mountPath: /var/lib/kubelet/plugins/seaweedfs-csi-driver
|
||||||
|
volumes:
|
||||||
|
- name: socket-dir
|
||||||
|
emptyDir: {}
|
||||||
@ -50,8 +50,7 @@ func (cs *ControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVol
|
|||||||
seaweedFsVolumeCount = 1
|
seaweedFsVolumeCount = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := newConfigFromSecrets(req.GetSecrets())
|
if err := filer_pb.Mkdir(cs.Driver, "/buckets", volumeId, nil); err != nil {
|
||||||
if err := filer_pb.Mkdir(cfg, "/buckets", volumeId, nil); err != nil {
|
|
||||||
return nil, fmt.Errorf("Error setting bucket metadata: %v", err)
|
return nil, fmt.Errorf("Error setting bucket metadata: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,8 +80,7 @@ func (cs *ControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVol
|
|||||||
}
|
}
|
||||||
glog.V(4).Infof("Deleting volume %s", volumeId)
|
glog.V(4).Infof("Deleting volume %s", volumeId)
|
||||||
|
|
||||||
cfg := newConfigFromSecrets(req.GetSecrets())
|
if err := filer_pb.Remove(cs.Driver, "/buckets", volumeId, true, true, true); err != nil {
|
||||||
if err := filer_pb.Remove(cfg, "/buckets", volumeId, true, true, true); err != nil {
|
|
||||||
return nil, fmt.Errorf("Error setting bucket metadata: %v", err)
|
return nil, fmt.Errorf("Error setting bucket metadata: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,8 +105,7 @@ func (cs *ControllerServer) ValidateVolumeCapabilities(ctx context.Context, req
|
|||||||
return nil, status.Error(codes.InvalidArgument, "Volume capabilities missing in request")
|
return nil, status.Error(codes.InvalidArgument, "Volume capabilities missing in request")
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := newConfigFromSecrets(req.GetSecrets())
|
exists, err := filer_pb.Exists(cs.Driver, "/buckets", req.GetVolumeId(), true)
|
||||||
exists, err := filer_pb.Exists(cfg, "/buckets", req.GetVolumeId(), true)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Error checking bucket %s exists: %v", req.GetVolumeId(), err)
|
return nil, fmt.Errorf("Error checking bucket %s exists: %v", req.GetVolumeId(), err)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,12 +4,17 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/pb"
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/security"
|
||||||
|
"github.com/chrislusf/seaweedfs/weed/util"
|
||||||
"github.com/container-storage-interface/spec/lib/go/csi"
|
"github.com/container-storage-interface/spec/lib/go/csi"
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/codes"
|
"google.golang.org/grpc/codes"
|
||||||
"google.golang.org/grpc/status"
|
"google.golang.org/grpc/status"
|
||||||
"k8s.io/klog"
|
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
|
"k8s.io/klog"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -30,17 +35,21 @@ type SeaweedFsDriver struct {
|
|||||||
vcap []*csi.VolumeCapability_AccessMode
|
vcap []*csi.VolumeCapability_AccessMode
|
||||||
cscap []*csi.ControllerServiceCapability
|
cscap []*csi.ControllerServiceCapability
|
||||||
|
|
||||||
|
filer string
|
||||||
|
grpcDialOption grpc.DialOption
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSeaweedFsDriver(nodeID, endpoint string) *SeaweedFsDriver {
|
func NewSeaweedFsDriver(filer, nodeID, endpoint string) *SeaweedFsDriver {
|
||||||
|
|
||||||
glog.Infof("Driver: %v version: %v", driverName, version)
|
glog.Infof("Driver: %v version: %v", driverName, version)
|
||||||
|
|
||||||
n := &SeaweedFsDriver{
|
n := &SeaweedFsDriver{
|
||||||
endpoint: endpoint,
|
endpoint: endpoint,
|
||||||
nodeID: nodeID,
|
nodeID: nodeID,
|
||||||
name: driverName,
|
name: driverName,
|
||||||
version: version,
|
version: version,
|
||||||
|
filer: filer,
|
||||||
|
grpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.client"),
|
||||||
}
|
}
|
||||||
|
|
||||||
n.AddVolumeCapabilityAccessModes([]csi.VolumeCapability_AccessMode_Mode{
|
n.AddVolumeCapabilityAccessModes([]csi.VolumeCapability_AccessMode_Mode{
|
||||||
@ -106,3 +115,22 @@ func (d *SeaweedFsDriver) ValidateControllerServiceRequest(c csi.ControllerServi
|
|||||||
}
|
}
|
||||||
return status.Error(codes.InvalidArgument, fmt.Sprintf("%s", c))
|
return status.Error(codes.InvalidArgument, fmt.Sprintf("%s", c))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ = filer_pb.FilerClient(&SeaweedFsDriver{})
|
||||||
|
|
||||||
|
func (d *SeaweedFsDriver) WithFilerClient(fn func(filer_pb.SeaweedFilerClient) error) error {
|
||||||
|
|
||||||
|
filerGrpcAddress, parseErr := pb.ParseServerToGrpcAddress(d.filer)
|
||||||
|
if parseErr != nil {
|
||||||
|
return fmt.Errorf("failed to parse filer %v: %v", filerGrpcAddress, parseErr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
|
||||||
|
client := filer_pb.NewSeaweedFilerClient(grpcConnection)
|
||||||
|
return fn(client)
|
||||||
|
}, filerGrpcAddress, d.grpcDialOption)
|
||||||
|
|
||||||
|
}
|
||||||
|
func (d *SeaweedFsDriver) AdjustedUrl(hostAndPort string) string {
|
||||||
|
return hostAndPort
|
||||||
|
}
|
||||||
|
|||||||
@ -4,12 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb"
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/security"
|
|
||||||
"github.com/chrislusf/seaweedfs/weed/util"
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"google.golang.org/grpc"
|
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"k8s.io/utils/mount"
|
"k8s.io/utils/mount"
|
||||||
)
|
)
|
||||||
@ -24,8 +19,8 @@ type Mounter interface {
|
|||||||
Mount(target string) error
|
Mount(target string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMounter(bucketName string, cfg *Config) (Mounter, error) {
|
func newMounter(bucketName string, filer string) (Mounter, error) {
|
||||||
return newSeaweedFsMounter(bucketName, cfg)
|
return newSeaweedFsMounter(bucketName, filer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fuseMount(path string, command string, args []string) error {
|
func fuseMount(path string, command string, args []string) error {
|
||||||
@ -64,24 +59,3 @@ func newConfigFromSecrets(secrets map[string]string) *Config {
|
|||||||
}
|
}
|
||||||
return t
|
return t
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ = filer_pb.FilerClient(&Config{})
|
|
||||||
|
|
||||||
func (cfg *Config) WithFilerClient(fn func(filer_pb.SeaweedFilerClient) error) error {
|
|
||||||
|
|
||||||
filerGrpcAddress, parseErr := pb.ParseServerToGrpcAddress(cfg.Filer)
|
|
||||||
if parseErr != nil {
|
|
||||||
return fmt.Errorf("failed to parse filer %v: %v", filerGrpcAddress, parseErr)
|
|
||||||
}
|
|
||||||
|
|
||||||
grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
|
|
||||||
|
|
||||||
return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
|
|
||||||
client := filer_pb.NewSeaweedFilerClient(grpcConnection)
|
|
||||||
return fn(client)
|
|
||||||
}, filerGrpcAddress, grpcDialOption)
|
|
||||||
|
|
||||||
}
|
|
||||||
func (cfg *Config) AdjustedUrl(hostAndPort string) string {
|
|
||||||
return hostAndPort
|
|
||||||
}
|
|
||||||
|
|||||||
@ -14,10 +14,10 @@ const (
|
|||||||
seaweedFsCmd = "weed"
|
seaweedFsCmd = "weed"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newSeaweedFsMounter(bucketName string, cfg *Config) (Mounter, error) {
|
func newSeaweedFsMounter(bucketName string, filer string) (Mounter, error) {
|
||||||
return &seaweedFsMounter{
|
return &seaweedFsMounter{
|
||||||
bucketName: bucketName,
|
bucketName: bucketName,
|
||||||
filerUrl: cfg.Filer,
|
filerUrl: filer,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -50,8 +50,7 @@ func (ns *NodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis
|
|||||||
mo = append(mo, "ro")
|
mo = append(mo, "ro")
|
||||||
}
|
}
|
||||||
|
|
||||||
cfg := newConfigFromSecrets(req.GetSecrets())
|
mounter, err := newMounter(volumeID, ns.Driver.filer)
|
||||||
mounter, err := newMounter(volumeID, cfg)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user