kubernetes-csi / external-provisioner

Sidecar container that watches Kubernetes PersistentVolumeClaim objects and triggers CreateVolume/DeleteVolume against a CSI endpoint
Apache License 2.0
328 stars 318 forks source link

Reduce CentralCapacityController workque depth by filtering allowed topologies in storage class #1162

Open yuxiang-he opened 4 months ago

yuxiang-he commented 4 months ago

Is your feature request related to a problem?/Why is this needed

See onSCAddOrUpdate implementation in https://github.com/kubernetes-csi/external-provisioner/blob/v4.0.0/pkg/capacity/capacity.go#L378-L384

    segments := c.topologyInformer.List()

    c.capacitiesLock.Lock()
    defer c.capacitiesLock.Unlock()
    for _, segment := range segments {
        c.addWorkItem(segment, sc)
    }

Currently the capacity controller creates a workqueue item for every segment x storageClass combination, some of which are impossible.

Describe the solution you'd like in detail

Storage classes can specify allowed topologies https://kubernetes.io/docs/concepts/storage/storage-classes/#allowed-topologies so not all combinations of segment x storageClass are valid here. An example would be certain types of storage (and hence storage class) are only available in selected topology segments.

We can reduce potential workqueue cardinality by filtering out impossible segment x storageClass combinations. This allows quicker CSIStorageCapacity object updates.

Describe alternatives you've considered

Additional context

yuxiang-he commented 4 months ago

This is another issue discovered while investigating https://github.com/kubernetes-csi/external-provisioner/issues/1161

pohly commented 4 months ago

This makes sense to me.

/triage accepted /help

k8s-ci-robot commented 4 months ago

@pohly: This request has been marked as needing help from a contributor.

Guidelines

Please ensure that the issue body includes answers to the following questions:

For more details on the requirements of such an issue, please see here and ensure that they are met.

If this request no longer meets these requirements, the label can be removed by commenting with the /remove-help command.

In response to [this](https://github.com/kubernetes-csi/external-provisioner/issues/1162): >This makes sense to me. > >/triage accepted >/help > Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md). If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.