@@ -20,7 +20,11 @@ import (
20
20
"context"
21
21
"fmt"
22
22
"io"
23
+ "sync"
23
24
25
+ "k8s.io/apiserver/pkg/cel/environment"
26
+ "k8s.io/apiserver/pkg/features"
27
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
24
28
"k8s.io/klog/v2"
25
29
26
30
admissionv1 "k8s.io/api/admission/v1"
@@ -38,14 +42,17 @@ import (
38
42
"k8s.io/apiserver/pkg/admission/plugin/webhook/predicates/object"
39
43
"k8s.io/apiserver/pkg/admission/plugin/webhook/predicates/rules"
40
44
"k8s.io/apiserver/pkg/authorization/authorizer"
41
- "k8s.io/apiserver/pkg/cel/environment"
42
- "k8s.io/apiserver/pkg/features"
43
- utilfeature "k8s.io/apiserver/pkg/util/feature"
44
45
webhookutil "k8s.io/apiserver/pkg/util/webhook"
45
46
"k8s.io/client-go/informers"
46
47
clientset "k8s.io/client-go/kubernetes"
47
48
)
48
49
50
+ var (
51
+ // filterCompiler is memory heavy, so we only want to create it once and share it.
52
+ filterCompilerOnce sync.Once
53
+ filterCompiler cel.FilterCompiler
54
+ )
55
+
49
56
// Webhook is an abstract admission plugin with all the infrastructure to define Admit or Validate on-top.
50
57
type Webhook struct {
51
58
* admission.Handler
@@ -57,7 +64,6 @@ type Webhook struct {
57
64
namespaceMatcher * namespace.Matcher
58
65
objectMatcher * object.Matcher
59
66
dispatcher Dispatcher
60
- filterCompiler cel.FilterCompiler
61
67
authorizer authorizer.Authorizer
62
68
}
63
69
@@ -95,14 +101,17 @@ func NewWebhook(handler *admission.Handler, configFile io.Reader, sourceFactory
95
101
cm .SetAuthenticationInfoResolver (authInfoResolver )
96
102
cm .SetServiceResolver (webhookutil .NewDefaultServiceResolver ())
97
103
104
+ filterCompilerOnce .Do (func () {
105
+ filterCompiler = cel .NewFilterCompiler (environment .MustBaseEnvSet (environment .DefaultCompatibilityVersion (), utilfeature .DefaultFeatureGate .Enabled (features .StrictCostEnforcementForWebhooks )))
106
+ })
107
+
98
108
return & Webhook {
99
109
Handler : handler ,
100
110
sourceFactory : sourceFactory ,
101
111
clientManager : & cm ,
102
112
namespaceMatcher : & namespace.Matcher {},
103
113
objectMatcher : & object.Matcher {},
104
114
dispatcher : dispatcherFactory (& cm ),
105
- filterCompiler : cel .NewFilterCompiler (environment .MustBaseEnvSet (environment .DefaultCompatibilityVersion (), utilfeature .DefaultFeatureGate .Enabled (features .StrictCostEnforcementForWebhooks ))),
106
115
}, nil
107
116
}
108
117
@@ -228,7 +237,7 @@ func (a *Webhook) ShouldCallHook(ctx context.Context, h webhook.WebhookAccessor,
228
237
return nil , apierrors .NewInternalError (err )
229
238
}
230
239
231
- matcher := h .GetCompiledMatcher (a . filterCompiler )
240
+ matcher := h .GetCompiledMatcher (filterCompiler )
232
241
matchResult := matcher .Match (ctx , versionedAttr , nil , a .authorizer )
233
242
234
243
if matchResult .Error != nil {
0 commit comments