mirror of
https://github.com/kubernetes/kubernetes.git
synced 2026-10-28 15:05:03 +08:00
Make NodeManager an interface, add a dummy version
This commit is contained in:
1 parent
54d3ca7a2c
commit
567139be10
5 files changed
+95
-20
No files matched your search
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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() {}
|
||||
@@ -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() {}
|
||||
Reference in new issue
Block a user