mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-05 10:19:50 +00:00
[PodSecurity] Avoid the LegcayRegistry for metrics serving
This commit is contained in:
parent
21692e1683
commit
6c273020d3
@ -43,6 +43,7 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
corev1listers "k8s.io/client-go/listers/core/v1"
|
corev1listers "k8s.io/client-go/listers/core/v1"
|
||||||
"k8s.io/component-base/featuregate"
|
"k8s.io/component-base/featuregate"
|
||||||
|
"k8s.io/component-base/metrics/legacyregistry"
|
||||||
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
"k8s.io/kubernetes/pkg/api/legacyscheme"
|
||||||
"k8s.io/kubernetes/pkg/apis/apps"
|
"k8s.io/kubernetes/pkg/apis/apps"
|
||||||
"k8s.io/kubernetes/pkg/apis/batch"
|
"k8s.io/kubernetes/pkg/apis/batch"
|
||||||
@ -83,6 +84,20 @@ var _ admission.ValidationInterface = &Plugin{}
|
|||||||
var _ genericadmissioninit.WantsExternalKubeInformerFactory = &Plugin{}
|
var _ genericadmissioninit.WantsExternalKubeInformerFactory = &Plugin{}
|
||||||
var _ genericadmissioninit.WantsExternalKubeClientSet = &Plugin{}
|
var _ genericadmissioninit.WantsExternalKubeClientSet = &Plugin{}
|
||||||
|
|
||||||
|
var (
|
||||||
|
defaultRecorder *metrics.PrometheusRecorder
|
||||||
|
defaultRecorderInit sync.Once
|
||||||
|
)
|
||||||
|
|
||||||
|
func getDefaultRecorder() metrics.Recorder {
|
||||||
|
// initialize and register to legacy metrics once
|
||||||
|
defaultRecorderInit.Do(func() {
|
||||||
|
defaultRecorder = metrics.NewPrometheusRecorder(podsecurityadmissionapi.GetAPIVersion())
|
||||||
|
defaultRecorder.MustRegister(legacyregistry.MustRegister)
|
||||||
|
})
|
||||||
|
return defaultRecorder
|
||||||
|
}
|
||||||
|
|
||||||
// newPlugin creates a new admission plugin.
|
// newPlugin creates a new admission plugin.
|
||||||
func newPlugin(reader io.Reader) (*Plugin, error) {
|
func newPlugin(reader io.Reader) (*Plugin, error) {
|
||||||
config, err := podsecurityconfigloader.LoadFromReader(reader)
|
config, err := podsecurityconfigloader.LoadFromReader(reader)
|
||||||
@ -94,14 +109,13 @@ func newPlugin(reader io.Reader) (*Plugin, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not create PodSecurityRegistry: %w", err)
|
return nil, fmt.Errorf("could not create PodSecurityRegistry: %w", err)
|
||||||
}
|
}
|
||||||
metrics.LegacyMustRegister()
|
|
||||||
|
|
||||||
return &Plugin{
|
return &Plugin{
|
||||||
Handler: admission.NewHandler(admission.Create, admission.Update),
|
Handler: admission.NewHandler(admission.Create, admission.Update),
|
||||||
delegate: &podsecurityadmission.Admission{
|
delegate: &podsecurityadmission.Admission{
|
||||||
Configuration: config,
|
Configuration: config,
|
||||||
Evaluator: evaluator,
|
Evaluator: evaluator,
|
||||||
Metrics: metrics.DefaultRecorder(),
|
Metrics: getDefaultRecorder(),
|
||||||
PodSpecExtractor: podsecurityadmission.DefaultPodSpecExtractor{},
|
PodSpecExtractor: podsecurityadmission.DefaultPodSpecExtractor{},
|
||||||
},
|
},
|
||||||
}, nil
|
}, nil
|
||||||
|
@ -41,7 +41,6 @@ import (
|
|||||||
restclient "k8s.io/client-go/rest"
|
restclient "k8s.io/client-go/rest"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
compbasemetrics "k8s.io/component-base/metrics"
|
compbasemetrics "k8s.io/component-base/metrics"
|
||||||
"k8s.io/component-base/metrics/legacyregistry"
|
|
||||||
"k8s.io/component-base/version/verflag"
|
"k8s.io/component-base/version/verflag"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
"k8s.io/pod-security-admission/admission"
|
"k8s.io/pod-security-admission/admission"
|
||||||
@ -107,6 +106,8 @@ type Server struct {
|
|||||||
informerFactory kubeinformers.SharedInformerFactory
|
informerFactory kubeinformers.SharedInformerFactory
|
||||||
|
|
||||||
delegate *admission.Admission
|
delegate *admission.Admission
|
||||||
|
|
||||||
|
metricsRegistry compbasemetrics.KubeRegistry
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) Start(ctx context.Context) error {
|
func (s *Server) Start(ctx context.Context) error {
|
||||||
@ -119,10 +120,9 @@ func (s *Server) Start(ctx context.Context) error {
|
|||||||
// debugging or proxy purposes. The API server will not connect to an http webhook.
|
// debugging or proxy purposes. The API server will not connect to an http webhook.
|
||||||
mux.HandleFunc("/", s.HandleValidate)
|
mux.HandleFunc("/", s.HandleValidate)
|
||||||
|
|
||||||
// Serve the global metrics registry.
|
// Serve the metrics.
|
||||||
metrics.LegacyMustRegister()
|
|
||||||
mux.Handle("/metrics",
|
mux.Handle("/metrics",
|
||||||
compbasemetrics.HandlerFor(legacyregistry.DefaultGatherer, compbasemetrics.HandlerOpts{ErrorHandling: compbasemetrics.ContinueOnError}))
|
compbasemetrics.HandlerFor(s.metricsRegistry, compbasemetrics.HandlerOpts{ErrorHandling: compbasemetrics.ContinueOnError}))
|
||||||
|
|
||||||
if s.insecureServing != nil {
|
if s.insecureServing != nil {
|
||||||
if err := s.insecureServing.Serve(mux, 0, ctx.Done()); err != nil {
|
if err := s.insecureServing.Serve(mux, 0, ctx.Done()); err != nil {
|
||||||
@ -279,11 +279,14 @@ func Setup(c *Config) (*Server, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("could not create PodSecurityRegistry: %w", err)
|
return nil, fmt.Errorf("could not create PodSecurityRegistry: %w", err)
|
||||||
}
|
}
|
||||||
|
metrics := metrics.NewPrometheusRecorder(api.GetAPIVersion())
|
||||||
|
s.metricsRegistry = compbasemetrics.NewKubeRegistry()
|
||||||
|
metrics.MustRegister(s.metricsRegistry.MustRegister)
|
||||||
|
|
||||||
s.delegate = &admission.Admission{
|
s.delegate = &admission.Admission{
|
||||||
Configuration: c.PodSecurityConfig,
|
Configuration: c.PodSecurityConfig,
|
||||||
Evaluator: evaluator,
|
Evaluator: evaluator,
|
||||||
Metrics: metrics.DefaultRecorder(),
|
Metrics: metrics,
|
||||||
PodSpecExtractor: admission.DefaultPodSpecExtractor{},
|
PodSpecExtractor: admission.DefaultPodSpecExtractor{},
|
||||||
PodLister: admission.PodListerFromClient(client),
|
PodLister: admission.PodListerFromClient(client),
|
||||||
NamespaceGetter: admission.NamespaceGetterFromListerAndClient(namespaceLister, client),
|
NamespaceGetter: admission.NamespaceGetterFromListerAndClient(namespaceLister, client),
|
||||||
|
@ -19,13 +19,11 @@ package metrics
|
|||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
|
|
||||||
admissionv1 "k8s.io/api/admission/v1"
|
admissionv1 "k8s.io/api/admission/v1"
|
||||||
corev1 "k8s.io/api/core/v1"
|
corev1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/component-base/metrics"
|
"k8s.io/component-base/metrics"
|
||||||
"k8s.io/component-base/metrics/legacyregistry"
|
|
||||||
"k8s.io/pod-security-admission/api"
|
"k8s.io/pod-security-admission/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -46,25 +44,12 @@ type Recorder interface {
|
|||||||
RecordError(fatal bool, attrs api.Attributes)
|
RecordError(fatal bool, attrs api.Attributes)
|
||||||
}
|
}
|
||||||
|
|
||||||
var defaultRecorder = NewPrometheusRecorder(api.GetAPIVersion())
|
|
||||||
|
|
||||||
func DefaultRecorder() Recorder {
|
|
||||||
return defaultRecorder
|
|
||||||
}
|
|
||||||
|
|
||||||
// MustRegister registers the global DefaultMetrics against the legacy registry.
|
|
||||||
func LegacyMustRegister() {
|
|
||||||
defaultRecorder.MustRegister(legacyregistry.MustRegister)
|
|
||||||
}
|
|
||||||
|
|
||||||
type PrometheusRecorder struct {
|
type PrometheusRecorder struct {
|
||||||
apiVersion api.Version
|
apiVersion api.Version
|
||||||
|
|
||||||
evaluationsCounter *metrics.CounterVec
|
evaluationsCounter *metrics.CounterVec
|
||||||
exemptionsCounter *metrics.CounterVec
|
exemptionsCounter *metrics.CounterVec
|
||||||
errorsCounter *metrics.CounterVec
|
errorsCounter *metrics.CounterVec
|
||||||
|
|
||||||
registerOnce sync.Once
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ Recorder = &PrometheusRecorder{}
|
var _ Recorder = &PrometheusRecorder{}
|
||||||
@ -104,11 +89,9 @@ func NewPrometheusRecorder(version api.Version) *PrometheusRecorder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *PrometheusRecorder) MustRegister(registerFunc func(...metrics.Registerable)) {
|
func (r *PrometheusRecorder) MustRegister(registerFunc func(...metrics.Registerable)) {
|
||||||
r.registerOnce.Do(func() {
|
|
||||||
registerFunc(r.evaluationsCounter)
|
registerFunc(r.evaluationsCounter)
|
||||||
registerFunc(r.exemptionsCounter)
|
registerFunc(r.exemptionsCounter)
|
||||||
registerFunc(r.errorsCounter)
|
registerFunc(r.errorsCounter)
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *PrometheusRecorder) Reset() {
|
func (r *PrometheusRecorder) Reset() {
|
||||||
|
@ -342,4 +342,8 @@ func validateMetrics(t *testing.T, rawMetrics []byte) {
|
|||||||
"decision", "policy_level", "policy_version", "mode", "request_operation", "resource", "subresource"); err != nil {
|
"decision", "policy_level", "policy_version", "mode", "request_operation", "resource", "subresource"); err != nil {
|
||||||
t.Errorf("Metric validation failed: %v", err)
|
t.Errorf("Metric validation failed: %v", err)
|
||||||
}
|
}
|
||||||
|
if err := testutil.ValidateMetrics(metrics, "pod_security_exemptions_total",
|
||||||
|
"request_operation", "resource", "subresource"); err != nil {
|
||||||
|
t.Errorf("Metric validation failed: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user