Skip to content

Commit df6fe81

Browse files
authored
Merge pull request #805 from ttakahashi21/KEP-3294
Alpha support for provision volumes from cross-namespace data sources
2 parents 3bfb915 + bbb2698 commit df6fe81

File tree

108 files changed

+18173
-355
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

108 files changed

+18173
-355
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ Following table reflects the head of this branch.
2727
| ReadWriteOncePod | Alpha | Off | [Single pod access mode for PersistentVolumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes). | No |
2828
| HonorPVReclaimPolicy| Alpha |Off | [Honor the PV reclaim policy](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/2644-honor-pv-reclaim-policy) | No |
2929
| PreventVolumeModeConversion | Alpha |Off | [Prevent unauthorized conversion of source volume mode](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3141-prevent-volume-mode-conversion) | `--prevent-volume-mode-conversion` (No in-tree feature gate) |
30-
| CSINodeExpandSecret | Alpha |Off | [CSI Node expansion secret](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3107-csi-nodeexpandsecret) | No
30+
| CSINodeExpandSecret | Alpha |Off | [CSI Node expansion secret](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3107-csi-nodeexpandsecret) | No |
31+
| CrossNamespaceVolumeDataSource | Alpha |Off | [Cross-namespace volume data source](https://github.com/kubernetes/enhancements/tree/master/keps/sig-storage/3294-provision-volumes-from-cross-namespace-snapshots) | `--feature-gates=CrossNamespaceVolumeDataSource=true` |
3132

3233
All other external-provisioner features and the external-provisioner itself is considered GA and fully supported.
3334

cmd/csi-provisioner/csi-provisioner.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ import (
6464
"github.com/kubernetes-csi/external-provisioner/pkg/features"
6565
"github.com/kubernetes-csi/external-provisioner/pkg/owner"
6666
snapclientset "github.com/kubernetes-csi/external-snapshotter/client/v6/clientset/versioned"
67+
gatewayclientset "sigs.k8s.io/gateway-api/pkg/client/clientset/versioned"
68+
gatewayInformers "sigs.k8s.io/gateway-api/pkg/client/informers/externalversions"
69+
referenceGrantv1beta1 "sigs.k8s.io/gateway-api/pkg/client/listers/apis/v1beta1"
6770
)
6871

6972
var (
@@ -192,6 +195,15 @@ func main() {
192195
klog.Fatalf("Failed to create snapshot client: %v", err)
193196
}
194197

198+
var gatewayClient gatewayclientset.Interface
199+
if utilfeature.DefaultFeatureGate.Enabled(features.CrossNamespaceVolumeDataSource) {
200+
// gatewayclientset.NewForConfig creates a new Clientset for GatewayClient
201+
gatewayClient, err = gatewayclientset.NewForConfig(config)
202+
if err != nil {
203+
klog.Fatalf("Failed to create gateway client: %v", err)
204+
}
205+
}
206+
195207
metricsManager := metrics.NewCSIMetricsManagerWithOptions("", /* driverName */
196208
// Will be provided via default gatherer.
197209
metrics.WithProcessStartTime(false),
@@ -354,6 +366,14 @@ func main() {
354366
}
355367
}
356368

369+
var referenceGrantLister referenceGrantv1beta1.ReferenceGrantLister
370+
var gatewayFactory gatewayInformers.SharedInformerFactory
371+
if utilfeature.DefaultFeatureGate.Enabled(features.CrossNamespaceVolumeDataSource) {
372+
gatewayFactory = gatewayInformers.NewSharedInformerFactory(gatewayClient, ctrl.ResyncPeriodOfReferenceGrantInformer)
373+
referenceGrants := gatewayFactory.Gateway().V1beta1().ReferenceGrants()
374+
referenceGrantLister = referenceGrants.Lister()
375+
}
376+
357377
// -------------------------------
358378
// PersistentVolumeClaims informer
359379
rateLimiter := workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax)
@@ -402,6 +422,7 @@ func main() {
402422
nodeLister,
403423
claimLister,
404424
vaLister,
425+
referenceGrantLister,
405426
*extraCreateMetadata,
406427
*defaultFSType,
407428
nodeDeployment,
@@ -604,6 +625,18 @@ func main() {
604625
}
605626
}
606627

628+
if utilfeature.DefaultFeatureGate.Enabled(features.CrossNamespaceVolumeDataSource) {
629+
if gatewayFactory != nil {
630+
gatewayFactory.Start(ctx.Done())
631+
}
632+
gatewayCacheSyncResult := gatewayFactory.WaitForCacheSync(ctx.Done())
633+
for _, v := range gatewayCacheSyncResult {
634+
if !v {
635+
klog.Fatalf("Failed to sync Informers for gateway!")
636+
}
637+
}
638+
}
639+
607640
if capacityController != nil {
608641
go capacityController.Run(ctx, int(*capacityThreads))
609642
}

deploy/kubernetes/rbac.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ rules:
5757
- apiGroups: ["storage.k8s.io"]
5858
resources: ["volumeattachments"]
5959
verbs: ["get", "list", "watch"]
60+
# (Alpha) Access to referencegrants is only needed when the CSI driver
61+
# has the CrossNamespaceVolumeDataSource controller capability.
62+
# In that case, external-provisioner requires "get", "list", "watch"
63+
# permissions for "referencegrants" on "gateway.networking.k8s.io".
64+
#- apiGroups: ["gateway.networking.k8s.io"]
65+
# resources: ["referencegrants"]
66+
# verbs: ["get", "list", "watch"]
6067

6168
---
6269
kind: ClusterRoleBinding

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ require (
2626
k8s.io/csi-translation-lib v0.26.0-rc.0
2727
k8s.io/klog/v2 v2.80.1
2828
sigs.k8s.io/controller-runtime v0.13.1
29+
sigs.k8s.io/gateway-api v0.6.0-rc1
2930
sigs.k8s.io/sig-storage-lib-external-provisioner/v8 v8.0.0
3031
)
3132

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,8 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
958958
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
959959
sigs.k8s.io/controller-runtime v0.13.1 h1:tUsRCSJVM1QQOOeViGeX3GMT3dQF1eePPw6sEE3xSlg=
960960
sigs.k8s.io/controller-runtime v0.13.1/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
961+
sigs.k8s.io/gateway-api v0.6.0-rc1 h1:ierhK6SIK8pSibB+gkr+aG8cWLez/M7iD9dQIqLALxU=
962+
sigs.k8s.io/gateway-api v0.6.0-rc1/go.mod h1:+3QMzP775JFKArHqiwk/kzItMRXW9CKPXcO8QcuXvvk=
961963
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
962964
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
963965
sigs.k8s.io/sig-storage-lib-external-provisioner/v8 v8.0.0 h1:vQUoaDxbberC3UwvE+zauyOMkpWlleaVgc75LoDOyy4=

0 commit comments

Comments
 (0)