Skip to content

Commit 8526aad

Browse files
committed
Allow running the controller service separately
1 parent dd14907 commit 8526aad

File tree

9 files changed

+75
-28
lines changed

9 files changed

+75
-28
lines changed

cmd/main.go

+16-10
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,12 @@ func init() {
3333
}
3434

3535
var (
36-
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
37-
gceConfigFilePath = flag.String("cloud-config", "", "Path to GCE cloud provider config")
38-
vendorVersion string
36+
endpoint = flag.String("endpoint", "unix:/tmp/csi.sock", "CSI endpoint")
37+
cloudConfigFilePath = flag.String("cloud-config", "", "Path to GCE cloud provider config")
38+
runControllerService = flag.Bool("run-controller-service", true, "If set to false then the CSI driver does not activate its controller service (default: true)")
39+
runIdentityService = flag.Bool("run-identity-service", true, "If set to false then the CSI driver does not activate its identity service (default: true)")
40+
runNodeService = flag.Bool("run-node-service", true, "If set to false then the CSI driver does not activate its node service (default: true)")
41+
vendorVersion string
3942
)
4043

4144
const (
@@ -66,22 +69,25 @@ func handle() {
6669

6770
gceDriver := driver.GetGCEDriver()
6871

69-
//Initialize GCE Driver (Move setup to main?)
70-
cloudProvider, err := gce.CreateCloudProvider(vendorVersion, *gceConfigFilePath)
72+
// Initialize GCE Driver (Move setup to main?)
73+
cloudProvider, err := gce.CreateCloudProvider(vendorVersion, *cloudConfigFilePath)
7174
if err != nil {
7275
klog.Fatalf("Failed to get cloud provider: %v", err)
7376
}
7477

7578
mounter := mountmanager.NewSafeMounter()
7679
deviceUtils := mountmanager.NewDeviceUtils()
7780
statter := mountmanager.NewStatter()
78-
ms, err := metadataservice.NewMetadataService()
79-
if err != nil {
80-
klog.Fatalf("Failed to set up metadata service: %v", err)
81+
82+
var ms metadataservice.MetadataService
83+
if !*runNodeService {
84+
ms, err = metadataservice.NewMetadataService()
85+
if err != nil {
86+
klog.Fatalf("Failed to set up metadata service: %v", err)
87+
}
8188
}
8289

83-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, statter, driverName, vendorVersion)
84-
if err != nil {
90+
if err := gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, statter, driverName, vendorVersion, *runControllerService, *runIdentityService, *runNodeService); err != nil {
8591
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
8692
}
8793

deploy/kubernetes/base/controller.yaml

+4-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,9 @@ 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-identity-service=false" # disable the identity service of the CSI driver
32+
# - "--run-node-service=false" # disable the node service of the CSI driver
3033
volumeMounts:
3134
- name: socket-dir
3235
mountPath: /csi

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

+18-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,21 @@ $ ./deploy/setup-project.sh
2020
$ GCE_PD_SA_DIR=/my/safe/credentials/directory # Directory to get the service account key
2121
$ GCE_PD_DRIVER_VERSION=stable # Driver version to deploy
2222
$ ./deploy/kubernetes/deploy-driver.sh
23-
```
23+
```
24+
25+
## Disabling particular CSI driver services
26+
27+
Traditionally, you run the CSI controllers with the GCE PD driver in the same Kubernetes cluster.
28+
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).
29+
The CSI driver consists out of these services:
30+
31+
* The **controller** service starts the GRPC server that is used for communication between the CSI components. It is depending on the GCP service account credentials.
32+
* The **identity** service is responsible to provide identity services like capability information of the CSI plugin.
33+
* The **node** service implements the various operations for volumes like creation, deletion, etc. It is depending on the GCE metadata service.
34+
35+
The CSI driver has three command line flags, `--run-controller-service`, `--run-identity-service`, and `--run-node-service` which all default to `true`.
36+
You can disable individually services by setting the respective flags to `false`.
37+
38+
Note: If you want to run the CSI controllers outside of the cluster you might need to specify the `local-zone` parameter in the GCE cloud provider config.
39+
The `local-zone` is the name of one of the availability zones the served Kubernetes cluster is deployed to.
40+
It is used to derive the GCP region and to discover the other availability zones in this region.

pkg/gce-cloud-provider/compute/gce.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,10 @@ type ConfigFile struct {
6363
}
6464

6565
type ConfigGlobal struct {
66+
LocalZone string `gcfg:"local-zone"`
67+
ProjectId string `gcfg:"project-id"`
6668
TokenURL string `gcfg:"token-url"`
6769
TokenBody string `gcfg:"token-body"`
68-
ProjectId string `gcfg:"project-id"`
6970
}
7071

7172
func CreateCloudProvider(vendorVersion string, configPath string) (*CloudProvider, error) {
@@ -184,9 +185,16 @@ func newOauthClient(tokenSource oauth2.TokenSource) (*http.Client, error) {
184185
func getProjectAndZone(config *ConfigFile) (string, string, error) {
185186
var err error
186187

187-
zone, err := metadata.Zone()
188-
if err != nil {
189-
return "", "", err
188+
var zone string
189+
if config == nil || config.Global.LocalZone == "" {
190+
zone, err = metadata.Zone()
191+
if err != nil {
192+
return "", "", err
193+
}
194+
klog.V(2).Infof("Using GCP zone from the Metadata server: %q", zone)
195+
} else {
196+
zone = config.Global.LocalZone
197+
klog.V(2).Infof("Using GCP zone from the local GCE cloud provider config file: %q", zone)
190198
}
191199

192200
var projectID string

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

+18-5
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,15 @@ 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(
49+
cloudProvider gce.GCECompute,
50+
mounter *mount.SafeFormatAndMount,
51+
deviceUtils mountmanager.DeviceUtils,
52+
meta metadataservice.MetadataService,
53+
statter mountmanager.Statter,
54+
name, vendorVersion string,
55+
runControllerService, runIdentityService, runNodeService bool,
56+
) error {
5057
if name == "" {
5158
return fmt.Errorf("Driver name missing")
5259
}
@@ -79,9 +86,15 @@ func (gceDriver *GCEDriver) SetupGCEDriver(cloudProvider gce.GCECompute, mounter
7986
gceDriver.AddNodeServiceCapabilities(ns)
8087

8188
// Set up RPC Servers
82-
gceDriver.ids = NewIdentityServer(gceDriver)
83-
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
84-
gceDriver.cs = NewControllerServer(gceDriver, cloudProvider, meta)
89+
if runControllerService {
90+
gceDriver.cs = NewControllerServer(gceDriver, cloudProvider, meta)
91+
}
92+
if runIdentityService {
93+
gceDriver.ids = NewIdentityServer(gceDriver)
94+
}
95+
if runNodeService {
96+
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
97+
}
8598

8699
return nil
87100
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func initBlockingGCEDriver(t *testing.T, cloudDisks []*gce.CloudDisk, readyToExe
4444
func initGCEDriverWithCloudProvider(t *testing.T, cloudProvider gce.GCECompute) *GCEDriver {
4545
vendorVersion := "test-vendor"
4646
gceDriver := GetGCEDriver()
47-
err := gceDriver.SetupGCEDriver(cloudProvider, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion)
47+
err := gceDriver.SetupGCEDriver(cloudProvider, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion, true, true, true)
4848
if err != nil {
4949
t.Fatalf("Failed to setup GCE Driver: %v", err)
5050
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
func TestGetPluginInfo(t *testing.T) {
2727
vendorVersion := "test-vendor"
2828
gceDriver := GetGCEDriver()
29-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion)
29+
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, vendorVersion, true, true, true)
3030
if err != nil {
3131
t.Fatalf("Failed to setup GCE Driver: %v", err)
3232
}
@@ -48,7 +48,7 @@ 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+
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor", true, true, true)
5252
if err != nil {
5353
t.Fatalf("Failed to setup GCE Driver: %v", err)
5454
}
@@ -80,7 +80,7 @@ func TestGetPluginCapabilities(t *testing.T) {
8080

8181
func TestProbe(t *testing.T) {
8282
gceDriver := GetGCEDriver()
83-
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor")
83+
err := gceDriver.SetupGCEDriver(nil, nil, nil, metadataservice.NewFakeService(), nil, driver, "test-vendor", true, true, true)
8484
if err != nil {
8585
t.Fatalf("Failed to setup GCE Driver: %v", err)
8686
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ 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+
err := gceDriver.SetupGCEDriver(nil, mounter, deviceUtils, metaService, mountmanager.NewFakeStatter(), driver, "test-vendor", true, true, true)
4646
if err != nil {
4747
t.Fatalf("Failed to setup GCE Driver: %v", err)
4848
}
@@ -51,7 +51,7 @@ func getCustomTestGCEDriver(t *testing.T, mounter *mount.SafeFormatAndMount, dev
5151

5252
func getTestBlockingGCEDriver(t *testing.T, readyToExecute chan chan struct{}) *GCEDriver {
5353
gceDriver := GetGCEDriver()
54-
err := gceDriver.SetupGCEDriver(nil, mountmanager.NewFakeSafeBlockingMounter(readyToExecute), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), nil, driver, "test-vendor")
54+
err := gceDriver.SetupGCEDriver(nil, mountmanager.NewFakeSafeBlockingMounter(readyToExecute), mountmanager.NewFakeDeviceUtils(), metadataservice.NewFakeService(), nil, driver, "test-vendor", true, true, true)
5555
if err != nil {
5656
t.Fatalf("Failed to setup GCE Driver: %v", err)
5757
}

test/sanity/sanity_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ 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+
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, metadataservice.NewFakeService(), mountmanager.NewFakeStatter(), driverName, vendorVersion, true, true, true)
5858
if err != nil {
5959
t.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
6060
}

0 commit comments

Comments
 (0)