Skip to content

Commit

Permalink
feature: Optimizing Pod SidecarSet webhook performance
Browse files Browse the repository at this point in the history
Signed-off-by: acejilam <[email protected]>
  • Loading branch information
ls-2018 committed Apr 2, 2024
1 parent 1f00e6b commit 0b4c563
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 10 deletions.
50 changes: 44 additions & 6 deletions pkg/util/fieldindex/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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)
})
}
17 changes: 14 additions & 3 deletions pkg/webhook/pod/mutating/sidecarset.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
)

Expand Down Expand Up @@ -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
}
Expand Down
7 changes: 6 additions & 1 deletion pkg/webhook/pod/mutating/sidecarset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 0b4c563

Please sign in to comment.