Skip to content

Commit 7f21cd3

Browse files
authored
Merge pull request #462 from tam7t/tam7t/reload-clients
feat: connect to plugins at runtime instead of configuration
2 parents c18349b + 0c796e8 commit 7f21cd3

File tree

17 files changed

+319
-198
lines changed

17 files changed

+319
-198
lines changed

Makefile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ ifdef TEST_WINDOWS
282282
--set windows.image.tag=$(IMAGE_VERSION) \
283283
--set windows.enabled=true \
284284
--set linux.enabled=false \
285-
--set grpcSupportedProviders=azure \
286285
--set enableSecretRotation=true \
287286
--set rotationPollInterval=30s
288287
else
@@ -291,7 +290,6 @@ else
291290
--set linux.image.repository=$(REGISTRY)/$(IMAGE_NAME) \
292291
--set linux.image.tag=$(IMAGE_VERSION) \
293292
--set linux.image.pullPolicy="IfNotPresent" \
294-
--set grpcSupportedProviders="azure;gcp;vault" \
295293
--set enableSecretRotation=true \
296294
--set rotationPollInterval=30s
297295
endif

cmd/secrets-store-csi-driver/main.go

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"fmt"
2323
"net/http"
2424
_ "net/http/pprof" // #nosec
25-
"strings"
2625
"time"
2726

2827
"sigs.k8s.io/secrets-store-csi-driver/pkg/cache"
@@ -53,14 +52,12 @@ var (
5352
logFormatJSON = flag.Bool("log-format-json", false, "set log formatter to json")
5453
providerVolumePath = flag.String("provider-volume", "/etc/kubernetes/secrets-store-csi-providers", "Volume path for provider")
5554
// this will be removed in a future release
56-
metricsAddr = flag.String("metrics-addr", ":8095", "The address the metric endpoint binds to")
57-
// grpcSupportedProviders is a ; separated string that can contain a list of providers. The reason it's a string is to allow scenarios
58-
// where the driver is being used with 2 providers, one which supports grpc and other using binary for provider.
59-
grpcSupportedProviders = flag.String("grpc-supported-providers", "", "set list of providers that support grpc for driver-provider [alpha]")
60-
enableSecretRotation = flag.Bool("enable-secret-rotation", false, "Enable secret rotation feature [alpha]")
61-
rotationPollInterval = flag.Duration("rotation-poll-interval", 2*time.Minute, "Secret rotation poll interval duration")
62-
enableProfile = flag.Bool("enable-pprof", false, "enable pprof profiling")
63-
profilePort = flag.Int("pprof-port", 6065, "port for pprof profiling")
55+
metricsAddr = flag.String("metrics-addr", ":8095", "The address the metric endpoint binds to")
56+
_ = flag.String("grpc-supported-providers", "", "[DEPRECATED] set list of providers that support grpc for driver-provider [alpha]")
57+
enableSecretRotation = flag.Bool("enable-secret-rotation", false, "Enable secret rotation feature [alpha]")
58+
rotationPollInterval = flag.Duration("rotation-poll-interval", 2*time.Minute, "Secret rotation poll interval duration")
59+
enableProfile = flag.Bool("enable-pprof", false, "enable pprof profiling")
60+
profilePort = flag.Int("pprof-port", 6065, "port for pprof profiling")
6461

6562
// enable filtered watch for NodePublishSecretRef secrets. The filtering is done on the csi driver label: secrets-store.csi.k8s.io/used=true
6663
// For Kubernetes secrets used to provide credentials for use with the CSI driver, set the label by running: kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
@@ -147,24 +144,8 @@ func main() {
147144
ctx := withShutdownSignal(context.Background())
148145

149146
// create provider clients
150-
providerClients := make(map[string]*secretsstore.CSIProviderClient)
151-
for _, provider := range strings.Split(*grpcSupportedProviders, ";") {
152-
p := strings.TrimSpace(provider)
153-
if len(p) != 0 {
154-
// dialing clients is non-blocking and will be retried on errors
155-
providerClients[provider], err = secretsstore.NewProviderClient(secretsstore.CSIProviderName(p), *providerVolumePath)
156-
if err != nil {
157-
klog.Fatalf("failed to create provider client, err: %+v", err)
158-
}
159-
}
160-
}
161-
defer func() {
162-
for k, v := range providerClients {
163-
if err := v.Close(); err != nil {
164-
klog.ErrorS(err, "closing grpc client failed", "provider", k)
165-
}
166-
}
167-
}()
147+
providerClients := secretsstore.NewPluginClientBuilder(*providerVolumePath)
148+
defer providerClients.Cleanup()
168149

169150
go func() {
170151
klog.Infof("starting manager")

docs/book/src/providers.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ This document highlights the implementation steps for adding a secrets-store-csi
2222

2323
### Implementation details
2424

25-
The driver as of `v0.0.14` adds an option to use gRPC to communicate with the provider. This is an alpha feature and is introduced with a feature flag `--grpc-supported-providers`. The `--grpc-supported-providers` is a `;` delimited list of all providers that support gRPC for communication. The driver will communicate with the provider using gRPC only if the provider name is in the list of supported providers in `--grpc-supported-providers`.
25+
The driver as of `v0.0.14` adds an option to use gRPC to communicate with the provider. This is an alpha feature and is introduced with a feature flag `--grpc-supported-providers`. The `--grpc-supported-providers` is a `;` delimited list of all providers that support gRPC for communication. This flag will not be necessary after `v0.0.21` since this is the only supported communication mechanism.
2626

2727
> Example usage: `--grpc-supported-providers=provider1;provider2`
2828
@@ -33,6 +33,7 @@ To implement a secrets-store-csi-driver provider, you can develop a new provider
3333
- [fake server example](https://github.com/kubernetes-sigs/secrets-store-csi-driver/blob/master/provider/fake/fake_server.go)
3434
- Provider runs as a *daemonset* and is deployed on the same host(s) as the secrets-store-csi-driver pods
3535
- Provider Unix Domain Socket volume path. The default volume path for providers is [/etc/kubernetes/secrets-store-csi-driver-providers](https://github.com/kubernetes-sigs/secrets-store-csi-driver/blob/v0.0.14/deploy/secrets-store-csi-driver.yaml#L88-L89). Add the Unix Domain Socket to the dir in the format `/etc/kubernetes/secrets-store-csi-driver-providers/<provider name>.sock`
36+
- The `<provider name>` in `<provider name>.sock` must match the regular expression `^[a-zA-Z0-9_-]{0,30}$`
3637
- Provider mounts `<kubelet root dir>/pods` (default: [`/var/lib/kubelet/pods`](https://github.com/kubernetes-sigs/secrets-store-csi-driver/blob/v0.0.14/deploy/secrets-store-csi-driver.yaml#L86-L87)) with [`HostToContainer` mount propagation](https://kubernetes-csi.github.io/docs/deploying.html#driver-volume-mounts) to be able to write the external secrets store content to the volume target path
3738

3839
See [design doc](https://docs.google.com/document/d/10-RHUJGM0oMN88AZNxjOmGz0NsWAvOYrWUEV-FbLWyw/edit?usp=sharing) for more details.

manifest_staging/charts/secrets-store-csi-driver/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,5 @@ The following table lists the configurable parameters of the csi-secrets-store-p
8080
| `rbac.install` | Install default rbac roles and bindings | true |
8181
| `syncSecret.enabled` | Enable rbac roles and bindings required for syncing to Kubernetes native secrets (the default will change to false after v0.0.14) | true |
8282
| `minimumProviderVersions` | [**DEPRECATED**] A comma delimited list of key-value pairs of minimum provider versions with driver | `""` |
83-
| `grpcSupportedProviders` | A `;` delimited list of providers that support grpc for driver-provider | `"gcp;azure;vault;"` |
8483
| `enableSecretRotation` | Enable secret rotation feature [alpha] | `false` |
8584
| `rotationPollInterval` | Secret rotation poll interval duration | `"120s"` |

manifest_staging/charts/secrets-store-csi-driver/templates/secrets-store-csi-driver-windows.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ spec:
6666
{{- if and (semverCompare ">= v0.0.9-0" .Values.windows.image.tag) .Values.minimumProviderVersions }}
6767
- "--min-provider-version={{ .Values.minimumProviderVersions }}"
6868
{{- end }}
69-
{{- if and (semverCompare ">= v0.0.14-0" .Values.windows.image.tag) .Values.grpcSupportedProviders }}
70-
- "--grpc-supported-providers={{ .Values.grpcSupportedProviders }}"
71-
{{- end }}
7269
{{- if and (semverCompare ">= v0.0.15-0" .Values.windows.image.tag) .Values.enableSecretRotation }}
7370
- "--enable-secret-rotation={{ .Values.enableSecretRotation }}"
7471
{{- end }}

manifest_staging/charts/secrets-store-csi-driver/templates/secrets-store-csi-driver.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ spec:
6666
{{- if and (semverCompare ">= v0.0.8-0" .Values.linux.image.tag) .Values.minimumProviderVersions }}
6767
- "--min-provider-version={{ .Values.minimumProviderVersions }}"
6868
{{- end }}
69-
{{- if and (semverCompare ">= v0.0.14-0" .Values.linux.image.tag) .Values.grpcSupportedProviders }}
70-
- "--grpc-supported-providers={{ .Values.grpcSupportedProviders }}"
71-
{{- end }}
7269
{{- if and (semverCompare ">= v0.0.15-0" .Values.linux.image.tag) .Values.enableSecretRotation }}
7370
- "--enable-secret-rotation={{ .Values.enableSecretRotation }}"
7471
{{- end }}

manifest_staging/charts/secrets-store-csi-driver/values.yaml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,6 @@ syncSecret:
144144
## e.g. provider1=0.0.2,provider2=0.0.3
145145
minimumProviderVersions:
146146

147-
## ; delimited list of providers that support grpc for driver-provider [alpha]
148-
grpcSupportedProviders: gcp;azure;vault;
149-
150147
## Enable secret rotation feature [alpha]
151148
enableSecretRotation: false
152149

manifest_staging/deploy/secrets-store-csi-driver-windows.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ spec:
4848
- "--nodeid=$(KUBE_NODE_NAME)"
4949
- "--provider-volume=C:\\k\\secrets-store-csi-providers"
5050
- "--metrics-addr=:8095"
51-
- "--grpc-supported-providers=azure;"
5251
- "--enable-secret-rotation=false"
5352
- "--rotation-poll-interval=2m"
5453
env:

manifest_staging/deploy/secrets-store-csi-driver.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ spec:
4848
- "--nodeid=$(KUBE_NODE_NAME)"
4949
- "--provider-volume=/etc/kubernetes/secrets-store-csi-providers"
5050
- "--metrics-addr=:8095"
51-
- "--grpc-supported-providers=gcp;azure;vault;"
5251
- "--enable-secret-rotation=false"
5352
- "--rotation-poll-interval=2m"
5453
env:

pkg/rotation/reconciler.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ type Reconciler struct {
7676
providerVolumePath string
7777
scheme *runtime.Scheme
7878
rotationPollInterval time.Duration
79-
providerClients map[string]*secretsstore.CSIProviderClient
79+
providerClients *secretsstore.PluginClientBuilder
8080
queue workqueue.RateLimitingInterface
8181
reporter StatsReporter
8282
eventRecorder record.EventRecorder
@@ -85,7 +85,7 @@ type Reconciler struct {
8585
}
8686

8787
// NewReconciler returns a new reconciler for rotation
88-
func NewReconciler(s *runtime.Scheme, providerVolumePath, nodeName string, rotationPollInterval time.Duration, providerClients map[string]*secretsstore.CSIProviderClient, filteredWatchSecret bool) (*Reconciler, error) {
88+
func NewReconciler(s *runtime.Scheme, providerVolumePath, nodeName string, rotationPollInterval time.Duration, providerClients *secretsstore.PluginClientBuilder, filteredWatchSecret bool) (*Reconciler, error) {
8989
config, err := buildConfig()
9090
if err != nil {
9191
return nil, err
@@ -273,13 +273,13 @@ func (r *Reconciler) reconcile(ctx context.Context, spcps *v1alpha1.SecretProvid
273273
}
274274

275275
providerName = string(spc.Spec.Provider)
276-
providerClient, exists := r.providerClients[providerName]
277-
if !exists {
276+
providerClient, err := r.providerClients.Get(ctx, providerName)
277+
if err != nil {
278278
errorReason = internalerrors.FailedToLookupProviderGRPCClient
279279
r.generateEvent(pod, v1.EventTypeWarning, mountRotationFailedReason, fmt.Sprintf("failed to lookup provider client: %q", providerName))
280280
return fmt.Errorf("failed to lookup provider client: %q", providerName)
281281
}
282-
newObjectVersions, errorReason, err := providerClient.MountContent(ctx, string(paramsJSON), string(secretsJSON), spcps.Status.TargetPath, string(permissionJSON), oldObjectVersions)
282+
newObjectVersions, errorReason, err := secretsstore.MountContent(ctx, providerClient, string(paramsJSON), string(secretsJSON), spcps.Status.TargetPath, string(permissionJSON), oldObjectVersions)
283283
if err != nil {
284284
r.generateEvent(pod, v1.EventTypeWarning, mountRotationFailedReason, fmt.Sprintf("provider mount err: %+v", err))
285285
return fmt.Errorf("failed to rotate objects for pod %s/%s, err: %+v", spcps.Namespace, spcps.Status.PodName, err)

0 commit comments

Comments
 (0)