Skip to content

Commit 0660d8a

Browse files
committed
Allow running the controller service separately
1 parent cee93c2 commit 0660d8a

File tree

9 files changed

+59
-27
lines changed

9 files changed

+59
-27
lines changed

cmd/main.go

+14-10
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,10 @@ 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+
runAsController = flag.Bool("run-as-controller", false, "If set to true then the CSI driver runs the controller only and does not start the node service.")
39+
vendorVersion string
3940
)
4041

4142
const (
@@ -66,22 +67,25 @@ func handle() {
6667

6768
gceDriver := driver.GetGCEDriver()
6869

69-
//Initialize GCE Driver (Move setup to main?)
70-
cloudProvider, err := gce.CreateCloudProvider(vendorVersion, *gceConfigFilePath)
70+
// Initialize GCE Driver (Move setup to main?)
71+
cloudProvider, err := gce.CreateCloudProvider(vendorVersion, *cloudConfigFilePath)
7172
if err != nil {
7273
klog.Fatalf("Failed to get cloud provider: %v", err)
7374
}
7475

7576
mounter := mountmanager.NewSafeMounter()
7677
deviceUtils := mountmanager.NewDeviceUtils()
7778
statter := mountmanager.NewStatter()
78-
ms, err := metadataservice.NewMetadataService()
79-
if err != nil {
80-
klog.Fatalf("Failed to set up metadata service: %v", err)
79+
80+
var ms metadataservice.MetadataService
81+
if !*runAsController {
82+
ms, err = metadataservice.NewMetadataService()
83+
if err != nil {
84+
klog.Fatalf("Failed to set up metadata service: %v", err)
85+
}
8186
}
8287

83-
err = gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, statter, driverName, vendorVersion)
84-
if err != nil {
88+
if err := gceDriver.SetupGCEDriver(cloudProvider, mounter, deviceUtils, ms, statter, driverName, vendorVersion, *runAsController); err != nil {
8589
klog.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
8690
}
8791

deploy/kubernetes/base/controller.yaml

+2-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,7 @@ spec:
2727
- "--v=5"
2828
- "--csi-address=/csi/csi.sock"
2929
- "--feature-gates=Topology=true"
30+
# - "--run-as-controller=true" # only run the controller service of the driver
3031
volumeMounts:
3132
- name: socket-dir
3233
mountPath: /csi

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

+10-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,13 @@ $ ./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+
## Running the controller separately
26+
27+
Traditionally, you run the CSI controllers with the GCE PD driver in the same Kubernetes cluster.
28+
Though, in some scenarios you might want to run the CSI controllers (csi-provisioner, csi-attacher, etc.) together with the GCE PD controller service of this driver separately from the Kubernetes cluster it serves (while the GCE PD driver with an activated node service still runs inside the cluster).
29+
Also, this may not necessarily have to be an GCE compute instance.
30+
To support these cases, the GCE PD CSI driver plugin supports the following command line flag:
31+
32+
* `--run-as-controller=true` which allows you to only start the controller service (and not the node service) of the GCE PD driver.

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

+14-4
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+
runAsController bool,
56+
) error {
5057
if name == "" {
5158
return fmt.Errorf("Driver name missing")
5259
}
@@ -79,9 +86,12 @@ 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)
8489
gceDriver.cs = NewControllerServer(gceDriver, cloudProvider, meta)
90+
gceDriver.ids = NewIdentityServer(gceDriver)
91+
92+
if !runAsController {
93+
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
94+
}
8595

8696
return nil
8797
}

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, false)
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, false)
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", false)
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", false)
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", false)
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", false)
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, false)
5858
if err != nil {
5959
t.Fatalf("Failed to initialize GCE CSI Driver: %v", err)
6060
}

0 commit comments

Comments
 (0)