Merge pull request #135547 from danwinship/healthcheck-interface

Add a nodeManager interface to pkg/proxy/healthcheck
This commit is contained in:
Kubernetes Prow Robot 2025-12-17 23:27:38 -08:00 committed by GitHub
commit 77f5336dbc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 30 additions and 18 deletions

View file

@ -33,10 +33,8 @@ import (
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/dump"
"k8s.io/apimachinery/pkg/util/sets"
clientsetfake "k8s.io/client-go/kubernetes/fake"
basemetrics "k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/testutil"
"k8s.io/kubernetes/pkg/proxy"
"k8s.io/kubernetes/pkg/proxy/metrics"
proxyutil "k8s.io/kubernetes/pkg/proxy/util"
testingclock "k8s.io/utils/clock/testing"
@ -471,14 +469,25 @@ type serverTest struct {
tracking503 int
}
type testNodeManager struct {
node *v1.Node
}
func (t *testNodeManager) Node() *v1.Node {
return t.node
}
func (t *testNodeManager) update(node *v1.Node) {
t.node = node
}
func TestHealthzServer(t *testing.T) {
metrics.RegisterMetrics("")
listener := newFakeListener()
httpFactory := newFakeHTTPServerFactory()
fakeClock := testingclock.NewFakeClock(time.Now())
client := clientsetfake.NewClientset(makeNode())
nodeManager, _ := proxy.NewNodeManager(context.TODO(), client, time.Second, testNodeName, false)
nodeManager := &testNodeManager{node: makeNode()}
hs := newProxyHealthServer(listener, httpFactory, fakeClock, "127.0.0.1:10256", 10*time.Second, nodeManager)
server := hs.httpFactory.New(healthzHandler{hs: hs})
@ -495,7 +504,7 @@ func TestHealthzServer(t *testing.T) {
testProxyHealthUpdater(hs, hsTest, fakeClock, ptr.To(true), t)
// Should return 200 "OK" if we've synced a node, tainted in any other way
nodeManager.OnNodeChange(makeNode(tweakTainted("other")))
nodeManager.update(makeNode(tweakTainted("other")))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -509,7 +518,7 @@ func TestHealthzServer(t *testing.T) {
testHTTPHandler(hsTest, http.StatusOK, expectedPayload, t)
// Should return 503 "ServiceUnavailable" if we've synced a ToBeDeletedTaint node
nodeManager.OnNodeChange(makeNode(tweakTainted(ToBeDeletedTaint)))
nodeManager.update(makeNode(tweakTainted(ToBeDeletedTaint)))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -523,7 +532,7 @@ func TestHealthzServer(t *testing.T) {
testHTTPHandler(hsTest, http.StatusServiceUnavailable, expectedPayload, t)
// Should return 200 "OK" if we've synced a node, tainted in any other way
nodeManager.OnNodeChange(makeNode(tweakTainted("other")))
nodeManager.update(makeNode(tweakTainted("other")))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -537,7 +546,7 @@ func TestHealthzServer(t *testing.T) {
testHTTPHandler(hsTest, http.StatusOK, expectedPayload, t)
// Should return 503 "ServiceUnavailable" if we've synced a deleted node
nodeManager.OnNodeChange(makeNode(tweakDeleted()))
nodeManager.update(makeNode(tweakDeleted()))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -556,9 +565,8 @@ func TestLivezServer(t *testing.T) {
listener := newFakeListener()
httpFactory := newFakeHTTPServerFactory()
fakeClock := testingclock.NewFakeClock(time.Now())
client := clientsetfake.NewClientset(makeNode())
nodeManager, _ := proxy.NewNodeManager(context.TODO(), client, time.Second, testNodeName, false)
nodeManager := &testNodeManager{node: makeNode()}
hs := newProxyHealthServer(listener, httpFactory, fakeClock, "127.0.0.1:10256", 10*time.Second, nodeManager)
server := hs.httpFactory.New(livezHandler{hs: hs})
@ -575,7 +583,7 @@ func TestLivezServer(t *testing.T) {
testProxyHealthUpdater(hs, hsTest, fakeClock, nil, t)
// Should return 200 "OK" irrespective of node syncs
nodeManager.OnNodeChange(makeNode(tweakTainted("other")))
nodeManager.update(makeNode(tweakTainted("other")))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -588,7 +596,7 @@ func TestLivezServer(t *testing.T) {
testHTTPHandler(hsTest, http.StatusOK, expectedPayload, t)
// Should return 200 "OK" irrespective of node syncs
nodeManager.OnNodeChange(makeNode(tweakTainted(ToBeDeletedTaint)))
nodeManager.update(makeNode(tweakTainted(ToBeDeletedTaint)))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -601,7 +609,7 @@ func TestLivezServer(t *testing.T) {
testHTTPHandler(hsTest, http.StatusOK, expectedPayload, t)
// Should return 200 "OK" irrespective of node syncs
nodeManager.OnNodeChange(makeNode(tweakTainted("other")))
nodeManager.update(makeNode(tweakTainted("other")))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),
@ -614,7 +622,7 @@ func TestLivezServer(t *testing.T) {
testHTTPHandler(hsTest, http.StatusOK, expectedPayload, t)
// Should return 200 "OK" irrespective of node syncs
nodeManager.OnNodeChange(makeNode(tweakDeleted()))
nodeManager.update(makeNode(tweakDeleted()))
expectedPayload = ProxyHealth{
CurrentTime: fakeClock.Now(),
LastUpdated: fakeClock.Now(),

View file

@ -26,7 +26,6 @@ import (
v1 "k8s.io/api/core/v1"
"k8s.io/klog/v2"
"k8s.io/kubernetes/pkg/proxy"
"k8s.io/kubernetes/pkg/proxy/metrics"
"k8s.io/utils/clock"
"k8s.io/utils/ptr"
@ -71,7 +70,7 @@ type ProxyHealthServer struct {
httpFactory httpServerFactory
clock clock.Clock
nodeManager *proxy.NodeManager
nodeManager nodeManager
addr string
healthTimeout time.Duration
@ -81,12 +80,17 @@ 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 *proxy.NodeManager) *ProxyHealthServer {
func NewProxyHealthServer(addr string, healthTimeout time.Duration, 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 *proxy.NodeManager) *ProxyHealthServer {
func newProxyHealthServer(listener listener, httpServerFactory httpServerFactory, c clock.Clock, addr string, healthTimeout time.Duration, nodeManager nodeManager) *ProxyHealthServer {
return &ProxyHealthServer{
listener: listener,
httpFactory: httpServerFactory,