From 5814ba532246fdc9c3d1629af2da967944543b0b Mon Sep 17 00:00:00 2001 From: Martin Vizvary <44974124+martinvizvary@users.noreply.github.com> Date: Thu, 15 Apr 2021 18:16:04 +0200 Subject: [PATCH] Kubernetes ingress provider to search via all endpoints --- ...-port-invalid-for-one-service_endpoint.yml | 21 +++++++++++++++ ...h-port-invalid-for-one-service_ingress.yml | 15 +++++++++++ ...h-port-invalid-for-one-service_service.yml | 20 ++++++++++++++ pkg/provider/kubernetes/ingress/kubernetes.go | 6 ++++- .../kubernetes/ingress/kubernetes_test.go | 27 +++++++++++++++++++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_endpoint.yml create mode 100644 pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_ingress.yml create mode 100644 pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_service.yml diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_endpoint.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_endpoint.yml new file mode 100644 index 000000000..dfe20f52d --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_endpoint.yml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Endpoints +metadata: + name: service1 + namespace: testing +subsets: + - addresses: + - ip: 10.0.0.1 + nodeName: admin.whoami.service1 + ports: + - name: http-admin + port: 8079 + protocol: TCP + - addresses: + - ip: 10.0.0.1 + nodeName: whoami.service1 +# targetRef: + ports: + - name: http + port: 8080 + protocol: TCP diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_ingress.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_ingress.yml new file mode 100644 index 000000000..12c508feb --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_ingress.yml @@ -0,0 +1,15 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1beta1 +metadata: + name: "" + namespace: testing + +spec: + rules: + - host: traefik.port + http: + paths: + - path: /port + backend: + serviceName: service1 + servicePort: 8080 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_service.yml new file mode 100644 index 000000000..d83acc42f --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-invalid-for-one-service_service.yml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: service1 + namespace: testing + +spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: http-api + - name: http-admin + port: 8079 + protocol: TCP + targetPort: http-admin + selector: + app: foo + sessionAffinity: None + type: ClusterIP diff --git a/pkg/provider/kubernetes/ingress/kubernetes.go b/pkg/provider/kubernetes/ingress/kubernetes.go index 4c6e82e6d..d6b2ed225 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes.go +++ b/pkg/provider/kubernetes/ingress/kubernetes.go @@ -539,7 +539,7 @@ func loadService(client Client, namespace string, backend networkingv1beta1.Ingr } if port == 0 { - return nil, errors.New("cannot define a port") + continue } protocol := getProtocol(portSpec, portName, svcConfig) @@ -553,6 +553,10 @@ func loadService(client Client, namespace string, backend networkingv1beta1.Ingr } } + if len(svc.LoadBalancer.Servers) == 0 { + return nil, errors.New("no valid subset found") + } + return svc, nil } diff --git a/pkg/provider/kubernetes/ingress/kubernetes_test.go b/pkg/provider/kubernetes/ingress/kubernetes_test.go index 16b7b3a61..fe8b15230 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress/kubernetes_test.go @@ -729,6 +729,33 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { }, }, }, + { + desc: "Ingress with port invalid for one service", + expected: &dynamic.Configuration{ + TCP: &dynamic.TCPConfiguration{}, + HTTP: &dynamic.HTTPConfiguration{ + Middlewares: map[string]*dynamic.Middleware{}, + Routers: map[string]*dynamic.Router{ + "testing-traefik-port-port": { + Rule: "Host(`traefik.port`) && PathPrefix(`/port`)", + Service: "testing-service1-8080", + }, + }, + Services: map[string]*dynamic.Service{ + "testing-service1-8080": { + LoadBalancer: &dynamic.ServersLoadBalancer{ + PassHostHeader: Bool(true), + Servers: []dynamic.Server{ + { + URL: "http://10.0.0.1:8080", + }, + }, + }, + }, + }, + }, + }, + }, { desc: "Ingress with IPv6 endpoints", expected: &dynamic.Configuration{