Skip to content

Commit 905c1d4

Browse files
committed
Allow disabling controller or node service
1 parent 4fcbde3 commit 905c1d4

File tree

8 files changed

+77
-34
lines changed

8 files changed

+77
-34
lines changed

cmd/main.go

+32-13
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@ import (
3030
)
3131

3232
var (
33-
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
34-
gceConfigFilePath = flag.String("cloud-config", "", "Path to GCE cloud provider config")
35-
vendorVersion string
33+
cloudConfigFilePath = flag.String("cloud-config", "", "Path to GCE cloud provider config")
34+
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
35+
runControllerService = flag.Bool("run-controller-service", true, "If set to false then the CSI driver does not activate its controller service (default: true)")
36+
runNodeService = flag.Bool("run-node-service", true, "If set to false then the CSI driver does not activate its node service (default: true)")
37+
vendorVersion string
3638
)
3739

3840
const (
@@ -57,6 +59,8 @@ func main() {
5759
}
5860

5961
func handle() {
62+
var err error
63+
6064
if vendorVersion == "" {
6165
klog.Fatalf("vendorVersion must be set at compile time")
6266
}
@@ -68,20 +72,35 @@ func handle() {
6872
ctx, cancel := context.WithCancel(context.Background())
6973
defer cancel()
7074

71-
cloudProvider, err := gce.CreateCloudProvider(ctx, vendorVersion, *gceConfigFilePath)
72-
if err != nil {
73-
klog.Fatalf("Failed to get cloud provider: %v", err)
75+
//Initialize identity server
76+
identityServer := driver.NewIdentityServer(gceDriver)
77+
78+
//Initialize requirements for the controller service
79+
var controllerServer *driver.GCEControllerServer
80+
if *runControllerService {
81+
cloudProvider, err := gce.CreateCloudProvider(ctx, vendorVersion, *cloudConfigFilePath)
82+
if err != nil {
83+
klog.Fatalf("Failed to get cloud provider: %v", err)
84+
}
85+
controllerServer = driver.NewControllerServer(gceDriver, cloudProvider)
86+
} else if *cloudConfigFilePath != "" {
87+
klog.Warningf("controller service is disabled but cloud config given - it has no effect")
7488
}
7589

76-
mounter := mountmanager.NewSafeMounter()
77-
deviceUtils := mountmanager.NewDeviceUtils()
78-
statter := mountmanager.NewStatter()
79-
ms, err := metadataservice.NewMetadataService()
80-
if err != nil {
81-
klog.Fatalf("Failed to set up metadata service: %v", err)
90+
//Initialize requirements for the node service
91+
var nodeServer *driver.GCENodeServer
92+
if *runNodeService {
93+
mounter := mountmanager.NewSafeMounter()
94+
deviceUtils := mountmanager.NewDeviceUtils()
95+
statter := mountmanager.NewStatter()
96+
meta, err := metadataservice.NewMetadataService()
97+
if err != nil {
98+
klog.Fatalf("Failed to set up metadata service: %v", err)
99+
}
100+
nodeServer = driver.NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
82101
}
83102

84-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, statter, driverName, vendorVersion)
103+
err = gceDriver.SetupGCEDriver(driverName, vendorVersion, identityServer, controllerServer, nodeServer)
85104
if err != nil {
86105
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
87106
}

deploy/kubernetes/base/controller.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ spec:
1717
# since it replaces GCE Metadata Server with GKE Metadata Server. Remove
1818
# this requirement when issue is resolved and before any exposure of
1919
# metrics ports
20-
hostNetwork: true
20+
hostNetwork: true
2121
serviceAccountName: csi-gce-pd-controller-sa
2222
priorityClassName: csi-gce-pd-controller
2323
containers:
@@ -27,6 +27,8 @@ spec:
2727
- "--v=5"
2828
- "--csi-address=/csi/csi.sock"
2929
- "--feature-gates=Topology=true"
30+
# - "--run-controller-service=false" # disable the controller service of the CSI driver
31+
# - "--run-node-service=false" # disable the node service of the CSI driver
3032
volumeMounts:
3133
- name: socket-dir
3234
mountPath: /csi

docs/kubernetes/user-guides/driver-install.md

+20-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ compute.instances.get
1818
compute.instances.attachDisk
1919
compute.instances.detachDisk
2020
roles/compute.storageAdmin
21-
roles/iam.serviceAccountUser
21+
roles/iam.serviceAccountUser
2222
```
2323

2424
If there is a pre-existing service account with these roles for use then the
@@ -79,4 +79,22 @@ iam.serviceAccounts.delete
7979
```
8080

8181
These permissions are not required if you already have a service account ready
82-
for use by the PD Driver.
82+
for use by the PD Driver.
83+
84+
## Disabling particular CSI driver services
85+
86+
Traditionally, you run the CSI controllers with the GCE PD driver in the same Kubernetes cluster.
87+
Though, there may be cases where you will only want to run a subset of the available driver services (for example, one scenario is running the controllers outside of the cluster they are serving (while the GCE PD driver still runs inside the served cluster), but there might be others scenarios).
88+
The CSI driver consists out of these services:
89+
90+
* The **controller** service starts the GRPC server that serves `CreateVolume`, `DeleteVolume`, etc. It is depending on the GCP service account credentials and talks with the GCP API.
91+
* The **identity** service is responsible to provide identity services like capability information of the CSI plugin.
92+
* The **node** service implements the various operations for volumes that are run locally from the node, for example `NodePublishVolume`, `NodeStageVolume`, etc. It does not do operations like `CreateVolume` or `ControllerPublish`. Also, as it runs directly on the GCE instances, it is depending on the GCE metadata service.
93+
94+
The CSI driver has two command line flags, `--run-controller-service` and `--run-node-service` which both default to `true`.
95+
You can disable the individual services by setting the respective flags to `false`.
96+
97+
Note: If you want to run the CSI controllers outside of the cluster you have to specify both the `zone` and `projectId` parameters in the GCE cloud provider config.
98+
The `zone` is the name of one of the availability zones the served Kubernetes cluster is deployed to.
99+
It is used to derive the GCP region and to discover the other availability zones in this region.
100+
The `project-id` is the GCP project ID in which the controller is operating.

pkg/gce-pd-csi-driver/gce-pd-driver.go

+6-9
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,11 @@ func GetGCEDriver() *GCEDriver {
4545
return &GCEDriver{}
4646
}
4747

48-
func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter *mount.SafeFormatAndMount,
49-
deviceUtils mountmanager.DeviceUtils, meta metadataservice.MetadataService, statter mountmanager.Statter, name, vendorVersion string) error {
48+
func (gceDriver *GCEDriver) SetupGCEDriver(name, vendorVersion string, identityServer *GCEIdentityServer, controllerServer *GCEControllerServer, nodeServer *GCENodeServer) error {
5049
if name == "" {
5150
return fmt.Errorf("Driver name missing")
5251
}
5352

54-
gceDriver.name = name
55-
gceDriver.vendorVersion = vendorVersion
56-
5753
// Adding Capabilities
5854
vcam := []csi.VolumeCapability_AccessMode_Mode{
5955
csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER,
@@ -78,10 +74,11 @@ func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter
7874
}
7975
gceDriver.AddNodeServiceCapabilities(ns)
8076

81-
// Set up RPC Servers
82-
gceDriver.ids = NewIdentityServer(gceDriver)
83-
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
84-
gceDriver.cs = NewControllerServer(gceDriver, cloudProvider)
77+
gceDriver.name = name
78+
gceDriver.vendorVersion = vendorVersion
79+
gceDriver.ids = identityServer
80+
gceDriver.cs = controllerServer
81+
gceDriver.ns = nodeServer
8582

8683
return nil
8784
}

pkg/gce-pd-csi-driver/gce-pd-driver_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"testing"
1919

2020
gce "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/compute"
21-
metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata"
2221
)
2322

2423
func initGCEDriver(t *testing.T, cloudDisks []*gce.CloudDisk) *GCEDriver {
@@ -44,7 +43,8 @@ func initBlockingGCEDriver(t *testing.T, cloudDisks []*gce.CloudDisk, readyToExe
4443
func initGCEDriverWithCloudProvider(t *testing.T, cloudProvider gce.GCECompute) *GCEDriver {
4544
vendorVersion := "test-vendor"
4645
gceDriver := GetGCEDriver()
47-
err := gceDriver.SetupGCEDriver(cloudProvider, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion)
46+
controllerServer := NewControllerServer(gceDriver, cloudProvider)
47+
err := gceDriver.SetupGCEDriver(driver, vendorVersion, nil, controllerServer, nil)
4848
if err != nil {
4949
t.Fatalf("Failed to setup GCE Driver: %v", err)
5050
}

pkg/gce-pd-csi-driver/identity_test.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import (
2020
"context"
2121

2222
csi "github.com/container-storage-interface/spec/lib/go/csi"
23-
metadataservice "sigs.k8s.io/gcp-compute-persistent-disk-csi-driver/pkg/gce-cloud-provider/metadata"
2423
)
2524

2625
func TestGetPluginInfo(t *testing.T) {
2726
vendorVersion := "test-vendor"
2827
gceDriver := GetGCEDriver()
29-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion)
28+
identityServer := NewIdentityServer(gceDriver)
29+
err := gceDriver.SetupGCEDriver(driver, vendorVersion, identityServer, nil, nil)
3030
if err != nil {
3131
t.Fatalf("Failed to setup GCE Driver: %v", err)
3232
}
@@ -48,7 +48,8 @@ func TestGetPluginInfo(t *testing.T) {
4848

4949
func TestGetPluginCapabilities(t *testing.T) {
5050
gceDriver := GetGCEDriver()
51-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor")
51+
identityServer := NewIdentityServer(gceDriver)
52+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", identityServer, nil, nil)
5253
if err != nil {
5354
t.Fatalf("Failed to setup GCE Driver: %v", err)
5455
}
@@ -80,7 +81,8 @@ func TestGetPluginCapabilities(t *testing.T) {
8081

8182
func TestProbe(t *testing.T) {
8283
gceDriver := GetGCEDriver()
83-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor")
84+
identityServer := NewIdentityServer(gceDriver)
85+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", identityServer, nil, nil)
8486
if err != nil {
8587
t.Fatalf("Failed to setup GCE Driver: %v", err)
8688
}

pkg/gce-pd-csi-driver/node_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ func getTestGCEDriverWithCustomMounter(t *testing.T, mounter *mount.SafeFormatAn
4242

4343
func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, deviceUtils mountmanager.DeviceUtils, metaService metadataservice.MetadataService) *GCEDriver {
4444
gceDriver := GetGCEDriver()
45-
err := gceDriver.SetupGCEDriver(nil, mounter, deviceUtils, metaService, mountmanager.NewFakeStatter(), driver, "test-vendor")
45+
nodeServer := NewNodeServer(gceDriver, mounter, deviceUtils, metaService, mountmanager.NewFakeStatter())
46+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nodeServer)
4647
if err != nil {
4748
t.Fatalf("Failed to setup GCE Driver: %v", err)
4849
}
@@ -51,7 +52,8 @@ func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, dev
5152

5253
func getTestBlockingGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *GCEDriver {
5354
gceDriver := GetGCEDriver()
54-
err := gceDriver.SetupGCEDriver(nil, mountmanager.NewFakeSafeBlockingMounter(readyToExecute), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), nil, driver, "test-vendor")
55+
nodeServer := NewNodeServer(gceDriver, mountmanager.NewFakeSafeBlockingMounter(readyToExecute), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), mountmanager.NewFakeStatter())
56+
err := gceDriver.SetupGCEDriver(driver, "test-vendor", nil, nil, nodeServer)
5557
if err != nil {
5658
t.Fatalf("Failed to setup GCE Driver: %v", err)
5759
}

test/sanity/sanity_test.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ func TestSanity(t *testing.T) {
5454
deviceUtils := mountmanager.NewFakeDeviceUtils()
5555

5656
//Initialize GCE Driver
57-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(), driverName, vendorVersion)
57+
identityServer := driver.NewIdentityServer(gceDriver)
58+
controllerServer := driver.NewControllerServer(gceDriver, cloudProvider)
59+
nodeServer := driver.NewNodeServer(gceDriver, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter())
60+
err = gceDriver.SetupGCEDriver(driverName, vendorVersion, identityServer, controllerServer, nodeServer)
5861
if err != nil {
5962
t.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
6063
}

0 commit comments

Comments
 (0)