diff --git a/pkg/util/fieldindex/register.go b/pkg/util/fieldindex/register.go index 52bf7c9f84..ac292afb66 100644 --- a/pkg/util/fieldindex/register.go +++ b/pkg/util/fieldindex/register.go @@ -20,21 +20,24 @@ import ( "context" "sync" - "sigs.k8s.io/controller-runtime/pkg/client" - appsv1alpha1 "github.com/openkruise/kruise/apis/apps/v1alpha1" utildiscovery "github.com/openkruise/kruise/pkg/util/discovery" + batchv1 "k8s.io/api/batch/v1" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" ) const ( - IndexNameForPodNodeName = "spec.nodeName" - IndexNameForOwnerRefUID = "ownerRefUID" - IndexNameForController = ".metadata.controller" - IndexNameForIsActive = "isActive" + IndexNameForPodNodeName = "spec.nodeName" + IndexNameForOwnerRefUID = "ownerRefUID" + IndexNameForController = ".metadata.controller" + IndexNameForIsActive = "isActive" + IndexNameForSidecarSetNamespace = "namespace" + IndexValueSidecarSetClusterScope = "ClusterScope" + LabelMetadataName = "kubernetes.io/metadata.name" ) var ( @@ -87,6 +90,12 @@ func RegisterFieldIndexes(c cache.Cache) error { return } } + // sidecar spec namespaces + if utildiscovery.DiscoverObject(&appsv1alpha1.SidecarSet{}) { + if err = indexSideCarSet(c); err != nil { + return + } + } }) return err } @@ -152,3 +161,32 @@ func indexImagePullJobActive(c cache.Cache) error { return []string{isActive} }) } + +func IndexSideCarSet(rawObj client.Object) []string { + obj := rawObj.(*appsv1alpha1.SidecarSet) + if obj == nil { + return nil + } + if obj.Spec.Namespace != "" { + return []string{obj.Spec.Namespace} + } + if obj.Spec.NamespaceSelector != nil { + if obj.Spec.NamespaceSelector.MatchLabels != nil { + if v, ok := obj.Spec.NamespaceSelector.MatchLabels[LabelMetadataName]; ok { + return []string{v} + } + } + for _, item := range obj.Spec.NamespaceSelector.MatchExpressions { + if item.Key == LabelMetadataName && item.Operator == metav1.LabelSelectorOpIn { + return item.Values + } + } + } + return []string{IndexValueSidecarSetClusterScope} +} + +func indexSideCarSet(c cache.Cache) error { + return c.IndexField(context.TODO(), &appsv1alpha1.SidecarSet{}, IndexNameForSidecarSetNamespace, func(rawObj client.Object) []string { + return IndexSideCarSet(rawObj) + }) +} diff --git a/pkg/webhook/pod/mutating/sidecarset.go b/pkg/webhook/pod/mutating/sidecarset.go index 2d0a1a3dd0..0043577d84 100644 --- a/pkg/webhook/pod/mutating/sidecarset.go +++ b/pkg/webhook/pod/mutating/sidecarset.go @@ -23,6 +23,8 @@ import ( "sort" "strings" + "github.com/openkruise/kruise/pkg/util/fieldindex" + appsv1alpha1 "github.com/openkruise/kruise/apis/apps/v1alpha1" "github.com/openkruise/kruise/pkg/control/sidecarcontrol" "github.com/openkruise/kruise/pkg/util" @@ -35,6 +37,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" ) @@ -64,13 +67,21 @@ func (h *PodCreateHandler) sidecarsetMutatingPod(ctx context.Context, req admiss } // DisableDeepCopy:true, indicates must be deep copy before update sidecarSet objection + sidecarsetList := &appsv1alpha1.SidecarSetList{} - if err = h.Client.List(ctx, sidecarsetList, utilclient.DisableDeepCopy); err != nil { + sidecarsetList2 := &appsv1alpha1.SidecarSetList{} + podNamespace := pod.Namespace + if podNamespace == "" { + podNamespace = "default" + } + if err := h.Client.List(ctx, sidecarsetList, client.MatchingFields{fieldindex.IndexNameForSidecarSetNamespace: podNamespace}, utilclient.DisableDeepCopy); err != nil { + return false, err + } + if err := h.Client.List(ctx, sidecarsetList2, client.MatchingFields{fieldindex.IndexNameForSidecarSetNamespace: fieldindex.IndexValueSidecarSetClusterScope}, utilclient.DisableDeepCopy); err != nil { return false, err } - matchedSidecarSets := make([]sidecarcontrol.SidecarControl, 0) - for _, sidecarSet := range sidecarsetList.Items { + for _, sidecarSet := range append(sidecarsetList.Items, sidecarsetList2.Items...) { if sidecarSet.Spec.InjectionStrategy.Paused { continue } diff --git a/pkg/webhook/pod/mutating/sidecarset_test.go b/pkg/webhook/pod/mutating/sidecarset_test.go index 0326f40112..4a7b3ae2d8 100644 --- a/pkg/webhook/pod/mutating/sidecarset_test.go +++ b/pkg/webhook/pod/mutating/sidecarset_test.go @@ -24,6 +24,8 @@ import ( "path/filepath" "testing" + "github.com/openkruise/kruise/pkg/util/fieldindex" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "github.com/openkruise/kruise/apis" @@ -525,7 +527,10 @@ func TestInjectMetadata(t *testing.T) { }, } decoder, _ := admission.NewDecoder(scheme.Scheme) - client := fake.NewClientBuilder().WithObjects(demo1, demo2).Build() + client := fake.NewClientBuilder().WithObjects(demo1, demo2).WithIndex( + &appsv1alpha1.SidecarSet{}, fieldindex.IndexNameForSidecarSetNamespace, fieldindex.IndexSideCarSet, + ).Build() + podHandler := &PodCreateHandler{Decoder: decoder, Client: client} req := newAdmission(admissionv1.Create, runtime.RawExtension{}, runtime.RawExtension{}, "") podHandler.sidecarsetMutatingPod(context.Background(), req, podIn)