diff --git a/pkg/proxy/topology.go b/pkg/proxy/topology.go index c8b447971ed..9c7c7e9a258 100644 --- a/pkg/proxy/topology.go +++ b/pkg/proxy/topology.go @@ -168,6 +168,7 @@ func topologyModeFromHints(svcInfo ServicePort, endpoints []Endpoint, nodeName, return "" } + hasReadyEndpoints := false hasEndpointForNode := false allEndpointsHaveNodeHints := true hasEndpointForZone := false @@ -176,6 +177,7 @@ func topologyModeFromHints(svcInfo ServicePort, endpoints []Endpoint, nodeName, if !endpoint.IsReady() { continue } + hasReadyEndpoints = true if endpoint.NodeHints().Len() == 0 { allEndpointsHaveNodeHints = false @@ -190,6 +192,11 @@ func topologyModeFromHints(svcInfo ServicePort, endpoints []Endpoint, nodeName, } } + // If no ready endpoints exist, there are no hints to consider + if !hasReadyEndpoints { + return "" + } + if utilfeature.DefaultFeatureGate.Enabled(features.PreferSameTrafficDistribution) { if allEndpointsHaveNodeHints { if hasEndpointForNode { diff --git a/pkg/proxy/topology_test.go b/pkg/proxy/topology_test.go index 8e9ed4333d2..e15337a1732 100644 --- a/pkg/proxy/topology_test.go +++ b/pkg/proxy/topology_test.go @@ -398,6 +398,15 @@ func TestCategorizeEndpoints(t *testing.T) { clusterEndpoints: nil, localEndpoints: nil, allEndpoints: nil, + }, { + name: "single endpoint not ready, not serving, not terminating", + nodeLabels: map[string]string{v1.LabelTopologyZone: "zone-a"}, + serviceInfo: &BaseServicePortInfo{}, + endpoints: []Endpoint{ + &BaseEndpointInfo{endpoint: "10.0.0.0:80", ready: false, serving: false, terminating: false}, + }, + clusterEndpoints: sets.New[string](), + localEndpoints: nil, }} for _, tc := range testCases {