Make NodeManager an interface, add a dummy version

This commit is contained in:
Dan Winship committed 2026-10-07 15:25:33 -04:00
1 parent 54d3ca7a2c
commit 567139be10
5 files changed
+95 -20

No files matched your search

+1 -1
View File
@@ -176,7 +176,7 @@ type ProxyServer struct {
flagz flagz.Reader
podCIDRs []string // only used for LocalModeNodeCIDR
NodeManager *nodemanager.NodeManager
NodeManager nodemanager.NodeManager
Proxier proxy.Provider
}
@@ -35,6 +35,7 @@ import (
basemetrics "k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/testutil"
"k8s.io/kubernetes/pkg/proxy/metrics"
"k8s.io/kubernetes/pkg/proxy/nodemanager"
proxyutil "k8s.io/kubernetes/pkg/proxy/util"
testingclock "k8s.io/utils/clock/testing"
"k8s.io/utils/dump"
@@ -470,6 +471,8 @@ type serverTest struct {
}
type testNodeManager struct {
nodemanager.Dummy
node *v1.Node
}
+4 -8
View File
@@ -27,6 +27,7 @@ import (
v1 "k8s.io/api/core/v1"
"k8s.io/klog/v2"
"k8s.io/kubernetes/pkg/proxy/metrics"
"k8s.io/kubernetes/pkg/proxy/nodemanager"
"k8s.io/utils/clock"
"k8s.io/utils/ptr"
)
@@ -70,7 +71,7 @@ type ProxyHealthServer struct {
httpFactory httpServerFactory
clock clock.Clock
nodeManager nodeManager
nodeManager nodemanager.NodeManager
addr string
healthTimeout time.Duration
@@ -80,17 +81,12 @@ type ProxyHealthServer struct {
oldestPendingQueuedMap map[v1.IPFamily]time.Time
}
// interface to break an import chain between pkg/proxy and pkg/proxy/healthcheck
type nodeManager interface {
Node() *v1.Node
}
// NewProxyHealthServer returns a proxy health http server.
func NewProxyHealthServer(addr string, healthTimeout time.Duration, nodeManager nodeManager) *ProxyHealthServer {
func NewProxyHealthServer(addr string, healthTimeout time.Duration, nodeManager nodemanager.NodeManager) *ProxyHealthServer {
return newProxyHealthServer(stdNetListener{}, stdHTTPServerFactory{}, clock.RealClock{}, addr, healthTimeout, nodeManager)
}
func newProxyHealthServer(listener listener, httpServerFactory httpServerFactory, c clock.Clock, addr string, healthTimeout time.Duration, nodeManager nodeManager) *ProxyHealthServer {
func newProxyHealthServer(listener listener, httpServerFactory httpServerFactory, c clock.Clock, addr string, healthTimeout time.Duration, nodeManager nodemanager.NodeManager) *ProxyHealthServer {
return &ProxyHealthServer{
listener: listener,
httpFactory: httpServerFactory,
+55
View File
@@ -0,0 +1,55 @@
/*
Copyright 2025 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 nodemanager
import (
"net"
v1 "k8s.io/api/core/v1"
v1informers "k8s.io/client-go/informers/core/v1"
)
// Dummy is a dummy NodeManager. It doesn't do anything, but it can be used as
// a base implementation.
type Dummy struct{}
var _ NodeManager = &Dummy{}
func (n *Dummy) NodeIPs() []net.IP {
return nil
}
func (n *Dummy) PodCIDRs() []string {
return nil
}
func (n *Dummy) Node() *v1.Node {
return nil
}
func (n *Dummy) NodeInformer() v1informers.NodeInformer {
return nil
}
// OnNodeChange is a handler for Node creation and update.
func (n *Dummy) OnNodeChange(node *v1.Node) {}
// OnNodeDelete is a handler for Node deletes.
func (n *Dummy) OnNodeDelete(node *v1.Node) {}
// OnNodeSynced is called after the cache is synced and all pre-existing Nodes have been reported
func (n *Dummy) OnNodeSynced() {}
+32 -11
View File
@@ -37,13 +37,32 @@ import (
"k8s.io/client-go/tools/cache"
"k8s.io/klog/v2"
kubeproxyconfig "k8s.io/kubernetes/pkg/proxy/apis/config"
proxyconfig "k8s.io/kubernetes/pkg/proxy/config"
utilnode "k8s.io/kubernetes/pkg/util/node"
)
// NodeManager handles the life cycle of kube-proxy based on the NodeIPs and PodCIDRs handles
// node watch events and crashes kube-proxy if there are any changes in NodeIPs or PodCIDRs.
// Note: It only crashes on change on PodCIDR when watchPodCIDRs is set to true.
type NodeManager struct {
type NodeManager interface {
proxyconfig.NodeHandler
// NodeIPs returns the node's IPs. (This may be empty if New() timed out without
// getting any IPs.)
NodeIPs() []net.IP
// PodCIDRs returns the node's PodCIDRs.
PodCIDRs() []string
// Node returns a copy of the latest node object, or nil if the Node has not yet
// been seen.
Node() *v1.Node
// NodeInformer returns the NodeInformer.
NodeInformer() v1informers.NodeInformer
}
type nodeManager struct {
nodeInformer v1informers.NodeInformer
nodeLister corelisters.NodeLister
exitFunc func(exitCode int)
@@ -57,6 +76,8 @@ type NodeManager struct {
node *v1.Node
}
var _ NodeManager = &nodeManager{}
// New initializes node informer that selects for the given node, waits for cache sync
// and returns NodeManager after waiting some amount of time for the node object to exist
// and have NodeIPs (and PodCIDRs if watchPodCIDRs is true). Note: for backward compatibility,
@@ -64,7 +85,7 @@ type NodeManager struct {
// is false.
func New(ctx context.Context, client clientset.Interface,
nodeName string, config *kubeproxyconfig.KubeProxyConfiguration,
) (*NodeManager, error) {
) (NodeManager, error) {
resyncInterval := config.ConfigSyncPeriod.Duration
watchPodCIDRs := config.DetectLocalMode == kubeproxyconfig.LocalModeNodeCIDR
return newNodeManager(ctx, client, resyncInterval, nodeName, watchPodCIDRs, os.Exit, time.Second, 30*time.Second, 5*time.Minute)
@@ -74,7 +95,7 @@ func New(ctx context.Context, client clientset.Interface,
func newNodeManager(ctx context.Context, client clientset.Interface, resyncInterval time.Duration,
nodeName string, watchPodCIDRs bool, exitFunc func(int),
pollInterval, nodeIPsTimeout, podCIDRsTimeout time.Duration,
) (*NodeManager, error) {
) (*nodeManager, error) {
// make an informer that selects for the given node
thisNodeInformerFactory := informers.NewSharedInformerFactoryWithOptions(client, resyncInterval,
informers.WithTransform(func(obj interface{}) (interface{}, error) {
@@ -135,7 +156,7 @@ func newNodeManager(ctx context.Context, client clientset.Interface, resyncInter
klog.FromContext(ctx).Error(nil, "Timed out waiting for node to be assigned IPs", "node", klog.KRef("", nodeName))
}
return &NodeManager{
return &nodeManager{
nodeInformer: nodeInformer,
nodeLister: nodeLister,
exitFunc: exitFunc,
@@ -158,17 +179,17 @@ func getNodeInfo(nodeLister corelisters.NodeLister, nodeName string) (*v1.Node,
// NodeIPs returns the node's IPs. (This may be empty if New() timed out without
// getting any IPs.)
func (n *NodeManager) NodeIPs() []net.IP {
func (n *nodeManager) NodeIPs() []net.IP {
return n.nodeIPs
}
// PodCIDRs returns the node's PodCIDRs.
func (n *NodeManager) PodCIDRs() []string {
func (n *nodeManager) PodCIDRs() []string {
return n.podCIDRs
}
// Node returns a copy of the latest node object, or nil if the Node has not yet been seen.
func (n *NodeManager) Node() *v1.Node {
func (n *nodeManager) Node() *v1.Node {
n.mu.Lock()
defer n.mu.Unlock()
@@ -179,12 +200,12 @@ func (n *NodeManager) Node() *v1.Node {
}
// NodeInformer returns the NodeInformer.
func (n *NodeManager) NodeInformer() v1informers.NodeInformer {
func (n *nodeManager) NodeInformer() v1informers.NodeInformer {
return n.nodeInformer
}
// OnNodeChange is a handler for Node creation and update.
func (n *NodeManager) OnNodeChange(node *v1.Node) {
func (n *nodeManager) OnNodeChange(node *v1.Node) {
// update the node object
n.mu.Lock()
n.node = node
@@ -214,11 +235,11 @@ func (n *NodeManager) OnNodeChange(node *v1.Node) {
}
// OnNodeDelete is a handler for Node deletes.
func (n *NodeManager) OnNodeDelete(node *v1.Node) {
func (n *nodeManager) OnNodeDelete(node *v1.Node) {
klog.InfoS("Node is being deleted", "node", klog.KObj(node))
klog.Flush()
n.exitFunc(1)
}
// OnNodeSynced is called after the cache is synced and all pre-existing Nodes have been reported
func (n *NodeManager) OnNodeSynced() {}
func (n *nodeManager) OnNodeSynced() {}