Skip to content

Commit 55e14b8

Browse files
committed
Allow running the controller service separately
1 parent 58e28ac commit 55e14b8

File tree

5 files changed

+52
-20
lines changed

5 files changed

+52
-20
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 == nil || !*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 == nil || !*runAsController {
93+
gceDriver.ns = NewNodeServer(gceDriver, mounter, deviceUtils, meta, statter)
94+
}
8595

8696
return nil
8797
}

0 commit comments

Comments
 (0)