From 272ccb195d31cd1622d48f961f3a189ce3abb937 Mon Sep 17 00:00:00 2001 From: Chris O'Haver Date: Fri, 30 Oct 2020 08:14:30 -0400 Subject: plugin/kubernetes: Watch EndpointSlices (#4209) * initial commit Signed-off-by: Chris O'Haver * convert endpointslices to object.endpoints Signed-off-by: Chris O'Haver * add opt hard coded for now Signed-off-by: Chris O'Haver * check that server supports endpointslice Signed-off-by: Chris O'Haver * fix import grouping Signed-off-by: Chris O'Haver * dont use endpoint slice in 1.17 or 1.18 Signed-off-by: Chris O'Haver * bump kind/k8s in circle ci to latest Signed-off-by: Chris O'Haver * drop k8s to latest supported by kind Signed-off-by: Chris O'Haver * use endpointslice name as endoint Name; index by Service name Signed-off-by: Chris O'Haver * use index key comparison in nsAddrs() Signed-off-by: Chris O'Haver * add Index to object.Endpoint fixtures; fix direct endpoint name compares Signed-off-by: Chris O'Haver * add slice dup check and test Signed-off-by: Chris O'Haver * todo Signed-off-by: Chris O'Haver * add ep-slice skew dup test for reverse Signed-off-by: Chris O'Haver * nsaddrs: de-dup ep-slice skew dups; add test Signed-off-by: Chris O'Haver * remove todo Signed-off-by: Chris O'Haver * address various feedback Signed-off-by: Chris O'Haver * consolidate endpoint/slice informer code Signed-off-by: Chris O'Haver * fix endpoint informer consolidation; use clearer func name Signed-off-by: Chris O'Haver * log info; use major/minor fields Signed-off-by: Chris O'Haver * fix nsAddr and unit test Signed-off-by: Chris O'Haver * add latency tracking for endpointslices Signed-off-by: Chris O'Haver * endpointslice latency unit test & fix Signed-off-by: Chris O'Haver * code shuffling Signed-off-by: Chris O'Haver * rename endpointslices in tests Signed-off-by: Chris O'Haver * remove de-dup from nsAddrs and test Signed-off-by: Chris O'Haver * remove de-dup from findServices / test Signed-off-by: Chris O'Haver --- plugin/kubernetes/reverse_test.go | 49 ++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 9 deletions(-) (limited to 'plugin/kubernetes/reverse_test.go') diff --git a/plugin/kubernetes/reverse_test.go b/plugin/kubernetes/reverse_test.go index 5869d34bc..3b3b6872b 100644 --- a/plugin/kubernetes/reverse_test.go +++ b/plugin/kubernetes/reverse_test.go @@ -56,23 +56,53 @@ func (APIConnReverseTest) SvcIndexReverse(ip string) []*object.Service { } func (APIConnReverseTest) EpIndexReverse(ip string) []*object.Endpoints { - ep1 := object.Endpoints{ + ep1s1 := object.Endpoints{ Subsets: []object.EndpointSubset{ { Addresses: []object.EndpointAddress{ {IP: "10.0.0.100", Hostname: "ep1a"}, + {IP: "10.0.0.99", Hostname: "double-ep"}, // this endpoint is used by two services + }, + Ports: []object.EndpointPort{ + {Port: 80, Protocol: "tcp", Name: "http"}, + }, + }, + }, + Name: "svc1-slice1", + Namespace: "testns", + Index: object.EndpointsKey("svc1", "testns"), + } + ep1s2 := object.Endpoints{ + Subsets: []object.EndpointSubset{ + { + Addresses: []object.EndpointAddress{ {IP: "1234:abcd::1", Hostname: "ep1b"}, {IP: "fd00:77:30::a", Hostname: "ip6svc1ex"}, {IP: "fd00:77:30::2:9ba6", Hostname: "ip6svc1in"}, - {IP: "10.0.0.99", Hostname: "double-ep"}, // this endpoint is used by two services }, Ports: []object.EndpointPort{ {Port: 80, Protocol: "tcp", Name: "http"}, }, }, }, - Name: "svc1", + Name: "svc1-slice2", Namespace: "testns", + Index: object.EndpointsKey("svc1", "testns"), + } + ep1s3 := object.Endpoints{ + Subsets: []object.EndpointSubset{ + { + Addresses: []object.EndpointAddress{ + {IP: "10.0.0.100", Hostname: "ep1a"}, // duplicate endpointslice address + }, + Ports: []object.EndpointPort{ + {Port: 80, Protocol: "tcp", Name: "http"}, + }, + }, + }, + Name: "svc1-ccccc", + Namespace: "testns", + Index: object.EndpointsKey("svc1", "testns"), } ep2 := object.Endpoints{ Subsets: []object.EndpointSubset{ @@ -85,20 +115,21 @@ func (APIConnReverseTest) EpIndexReverse(ip string) []*object.Endpoints { }, }, }, - Name: "svc2", + Name: "svc2-slice1", Namespace: "testns", + Index: object.EndpointsKey("svc2", "testns"), } switch ip { - case "10.0.0.100": - fallthrough case "1234:abcd::1": fallthrough case "fd00:77:30::a": fallthrough case "fd00:77:30::2:9ba6": - return []*object.Endpoints{&ep1} - case "10.0.0.99": - return []*object.Endpoints{&ep1, &ep2} + return []*object.Endpoints{&ep1s2} + case "10.0.0.100": // two EndpointSlices for a Service contain this IP (EndpointSlice skew) + return []*object.Endpoints{&ep1s1, &ep1s3} + case "10.0.0.99": // two different Services select this IP + return []*object.Endpoints{&ep1s1, &ep2} } return nil } -- cgit v1.2.3