From a29628fa2e45b355ef9439fc27af6be2c940e537 Mon Sep 17 00:00:00 2001 From: Kevin Pollet Date: Fri, 20 Dec 2024 11:26:04 +0100 Subject: [PATCH] Fix fenced server status computation Co-authored-by: Romain --- .../with_multiple_endpointaddresses.yml | 7 +- .../kubernetes/crd/kubernetes_http.go | 2 +- .../kubernetes/crd/kubernetes_test.go | 6 -- .../Ingress-with-endpoint-conditions.yml | 65 +++++++++++++++++++ pkg/provider/kubernetes/ingress/kubernetes.go | 2 +- .../kubernetes/ingress/kubernetes_test.go | 40 ++++++++++++ 6 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 pkg/provider/kubernetes/ingress/fixtures/Ingress-with-endpoint-conditions.yml diff --git a/pkg/provider/kubernetes/crd/fixtures/with_multiple_endpointaddresses.yml b/pkg/provider/kubernetes/crd/fixtures/with_multiple_endpointaddresses.yml index 6e7e8e70e..2ad7bd18b 100644 --- a/pkg/provider/kubernetes/crd/fixtures/with_multiple_endpointaddresses.yml +++ b/pkg/provider/kubernetes/crd/fixtures/with_multiple_endpointaddresses.yml @@ -31,17 +31,22 @@ endpoints: - 10.10.0.2 conditions: ready: true + serving: true + terminating: false - addresses: - 10.10.0.3 - 10.10.0.4 conditions: ready: false serving: true + terminating: true - addresses: - 10.10.0.5 - 10.10.0.6 conditions: - ready: true + ready: false + serving: false + terminating: true --- apiVersion: traefik.io/v1alpha1 diff --git a/pkg/provider/kubernetes/crd/kubernetes_http.go b/pkg/provider/kubernetes/crd/kubernetes_http.go index 5c548a8ed..4c8668931 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_http.go +++ b/pkg/provider/kubernetes/crd/kubernetes_http.go @@ -559,7 +559,7 @@ func (c configBuilder) loadServers(parentNamespace string, svc traefikv1alpha1.L addresses[address] = struct{}{} servers = append(servers, dynamic.Server{ URL: fmt.Sprintf("%s://%s", protocol, net.JoinHostPort(address, strconv.Itoa(int(port)))), - Fenced: ptr.Deref(endpoint.Conditions.Serving, false), + Fenced: ptr.Deref(endpoint.Conditions.Terminating, false) && ptr.Deref(endpoint.Conditions.Serving, false), }) } } diff --git a/pkg/provider/kubernetes/crd/kubernetes_test.go b/pkg/provider/kubernetes/crd/kubernetes_test.go index e354d3cf7..4071b18d5 100644 --- a/pkg/provider/kubernetes/crd/kubernetes_test.go +++ b/pkg/provider/kubernetes/crd/kubernetes_test.go @@ -4751,12 +4751,6 @@ func TestLoadIngressRoutes(t *testing.T) { URL: "http://10.10.0.4:80", Fenced: true, }, - { - URL: "http://10.10.0.5:80", - }, - { - URL: "http://10.10.0.6:80", - }, }, PassHostHeader: pointer(true), ResponseForwarding: &dynamic.ResponseForwarding{ diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-endpoint-conditions.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-endpoint-conditions.yml new file mode 100644 index 000000000..b8dd900bb --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-endpoint-conditions.yml @@ -0,0 +1,65 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1 +metadata: + name: "" + namespace: testing + +spec: + rules: + - http: + paths: + - path: /bar + backend: + service: + name: service1 + port: + number: 80 + pathType: Prefix + +--- +kind: Service +apiVersion: v1 +metadata: + name: service1 + namespace: testing + +spec: + ports: + - port: 80 + clusterIP: 10.0.0.1 + +--- +kind: EndpointSlice +apiVersion: discovery.k8s.io/v1 +metadata: + name: service1-abc + namespace: testing + labels: + kubernetes.io/service-name: service1 + +addressType: IPv4 +ports: + - port: 8080 + name: "" +endpoints: + - addresses: + - 10.10.0.1 + - 10.10.0.2 + conditions: + ready: true + serving: true + terminating: false + - addresses: + - 10.10.0.3 + - 10.10.0.4 + conditions: + ready: false + serving: true + terminating: true + - addresses: + - 10.10.0.5 + - 10.10.0.6 + conditions: + ready: false + serving: false + terminating: true \ No newline at end of file diff --git a/pkg/provider/kubernetes/ingress/kubernetes.go b/pkg/provider/kubernetes/ingress/kubernetes.go index e1fce4e1f..e7507572a 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes.go +++ b/pkg/provider/kubernetes/ingress/kubernetes.go @@ -601,7 +601,7 @@ func (p *Provider) loadService(client Client, namespace string, backend netv1.In addresses[address] = struct{}{} svc.LoadBalancer.Servers = append(svc.LoadBalancer.Servers, dynamic.Server{ URL: fmt.Sprintf("%s://%s", protocol, net.JoinHostPort(address, strconv.Itoa(int(port)))), - Fenced: ptr.Deref(endpoint.Conditions.Serving, false), + Fenced: ptr.Deref(endpoint.Conditions.Terminating, false) && ptr.Deref(endpoint.Conditions.Serving, false), }) } } diff --git a/pkg/provider/kubernetes/ingress/kubernetes_test.go b/pkg/provider/kubernetes/ingress/kubernetes_test.go index bbfeea77f..596d6c361 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress/kubernetes_test.go @@ -1534,6 +1534,46 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { }, }, }, + { + desc: "Ingress with endpoint conditions", + expected: &dynamic.Configuration{ + HTTP: &dynamic.HTTPConfiguration{ + Middlewares: map[string]*dynamic.Middleware{}, + Routers: map[string]*dynamic.Router{ + "testing-bar": { + Rule: "PathPrefix(`/bar`)", + Service: "testing-service1-80", + }, + }, + Services: map[string]*dynamic.Service{ + "testing-service1-80": { + LoadBalancer: &dynamic.ServersLoadBalancer{ + PassHostHeader: pointer(true), + ResponseForwarding: &dynamic.ResponseForwarding{ + FlushInterval: ptypes.Duration(100 * time.Millisecond), + }, + Servers: []dynamic.Server{ + { + URL: "http://10.10.0.1:8080", + }, + { + URL: "http://10.10.0.2:8080", + }, + { + URL: "http://10.10.0.3:8080", + Fenced: true, + }, + { + URL: "http://10.10.0.4:8080", + Fenced: true, + }, + }, + }, + }, + }, + }, + }, + }, } for _, test := range testCases {