Updating kube-proxy to ignore unready endpoints for Topology Hints

This commit is contained in:
Rob Scott 2021-11-17 13:39:38 -08:00
parent 1367cca8fd
commit 1983f41065
No known key found for this signature in database
GPG Key ID: D91A796D0CFF0C5D
2 changed files with 38 additions and 4 deletions

View File

@ -68,6 +68,9 @@ func filterEndpointsWithHints(endpoints []Endpoint, hintsAnnotation string, node
filteredEndpoints := []Endpoint{} filteredEndpoints := []Endpoint{}
for _, endpoint := range endpoints { for _, endpoint := range endpoints {
if !endpoint.IsReady() {
continue
}
if endpoint.GetZoneHints().Len() == 0 { if endpoint.GetZoneHints().Len() == 0 {
klog.InfoS("Skipping topology aware endpoint filtering since one or more endpoints is missing a zone hint") klog.InfoS("Skipping topology aware endpoint filtering since one or more endpoints is missing a zone hint")
return endpoints return endpoints

View File

@ -31,6 +31,7 @@ func TestFilterEndpoints(t *testing.T) {
type endpoint struct { type endpoint struct {
ip string ip string
zoneHints sets.String zoneHints sets.String
unready bool
} }
testCases := []struct { testCases := []struct {
name string name string
@ -138,12 +139,12 @@ func TestFilterEndpoints(t *testing.T) {
endpoints := []Endpoint{} endpoints := []Endpoint{}
for _, ep := range tc.endpoints { for _, ep := range tc.endpoints {
endpoints = append(endpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints}) endpoints = append(endpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints, Ready: !ep.unready})
} }
expectedEndpoints := []Endpoint{} expectedEndpoints := []Endpoint{}
for _, ep := range tc.expectedEndpoints { for _, ep := range tc.expectedEndpoints {
expectedEndpoints = append(expectedEndpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints}) expectedEndpoints = append(expectedEndpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints, Ready: !ep.unready})
} }
filteredEndpoints := FilterEndpoints(endpoints, tc.serviceInfo, tc.nodeLabels) filteredEndpoints := FilterEndpoints(endpoints, tc.serviceInfo, tc.nodeLabels)
@ -161,6 +162,7 @@ func Test_filterEndpointsWithHints(t *testing.T) {
type endpoint struct { type endpoint struct {
ip string ip string
zoneHints sets.String zoneHints sets.String
unready bool
} }
testCases := []struct { testCases := []struct {
name string name string
@ -200,6 +202,35 @@ func Test_filterEndpointsWithHints(t *testing.T) {
{ip: "10.1.2.3", zoneHints: sets.NewString("zone-a")}, {ip: "10.1.2.3", zoneHints: sets.NewString("zone-a")},
{ip: "10.1.2.6", zoneHints: sets.NewString("zone-a")}, {ip: "10.1.2.6", zoneHints: sets.NewString("zone-a")},
}, },
}, {
name: "unready endpoint",
nodeLabels: map[string]string{v1.LabelTopologyZone: "zone-a"},
hintsAnnotation: "auto",
endpoints: []endpoint{
{ip: "10.1.2.3", zoneHints: sets.NewString("zone-a")},
{ip: "10.1.2.4", zoneHints: sets.NewString("zone-b")},
{ip: "10.1.2.5", zoneHints: sets.NewString("zone-c")},
{ip: "10.1.2.6", zoneHints: sets.NewString("zone-a"), unready: true},
},
expectedEndpoints: []endpoint{
{ip: "10.1.2.3", zoneHints: sets.NewString("zone-a")},
},
}, {
name: "only unready endpoints in same zone (should not filter)",
nodeLabels: map[string]string{v1.LabelTopologyZone: "zone-a"},
hintsAnnotation: "auto",
endpoints: []endpoint{
{ip: "10.1.2.3", zoneHints: sets.NewString("zone-a"), unready: true},
{ip: "10.1.2.4", zoneHints: sets.NewString("zone-b")},
{ip: "10.1.2.5", zoneHints: sets.NewString("zone-c")},
{ip: "10.1.2.6", zoneHints: sets.NewString("zone-a"), unready: true},
},
expectedEndpoints: []endpoint{
{ip: "10.1.2.3", zoneHints: sets.NewString("zone-a"), unready: true},
{ip: "10.1.2.4", zoneHints: sets.NewString("zone-b")},
{ip: "10.1.2.5", zoneHints: sets.NewString("zone-c")},
{ip: "10.1.2.6", zoneHints: sets.NewString("zone-a"), unready: true},
},
}, { }, {
name: "normal endpoint filtering, Auto annotation", name: "normal endpoint filtering, Auto annotation",
nodeLabels: map[string]string{v1.LabelTopologyZone: "zone-a"}, nodeLabels: map[string]string{v1.LabelTopologyZone: "zone-a"},
@ -291,12 +322,12 @@ func Test_filterEndpointsWithHints(t *testing.T) {
t.Run(tc.name, func(t *testing.T) { t.Run(tc.name, func(t *testing.T) {
endpoints := []Endpoint{} endpoints := []Endpoint{}
for _, ep := range tc.endpoints { for _, ep := range tc.endpoints {
endpoints = append(endpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints}) endpoints = append(endpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints, Ready: !ep.unready})
} }
expectedEndpoints := []Endpoint{} expectedEndpoints := []Endpoint{}
for _, ep := range tc.expectedEndpoints { for _, ep := range tc.expectedEndpoints {
expectedEndpoints = append(expectedEndpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints}) expectedEndpoints = append(expectedEndpoints, &BaseEndpointInfo{Endpoint: ep.ip, ZoneHints: ep.zoneHints, Ready: !ep.unready})
} }
filteredEndpoints := filterEndpointsWithHints(endpoints, tc.hintsAnnotation, tc.nodeLabels) filteredEndpoints := filterEndpointsWithHints(endpoints, tc.hintsAnnotation, tc.nodeLabels)