Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Made the router skip health checks when there is one endpoint #16643

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 8 additions & 1 deletion pkg/router/template/plugin.go
Expand Up @@ -265,9 +265,10 @@ func createRouterEndpoints(endpoints *kapi.Endpoints, excludeUDP bool, lookupSvc
wasIdled = true
}

// Take a reasonable guess at the number of endpoints to avoid reallocating the out array when we append
out := make([]Endpoint, 0, len(endpoints.Subsets)*4)

// TODO: review me for sanity
// Now build the actual endpoints we pass to the template
for _, s := range subsets {
for _, p := range s.Ports {
if excludeUDP && p.Protocol == kapi.ProtocolUDP {
Expand Down Expand Up @@ -306,5 +307,11 @@ func createRouterEndpoints(endpoints *kapi.Endpoints, excludeUDP bool, lookupSvc
}
}

// We want to disable endpoint checks if there is only one endpoint
// We skip the case where it is idled, since we set NoHealthCheck above
if wasIdled == false && len(out) == 1 {
out[0].NoHealthCheck = true
}

return out
}
153 changes: 144 additions & 9 deletions pkg/router/template/plugin_test.go
Expand Up @@ -271,15 +271,16 @@ func TestHandleEndpoints(t *testing.T) {
Name: "foo/test", //service name from kapi.endpoints object
EndpointTable: []Endpoint{
{
ID: "ept:test:1.1.1.1:345",
IP: "1.1.1.1",
Port: "345",
ID: "ept:test:1.1.1.1:345",
IP: "1.1.1.1",
Port: "345",
NoHealthCheck: true,
},
},
},
},
{
name: "Endpoint mod",
name: "Endpoint mod (one ep, one address)",
eventType: watch.Modified,
endpoints: &kapi.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Expand All @@ -295,9 +296,143 @@ func TestHandleEndpoints(t *testing.T) {
Name: "foo/test",
EndpointTable: []Endpoint{
{
ID: "pod:pod-1:test:2.2.2.2:8080",
IP: "2.2.2.2",
Port: "8080",
ID: "pod:pod-1:test:2.2.2.2:8080",
IP: "2.2.2.2",
Port: "8080",
NoHealthCheck: true,
},
},
},
},
{
name: "Endpoint mod (second ep, one address each)",
eventType: watch.Modified,
endpoints: &kapi.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Namespace: "foo",
Name: "test",
},
Subsets: []kapi.EndpointSubset{
{
Addresses: []kapi.EndpointAddress{{IP: "2.2.2.2", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-1"}}},
Ports: []kapi.EndpointPort{{Port: 8080}},
},
{
Addresses: []kapi.EndpointAddress{{IP: "3.3.3.3", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-2"}}},
Ports: []kapi.EndpointPort{{Port: 8081}},
},
},
},
expectedServiceUnit: &ServiceUnit{
Name: "foo/test",
EndpointTable: []Endpoint{
{
ID: "pod:pod-1:test:2.2.2.2:8080",
IP: "2.2.2.2",
Port: "8080",
NoHealthCheck: false,
},
{
ID: "pod:pod-2:test:3.3.3.3:8081",
IP: "3.3.3.3",
Port: "8081",
NoHealthCheck: false,
},
},
},
},
{
name: "Endpoint mod (one ep, two addresses)",
eventType: watch.Modified,
endpoints: &kapi.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Namespace: "foo",
Name: "test",
},
Subsets: []kapi.EndpointSubset{
{
Addresses: []kapi.EndpointAddress{
{IP: "3.3.3.3", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-2"}},
{IP: "4.4.4.4", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-3"}},
},
Ports: []kapi.EndpointPort{{Port: 8080}},
},
},
},
expectedServiceUnit: &ServiceUnit{
Name: "foo/test",
EndpointTable: []Endpoint{
{
ID: "pod:pod-2:test:3.3.3.3:8080",
IP: "3.3.3.3",
Port: "8080",
NoHealthCheck: false,
},
{
ID: "pod:pod-3:test:4.4.4.4:8080",
IP: "4.4.4.4",
Port: "8080",
NoHealthCheck: false,
},
},
},
},
{
name: "Endpoint mod (one ep, two ports)",
eventType: watch.Modified,
endpoints: &kapi.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Namespace: "foo",
Name: "test",
},
Subsets: []kapi.EndpointSubset{
{
Addresses: []kapi.EndpointAddress{
{IP: "3.3.3.3", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-2"}},
},
Ports: []kapi.EndpointPort{{Port: 8080}, {Port: 8081}},
},
},
},
expectedServiceUnit: &ServiceUnit{
Name: "foo/test",
EndpointTable: []Endpoint{
{
ID: "pod:pod-2:test:3.3.3.3:8080",
IP: "3.3.3.3",
Port: "8080",
NoHealthCheck: false,
},
{
ID: "pod:pod-2:test:3.3.3.3:8081",
IP: "3.3.3.3",
Port: "8081",
NoHealthCheck: false,
},
},
},
},
{
name: "Endpoint mod (back to one ep)",
eventType: watch.Modified,
endpoints: &kapi.Endpoints{
ObjectMeta: metav1.ObjectMeta{
Namespace: "foo",
Name: "test",
},
Subsets: []kapi.EndpointSubset{{
Addresses: []kapi.EndpointAddress{{IP: "3.3.3.3", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-1"}}},
Ports: []kapi.EndpointPort{{Port: 8080}},
}},
},
expectedServiceUnit: &ServiceUnit{
Name: "foo/test",
EndpointTable: []Endpoint{
{
ID: "pod:pod-1:test:3.3.3.3:8080",
IP: "3.3.3.3",
Port: "8080",
NoHealthCheck: true,
},
},
},
Expand All @@ -311,8 +446,8 @@ func TestHandleEndpoints(t *testing.T) {
Name: "test",
},
Subsets: []kapi.EndpointSubset{{
Addresses: []kapi.EndpointAddress{{IP: "3.3.3.3"}},
Ports: []kapi.EndpointPort{{Port: 0}},
Addresses: []kapi.EndpointAddress{{IP: "3.3.3.3", TargetRef: &kapi.ObjectReference{Kind: "Pod", Name: "pod-1"}}},
Ports: []kapi.EndpointPort{{Port: 8080}},
}},
},
expectedServiceUnit: &ServiceUnit{
Expand Down