Repository: kubernetes/kubernetes (language: go)

Issue:
When expanding CSI PVC, Kubernetes mistakenly outputted a warning-level event
### What happened?

```
➜  / kubectl describe pvc pvc1
Name:          pvc1
Namespace:     default
StorageClass:  sc1
Status:        Bound
Volume:        pvc-89a59cdf-c8a0-4b66-b18a-55e08bbf3ba7
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
               volume.beta.kubernetes.io/storage-provisioner: iscsi.csi.xsky.com
               volume.kubernetes.io/storage-provisioner: iscsi.csi.xsky.com
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      40Gi
Access Modes:  RWO
VolumeMode:    Block
Used By:       <none>
Events:
  Type     Reason                  Age                   From                                 Message
  ----     ------                  ----                  ----                                 -------
  Normal   Resizing                59m (x10 over 4h58m)  external-resizer iscsi.csi.xsky.com  External resizer is resizing volume pvc-89a59cdf-c8a0-4b66-b18a-55e08bbf3ba7
  Warning  ExternalExpanding       59m (x3 over 3h33m)   volume_expand                        waiting for an external controller to expand this PVC
  Normal   VolumeResizeSuccessful  59m (x10 over 4h58m)  external-resizer iscsi.csi.xsky.com  Resize volume succeeded
```

In the events , the PVC has been successfully resized, but a **warning-level** log is still printed.
And by checking the logs of kube-controller-manager, can see the following output.

```
I0715 18:02:04.836426       1 plugins.go:947] "FindExpandablePluginBySpec -> err" specName="pvc-89a59cdf-c8a0-4b66-b18a-55e08bbf3ba7" err="no volume plugin matched"
I0715 18:02:04.836448       1 expand_controller.go:290] "Waiting for an external controller to expand the PVC" pvcKey="default/pvc1" pvcUID=89a59cdf-c8a0-4b66-b18a-55e08bbf3ba7
I0715 18:02:04.836631       1 event.go:307] "Event occurred" object="default/pvc1" fieldPath="" kind="PersistentVolumeClaim" apiVersion="v1" type="Warning" reason="ExternalExpanding" message="waiting for an external controller to expand this PVC"
```

### What did you expect to happen?

Do not print events with warning level.

### How can we reproduce it (as minimally and precisely as possible)?

To expand a a CSI PVC, and then use "kubectl describe pvc" to view its events.
(I am using xsky CSI to expand pvc, but based on my understanding of Kubernetes code, this issue can occur with any CSI.)


### Anything else we need to know?

![image](https://github.com/kubernetes/kubernetes/assets/120258063/924129e2-4b5d-48a5-bea7-602c7b4bfdae)
![image](https://github.com/kubernetes/kubernetes/assets/120258063/ed4c24d1-53bb-462d-a708-3a1198dc4b5d)

Based on Kubernetes v1.27.3, I added some logs in the func `FindPluginBySpec` located in `pkg/volume/plugins`. These logs printed all the plugins before expansion, and I noticed that kubernetes.io/csi was not among them.
In my understanding, it is normal for CSI to be absent from the plugins here because CSI expansion is scheduled through external-resizer instead of kube-controller-manager.
Therefore, there should not be any warning-level logs printed here either.

### Kubernetes version

v1.27.3 
(In version 1.18, the issue can also be reproduced)

### Cloud provider

<details>

</details>


### OS version

Linux debian-hk 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64 GNU/Linux

### Install tools

kind v0.20.0

### Container runtime (CRI) and version (if applicable)

<details>

</details>


### Related plugins (CNI, CSI, ...) and versions (if applicable)

<details>

</details>



Discussion / hints:
/sig storage 

We can change the ExternalExpanding event from Warning to Info.

@hkttty2009 are you interested in making this change?
/triage accepted
> We can change the ExternalExpanding event from Warning to Info.
> 
> @hkttty2009 are you interested in making this change?

Yes, I will submit the pull request in the next few days.

Fix patch:
diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go
index 4152bffb43b18..1e6c36f638d8d 100644
--- a/pkg/volume/plugins.go
+++ b/pkg/volume/plugins.go
@@ -17,6 +17,7 @@ limitations under the License.
 package volume
 
 import (
+	"errors"
 	"fmt"
 	"net"
 	"strings"
@@ -62,6 +63,8 @@ const (
 	ProbeRemove
 )
 
+var ErrNoPluiginMatched = errors.New("no volume plugin matched")
+
 // VolumeOptions contains option information about a volume.
 type VolumeOptions struct {
 	// The attributes below are required by volume.Provisioner
@@ -649,7 +652,7 @@ func (pm *VolumePluginMgr) FindPluginBySpec(spec *Spec) (VolumePlugin, error) {
 	}
 
 	if len(matchedPluginNames) == 0 {
-		return nil, fmt.Errorf("no volume plugin matched")
+		return nil, ErrNoPluiginMatched
 	}
 	if len(matchedPluginNames) > 1 {
 		return nil, fmt.Errorf("multiple volume plugins matched: %s", strings.Join(matchedPluginNames, ","))
@@ -876,6 +879,9 @@ func (pm *VolumePluginMgr) FindExpandablePluginBySpec(spec *Spec) (ExpandableVol
 			klog.V(4).InfoS("FindExpandablePluginBySpec -> returning noopExpandableVolumePluginInstance", "specName", spec.Name())
 			return &noopExpandableVolumePluginInstance{spec}, nil
 		}
+		if errors.Is(err, ErrNoPluiginMatched) {
+			return nil, nil
+		}
 		klog.V(4).InfoS("FindExpandablePluginBySpec -> err", "specName", spec.Name(), "err", err)
 		return nil, err
 	}


Test patch: