diff --git a/cmd/kube-proxy/app/server.go b/cmd/kube-proxy/app/server.go index c2245348415..3e132baf95f 100644 --- a/cmd/kube-proxy/app/server.go +++ b/cmd/kube-proxy/app/server.go @@ -80,6 +80,7 @@ import ( "k8s.io/kubernetes/pkg/proxy/apis/config/validation" "k8s.io/kubernetes/pkg/proxy/config" "k8s.io/kubernetes/pkg/proxy/healthcheck" + proxymetrics "k8s.io/kubernetes/pkg/proxy/metrics" proxyutil "k8s.io/kubernetes/pkg/proxy/util" "k8s.io/kubernetes/pkg/util/filesystem" utilflag "k8s.io/kubernetes/pkg/util/flag" @@ -919,6 +920,8 @@ func (s *ProxyServer) Run(ctx context.Context) error { logger.Info("Golang settings", "GOGC", os.Getenv("GOGC"), "GOMAXPROCS", os.Getenv("GOMAXPROCS"), "GOTRACEBACK", os.Getenv("GOTRACEBACK")) + proxymetrics.RegisterMetrics(s.Config.Mode) + // TODO(vmarmol): Use container config for this. var oomAdjuster *oom.OOMAdjuster if s.Config.OOMScoreAdj != nil { diff --git a/cmd/kube-proxy/app/server_linux.go b/cmd/kube-proxy/app/server_linux.go index adeb91c75a6..395578c270d 100644 --- a/cmd/kube-proxy/app/server_linux.go +++ b/cmd/kube-proxy/app/server_linux.go @@ -50,7 +50,6 @@ import ( "k8s.io/kubernetes/pkg/proxy/ipvs" utilipset "k8s.io/kubernetes/pkg/proxy/ipvs/ipset" utilipvs "k8s.io/kubernetes/pkg/proxy/ipvs/util" - proxymetrics "k8s.io/kubernetes/pkg/proxy/metrics" "k8s.io/kubernetes/pkg/proxy/nftables" proxyutil "k8s.io/kubernetes/pkg/proxy/util" proxyutiliptables "k8s.io/kubernetes/pkg/proxy/util/iptables" @@ -101,7 +100,6 @@ func (s *ProxyServer) platformSetup(ctx context.Context) error { return err } - proxymetrics.RegisterMetrics() return nil } diff --git a/cmd/kube-proxy/app/server_windows.go b/cmd/kube-proxy/app/server_windows.go index 7cfb9c3f99f..4f34e7e2947 100644 --- a/cmd/kube-proxy/app/server_windows.go +++ b/cmd/kube-proxy/app/server_windows.go @@ -51,7 +51,6 @@ func (o *Options) platformApplyDefaults(config *proxyconfigapi.KubeProxyConfigur // Proxier. It should fill in any platform-specific fields and perform other // platform-specific setup. func (s *ProxyServer) platformSetup(ctx context.Context) error { - winkernel.RegisterMetrics() // Preserve backward-compatibility with the old secondary IP behavior if s.PrimaryIPFamily == v1.IPv4Protocol { s.NodeIPs[v1.IPv6Protocol] = net.IPv6zero diff --git a/pkg/proxy/healthcheck/healthcheck_test.go b/pkg/proxy/healthcheck/healthcheck_test.go index c1c451ef8c2..a3047a1829d 100644 --- a/pkg/proxy/healthcheck/healthcheck_test.go +++ b/pkg/proxy/healthcheck/healthcheck_test.go @@ -465,7 +465,7 @@ type serverTest struct { } func TestHealthzServer(t *testing.T) { - metrics.RegisterMetrics() + metrics.RegisterMetrics("") listener := newFakeListener() httpFactory := newFakeHTTPServerFactory() fakeClock := testingclock.NewFakeClock(time.Now()) @@ -500,7 +500,7 @@ func TestHealthzServer(t *testing.T) { } func TestLivezServer(t *testing.T) { - metrics.RegisterMetrics() + metrics.RegisterMetrics("") listener := newFakeListener() httpFactory := newFakeHTTPServerFactory() fakeClock := testingclock.NewFakeClock(time.Now()) diff --git a/pkg/proxy/iptables/proxier_test.go b/pkg/proxy/iptables/proxier_test.go index 24edaf19a2e..52dbf8c7c11 100644 --- a/pkg/proxy/iptables/proxier_test.go +++ b/pkg/proxy/iptables/proxier_test.go @@ -49,10 +49,10 @@ import ( klogtesting "k8s.io/klog/v2/ktesting" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" + kubeproxyconfig "k8s.io/kubernetes/pkg/proxy/apis/config" "k8s.io/kubernetes/pkg/proxy/conntrack" - "k8s.io/kubernetes/pkg/proxy/metrics" - "k8s.io/kubernetes/pkg/proxy/healthcheck" + "k8s.io/kubernetes/pkg/proxy/metrics" proxyutil "k8s.io/kubernetes/pkg/proxy/util" proxyutiliptables "k8s.io/kubernetes/pkg/proxy/util/iptables" proxyutiltest "k8s.io/kubernetes/pkg/proxy/util/testing" @@ -1544,7 +1544,7 @@ func TestOverallIPTablesRules(t *testing.T) { logger, _ := klogtesting.NewTestContext(t) ipt := iptablestest.NewFake() fp := NewFakeProxier(ipt) - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeIPTables) makeServiceMap(fp, // create ClusterIP service @@ -4148,7 +4148,7 @@ func TestProxierMetricsIptablesTotalRules(t *testing.T) { ipt := iptablestest.NewFake() fp := NewFakeProxier(ipt) - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeIPTables) svcIP := "172.30.0.41" svcPort := 80 @@ -5828,7 +5828,7 @@ func TestSyncProxyRulesRepeated(t *testing.T) { logger, _ := klogtesting.NewTestContext(t) ipt := iptablestest.NewFake() fp := NewFakeProxier(ipt) - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeIPTables) defer legacyregistry.Reset() // Create initial state @@ -6472,7 +6472,7 @@ func TestNoEndpointsMetric(t *testing.T) { hostname string } - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeIPTables) testCases := []struct { name string internalTrafficPolicy *v1.ServiceInternalTrafficPolicy diff --git a/pkg/proxy/ipvs/proxier_test.go b/pkg/proxy/ipvs/proxier_test.go index 96c3306daac..4ee158fe448 100644 --- a/pkg/proxy/ipvs/proxier_test.go +++ b/pkg/proxy/ipvs/proxier_test.go @@ -42,6 +42,7 @@ import ( "k8s.io/component-base/metrics/testutil" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" + kubeproxyconfig "k8s.io/kubernetes/pkg/proxy/apis/config" "k8s.io/kubernetes/pkg/proxy/conntrack" "k8s.io/kubernetes/pkg/proxy/healthcheck" utilipset "k8s.io/kubernetes/pkg/proxy/ipvs/ipset" @@ -5616,7 +5617,7 @@ func TestNoEndpointsMetric(t *testing.T) { hostname string } - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeIPVS) testCases := []struct { name string diff --git a/pkg/proxy/metrics/metrics.go b/pkg/proxy/metrics/metrics.go index 19fb8923cf2..43618e1670f 100644 --- a/pkg/proxy/metrics/metrics.go +++ b/pkg/proxy/metrics/metrics.go @@ -22,6 +22,7 @@ import ( "k8s.io/component-base/metrics" "k8s.io/component-base/metrics/legacyregistry" + kubeproxyconfig "k8s.io/kubernetes/pkg/proxy/apis/config" ) const kubeProxySubsystem = "kubeproxy" @@ -237,26 +238,42 @@ var ( var registerMetricsOnce sync.Once // RegisterMetrics registers kube-proxy metrics. -func RegisterMetrics() { +func RegisterMetrics(mode kubeproxyconfig.ProxyMode) { registerMetricsOnce.Do(func() { + // Core kube-proxy metrics for all backends legacyregistry.MustRegister(SyncProxyRulesLatency) - legacyregistry.MustRegister(SyncFullProxyRulesLatency) - legacyregistry.MustRegister(SyncPartialProxyRulesLatency) + legacyregistry.MustRegister(SyncProxyRulesLastQueuedTimestamp) legacyregistry.MustRegister(SyncProxyRulesLastTimestamp) - legacyregistry.MustRegister(NetworkProgrammingLatency) legacyregistry.MustRegister(EndpointChangesPending) legacyregistry.MustRegister(EndpointChangesTotal) legacyregistry.MustRegister(ServiceChangesPending) legacyregistry.MustRegister(ServiceChangesTotal) - legacyregistry.MustRegister(IptablesRulesTotal) - legacyregistry.MustRegister(IptablesRulesLastSync) - legacyregistry.MustRegister(IptablesRestoreFailuresTotal) - legacyregistry.MustRegister(IptablesPartialRestoreFailuresTotal) - legacyregistry.MustRegister(SyncProxyRulesLastQueuedTimestamp) - legacyregistry.MustRegister(SyncProxyRulesNoLocalEndpointsTotal) legacyregistry.MustRegister(ProxyHealthzTotal) legacyregistry.MustRegister(ProxyLivezTotal) + // FIXME: winkernel does not implement these + legacyregistry.MustRegister(NetworkProgrammingLatency) + legacyregistry.MustRegister(SyncProxyRulesNoLocalEndpointsTotal) + + switch mode { + case kubeproxyconfig.ProxyModeIPTables: + legacyregistry.MustRegister(SyncFullProxyRulesLatency) + legacyregistry.MustRegister(SyncPartialProxyRulesLatency) + legacyregistry.MustRegister(IptablesRestoreFailuresTotal) + legacyregistry.MustRegister(IptablesPartialRestoreFailuresTotal) + legacyregistry.MustRegister(IptablesRulesTotal) + legacyregistry.MustRegister(IptablesRulesLastSync) + + case kubeproxyconfig.ProxyModeIPVS: + legacyregistry.MustRegister(IptablesRestoreFailuresTotal) + + case kubeproxyconfig.ProxyModeNFTables: + // FIXME: should not use the iptables-specific metric + legacyregistry.MustRegister(IptablesRestoreFailuresTotal) + + case kubeproxyconfig.ProxyModeKernelspace: + // currently no winkernel-specific metrics + } }) } diff --git a/pkg/proxy/nftables/proxier_test.go b/pkg/proxy/nftables/proxier_test.go index a4754cb2154..ec063fdbc25 100644 --- a/pkg/proxy/nftables/proxier_test.go +++ b/pkg/proxy/nftables/proxier_test.go @@ -40,6 +40,7 @@ import ( "k8s.io/component-base/metrics/testutil" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" + kubeproxyconfig "k8s.io/kubernetes/pkg/proxy/apis/config" "k8s.io/kubernetes/pkg/proxy/conntrack" "k8s.io/kubernetes/pkg/proxy/healthcheck" "k8s.io/kubernetes/pkg/proxy/metrics" @@ -141,7 +142,7 @@ func NewFakeProxier(ipFamily v1.IPFamily) (*knftables.Fake, *Proxier) { // rules are exactly as expected. func TestOverallNFTablesRules(t *testing.T) { nft, fp := NewFakeProxier(v1.IPv4Protocol) - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeNFTables) makeServiceMap(fp, // create ClusterIP service @@ -4455,7 +4456,7 @@ func TestNoEndpointsMetric(t *testing.T) { hostname string } - metrics.RegisterMetrics() + metrics.RegisterMetrics(kubeproxyconfig.ProxyModeNFTables) testCases := []struct { name string internalTrafficPolicy *v1.ServiceInternalTrafficPolicy diff --git a/pkg/proxy/winkernel/doc.go b/pkg/proxy/winkernel/doc.go new file mode 100644 index 00000000000..9d4f4d013fe --- /dev/null +++ b/pkg/proxy/winkernel/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package winkernel implements the Windows-kernel-based proxy +package winkernel // import "k8s.io/kubernetes/pkg/proxy/winkernel" diff --git a/pkg/proxy/winkernel/metrics.go b/pkg/proxy/winkernel/metrics.go deleted file mode 100644 index e4357e4eceb..00000000000 --- a/pkg/proxy/winkernel/metrics.go +++ /dev/null @@ -1,39 +0,0 @@ -/* -Copyright 2017 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package winkernel - -import ( - "sync" - - "k8s.io/component-base/metrics/legacyregistry" - "k8s.io/kubernetes/pkg/proxy/metrics" -) - -var registerMetricsOnce sync.Once - -// RegisterMetrics registers kube-proxy metrics for Windows modes. -func RegisterMetrics() { - registerMetricsOnce.Do(func() { - legacyregistry.MustRegister(metrics.SyncProxyRulesLatency) - legacyregistry.MustRegister(metrics.SyncProxyRulesLastTimestamp) - legacyregistry.MustRegister(metrics.EndpointChangesPending) - legacyregistry.MustRegister(metrics.EndpointChangesTotal) - legacyregistry.MustRegister(metrics.ServiceChangesPending) - legacyregistry.MustRegister(metrics.ServiceChangesTotal) - legacyregistry.MustRegister(metrics.SyncProxyRulesLastQueuedTimestamp) - }) -}