From d6bc98fc5a39e7ff16dc563408b35767024b13b5 Mon Sep 17 00:00:00 2001 From: xh4n3 Date: Fri, 5 Mar 2021 12:38:05 +0800 Subject: [PATCH] fix wrong NumCPU in kube-proxy under static CPU policy Signed-off-by: xh4n3 --- cmd/kube-proxy/app/server.go | 3 +-- cmd/kube-proxy/app/server_others.go | 12 ++++++++++++ cmd/kube-proxy/app/server_windows.go | 5 +++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cmd/kube-proxy/app/server.go b/cmd/kube-proxy/app/server.go index 75577d07f20..2d5ca952c31 100644 --- a/cmd/kube-proxy/app/server.go +++ b/cmd/kube-proxy/app/server.go @@ -24,7 +24,6 @@ import ( "io/ioutil" "net/http" "os" - goruntime "runtime" "strings" "time" @@ -784,7 +783,7 @@ func getConntrackMax(config kubeproxyconfig.KubeProxyConntrackConfiguration) (in if config.Min != nil { floor = int(*config.Min) } - scaled := int(*config.MaxPerCore) * goruntime.NumCPU() + scaled := int(*config.MaxPerCore) * detectNumCPU() if scaled > floor { klog.V(3).Infof("getConntrackMax: using scaled conntrack-max-per-core") return scaled, nil diff --git a/cmd/kube-proxy/app/server_others.go b/cmd/kube-proxy/app/server_others.go index bcbf7392f06..62547325b34 100644 --- a/cmd/kube-proxy/app/server_others.go +++ b/cmd/kube-proxy/app/server_others.go @@ -25,9 +25,12 @@ import ( "errors" "fmt" "net" + goruntime "runtime" "strings" "time" + "github.com/google/cadvisor/machine" + "github.com/google/cadvisor/utils/sysfs" "k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/runtime" @@ -436,6 +439,15 @@ func detectNodeIP(client clientset.Interface, hostname, bindAddress string) net. return nodeIP } +func detectNumCPU() int { + // try get numCPU from /sys firstly due to a known issue (https://github.com/kubernetes/kubernetes/issues/99225) + _, numCPU, err := machine.GetTopology(sysfs.NewRealSysFs()) + if err != nil || numCPU < 1 { + return goruntime.NumCPU() + } + return numCPU +} + func getDetectLocalMode(config *proxyconfigapi.KubeProxyConfiguration) (proxyconfigapi.LocalMode, error) { mode := config.DetectLocalMode switch mode { diff --git a/cmd/kube-proxy/app/server_windows.go b/cmd/kube-proxy/app/server_windows.go index abc15173558..12c714a3934 100644 --- a/cmd/kube-proxy/app/server_windows.go +++ b/cmd/kube-proxy/app/server_windows.go @@ -24,6 +24,7 @@ import ( "errors" "fmt" "net" + goruntime "runtime" // Enable pprof HTTP handlers. _ "net/http/pprof" @@ -185,6 +186,10 @@ func getProxyMode(proxyMode string, kcompat winkernel.KernelCompatTester) string return proxyModeUserspace } +func detectNumCPU() int { + return goruntime.NumCPU() +} + func tryWinKernelSpaceProxy(kcompat winkernel.KernelCompatTester) string { // Check for Windows Kernel Version if we can support Kernel Space proxy // Check for Windows Version