From 9a931e4dc9d8043fad190505c21d4f4768842855 Mon Sep 17 00:00:00 2001 From: LandryBe Date: Thu, 28 Jan 2021 15:08:04 +0100 Subject: [PATCH] fix: add support for multiple ingress classes --- pkg/provider/kubernetes/ingress/client.go | 11 ++++--- .../kubernetes/ingress/client_mock_test.go | 16 +++++----- ...mespace-with-same-service-name_service.yml | 4 +-- .../Double-Single-Service-Ingress_service.yml | 4 +-- ...les-with-one-host-and-one-path_service.yml | 2 +- ...le-with-one-host-and-two-paths_service.yml | 2 +- ...ule-with-one-path-and-one-host_service.yml | 2 +- ...ngress-one-rule-with-two-paths_service.yml | 2 +- .../Ingress-with-IPv6-endpoints_service.yml | 2 +- ...Ingress-with-a-bad-host-syntax_service.yml | 2 +- ...Ingress-with-a-bad-path-syntax_service.yml | 2 +- ...-path-with-https-(port-==-443)_service.yml | 2 +- ...with-https-(portname-==-https)_service.yml | 2 +- ...s-(portname-starts-with-https)_service.yml | 2 +- ...-with-a-basic-rule-on-one-path_service.yml | 2 +- .../Ingress-with-annotations_service.yml | 2 +- ...th-conflicting-routers-on-host_service.yml | 2 +- ...th-conflicting-routers-on-path_service.yml | 2 +- ...h-default-traefik-ingressClass_service.yml | 2 +- ...ngressClass-without-annotation_service.yml | 2 +- ...ik-ingressClass-and-annotation_service.yml | 2 +- ...ess-with-one-host-without-path_service.yml | 2 +- ...h-one-service-without-endpoint_service.yml | 2 +- ...rvice-without-endpoints-subset_service.yml | 2 +- ...ss-with-only-a-bad-host-syntax_service.yml | 2 +- ...ss-with-only-a-bad-path-syntax_service.yml | 2 +- ...-in-backend-and-no-pod-replica_service.yml | 2 +- ...-in-backend-and-no-pod-replica_service.yml | 2 +- ...with-service-with-externalName_service.yml | 2 +- ...-different-rules-with-one-path_service.yml | 2 +- ...ervice-and-different-port-name_service.yml | 2 +- .../Ingress-with-two-services_service.yml | 4 +-- ...with-unknown-service-port-name_service.yml | 2 +- ...ress-with-unknown-service-port_service.yml | 2 +- .../Ingress-with-wildcard-host_service.yml | 2 +- ...e-in-backend-and-2-pod-replica_service.yml | 2 +- ...ssClass-and-unknown-annotation_service.yml | 2 +- ...ce-Ingress-(without-any-rules)_service.yml | 2 +- .../ingress/fixtures/TLS-support_service.yml | 4 +-- ...18-Ingress-with-empty-pathType_service.yml | 2 +- ...18-Ingress-with-exact-pathType_service.yml | 2 +- ...mplementationSpecific-pathType_service.yml | 2 +- ...ngress-with-ingress-annotation_service.yml | 2 +- .../v18-Ingress-with-ingressClass_service.yml | 2 +- ...ress-with-missing-ingressClass_service.yml | 2 +- ...-with-multiple-ingressClasses_endpoint.yml | 11 +++++++ ...s-with-multiple-ingressClasses_ingress.yml | 30 +++++++++++++++++ ...h-multiple-ingressClasses_ingressclass.yml | 14 ++++++++ ...s-with-multiple-ingressClasses_service.yml | 10 ++++++ .../v18-Ingress-with-no-pathType_service.yml | 2 +- ...8-Ingress-with-prefix-pathType_service.yml | 2 +- pkg/provider/kubernetes/ingress/kubernetes.go | 24 ++++++++------ .../kubernetes/ingress/kubernetes_test.go | 32 +++++++++++++++++++ 53 files changed, 175 insertions(+), 71 deletions(-) create mode 100644 pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_endpoint.yml create mode 100644 pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingress.yml create mode 100644 pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingressclass.yml create mode 100644 pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_service.yml diff --git a/pkg/provider/kubernetes/ingress/client.go b/pkg/provider/kubernetes/ingress/client.go index 7f3c67534..f05a85372 100644 --- a/pkg/provider/kubernetes/ingress/client.go +++ b/pkg/provider/kubernetes/ingress/client.go @@ -56,7 +56,7 @@ func (reh *resourceEventHandler) OnDelete(obj interface{}) { type Client interface { WatchAll(namespaces []string, stopCh <-chan struct{}) (<-chan interface{}, error) GetIngresses() []*networkingv1beta1.Ingress - GetIngressClass() (*networkingv1beta1.IngressClass, error) + GetIngressClasses() ([]*networkingv1beta1.IngressClass, error) GetService(namespace, name string) (*corev1.Service, bool, error) GetSecret(namespace, name string) (*corev1.Secret, bool, error) GetEndpoints(namespace, name string) (*corev1.Endpoints, bool, error) @@ -393,9 +393,9 @@ func (c *clientWrapper) GetSecret(namespace, name string) (*corev1.Secret, bool, return secret, exist, err } -func (c *clientWrapper) GetIngressClass() (*networkingv1beta1.IngressClass, error) { +func (c *clientWrapper) GetIngressClasses() ([]*networkingv1beta1.IngressClass, error) { if c.clusterFactory == nil { - return nil, errors.New("failed to find ingressClass: factory not loaded") + return nil, errors.New("cluster factory not loaded") } ingressClasses, err := c.clusterFactory.Networking().V1beta1().IngressClasses().Lister().List(labels.Everything()) @@ -403,13 +403,14 @@ func (c *clientWrapper) GetIngressClass() (*networkingv1beta1.IngressClass, erro return nil, err } + var ics []*networkingv1beta1.IngressClass for _, ic := range ingressClasses { if ic.Spec.Controller == traefikDefaultIngressClassController { - return ic, nil + ics = append(ics, ic) } } - return nil, nil + return ics, nil } // lookupNamespace returns the lookup namespace key for the given namespace. diff --git a/pkg/provider/kubernetes/ingress/client_mock_test.go b/pkg/provider/kubernetes/ingress/client_mock_test.go index 60d0851b0..9ea62d393 100644 --- a/pkg/provider/kubernetes/ingress/client_mock_test.go +++ b/pkg/provider/kubernetes/ingress/client_mock_test.go @@ -14,11 +14,11 @@ import ( var _ Client = (*clientMock)(nil) type clientMock struct { - ingresses []*networkingv1beta1.Ingress - services []*corev1.Service - secrets []*corev1.Secret - endpoints []*corev1.Endpoints - ingressClass *networkingv1beta1.IngressClass + ingresses []*networkingv1beta1.Ingress + services []*corev1.Service + secrets []*corev1.Secret + endpoints []*corev1.Endpoints + ingressClasses []*networkingv1beta1.IngressClass serverVersion *version.Version @@ -59,7 +59,7 @@ func newClientMock(serverVersion string, paths ...string) clientMock { } c.ingresses = append(c.ingresses, ing) case *networkingv1beta1.IngressClass: - c.ingressClass = o + c.ingressClasses = append(c.ingressClasses, o) default: panic(fmt.Sprintf("Unknown runtime object %+v %T", o, o)) } @@ -117,8 +117,8 @@ func (c clientMock) GetSecret(namespace, name string) (*corev1.Secret, bool, err return nil, false, nil } -func (c clientMock) GetIngressClass() (*networkingv1beta1.IngressClass, error) { - return c.ingressClass, nil +func (c clientMock) GetIngressClasses() ([]*networkingv1beta1.IngressClass, error) { + return c.ingressClasses, nil } func (c clientMock) WatchAll(namespaces []string, stopCh <-chan struct{}) (<-chan interface{}, error) { diff --git a/pkg/provider/kubernetes/ingress/fixtures/2-ingresses-in-different-namespace-with-same-service-name_service.yml b/pkg/provider/kubernetes/ingress/fixtures/2-ingresses-in-different-namespace-with-same-service-name_service.yml index cb7e60577..0ca4be86a 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/2-ingresses-in-different-namespace-with-same-service-name_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/2-ingresses-in-different-namespace-with-same-service-name_service.yml @@ -8,7 +8,7 @@ spec: ports: - name: tchouk port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 --- kind: Service @@ -21,4 +21,4 @@ spec: ports: - name: tchouk port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Double-Single-Service-Ingress_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Double-Single-Service-Ingress_service.yml index 3d6e0a368..aa1c61f36 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Double-Single-Service-Ingress_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Double-Single-Service-Ingress_service.yml @@ -7,7 +7,7 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 --- kind: Service @@ -19,4 +19,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-Two-rules-with-one-host-and-one-path_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-Two-rules-with-one-host-and-one-path_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-Two-rules-with-one-host-and-one-path_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-Two-rules-with-one-host-and-one-path_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-host-and-two-paths_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-host-and-two-paths_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-host-and-two-paths_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-host-and-two-paths_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-path-and-one-host_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-path-and-one-host_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-path-and-one-host_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-one-path-and-one-host_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-two-paths_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-two-paths_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-two-paths_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-one-rule-with-two-paths_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-IPv6-endpoints_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-IPv6-endpoints_service.yml index 9b8bfdb8b..da1189725 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-IPv6-endpoints_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-IPv6-endpoints_service.yml @@ -8,7 +8,7 @@ spec: ports: - name: http port: 8080 - clusterIp: "fc00:f853:ccd:e793::1" + clusterIP: "fc00:f853:ccd:e793::1" type: ClusterIP --- diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-host-syntax_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-host-syntax_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-host-syntax_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-host-syntax_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-path-syntax_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-path-syntax_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-path-syntax_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-bad-path-syntax_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(port-==-443)_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(port-==-443)_service.yml index f26256b02..8c4b63324 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(port-==-443)_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(port-==-443)_service.yml @@ -8,4 +8,4 @@ spec: ports: - port: 443 targetPort: 8443 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-==-https)_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-==-https)_service.yml index cf169b491..106e85b97 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-==-https)_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-==-https)_service.yml @@ -9,4 +9,4 @@ spec: - name: https protocol: "" port: 8443 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-starts-with-https)_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-starts-with-https)_service.yml index b0d0247c6..0a858f63b 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-starts-with-https)_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path-with-https-(portname-starts-with-https)_service.yml @@ -9,4 +9,4 @@ spec: - name: https-foo protocol: "" port: 8443 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path_service.yml index af223a1af..cc747fa4d 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-a-basic-rule-on-one-path_service.yml @@ -8,4 +8,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-annotations_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-annotations_service.yml index c3eaf80d3..980d463c2 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-annotations_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-annotations_service.yml @@ -17,4 +17,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-host_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-host_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-host_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-host_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-path_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-path_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-path_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-conflicting-routers-on-path_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-default-traefik-ingressClass_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-default-traefik-ingressClass_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-default-traefik-ingressClass_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-default-traefik-ingressClass_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-ingressClass-without-annotation_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-ingressClass-without-annotation_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-ingressClass-without-annotation_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-ingressClass-without-annotation_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-non-matching-provider-traefik-ingressClass-and-annotation_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-non-matching-provider-traefik-ingressClass-and-annotation_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-non-matching-provider-traefik-ingressClass-and-annotation_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-non-matching-provider-traefik-ingressClass-and-annotation_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-host-without-path_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-host-without-path_service.yml index 79d6438c6..d68c69269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-host-without-path_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-host-without-path_service.yml @@ -8,5 +8,5 @@ spec: ports: - name: http port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 type: ClusterIP diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoint_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoint_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoint_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoint_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoints-subset_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoints-subset_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoints-subset_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-one-service-without-endpoints-subset_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-host-syntax_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-host-syntax_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-host-syntax_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-host-syntax_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-path-syntax_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-path-syntax_service.yml index 62f82401a..e05f39335 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-path-syntax_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-only-a-bad-path-syntax_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-name-in-backend-and-no-pod-replica_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-name-in-backend-and-no-pod-replica_service.yml index 9b01f8cbf..141a467c1 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-name-in-backend-and-no-pod-replica_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-name-in-backend-and-no-pod-replica_service.yml @@ -10,5 +10,5 @@ spec: port: 8082 - name: tchouk port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-value-in-backend-and-no-pod-replica_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-value-in-backend-and-no-pod-replica_service.yml index 9b01f8cbf..141a467c1 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-value-in-backend-and-no-pod-replica_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-port-value-in-backend-and-no-pod-replica_service.yml @@ -10,5 +10,5 @@ spec: port: 8082 - name: tchouk port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-service-with-externalName_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-service-with-externalName_service.yml index b97a8b85f..972e4cdbc 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-service-with-externalName_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-service-with-externalName_service.yml @@ -7,7 +7,7 @@ metadata: spec: ports: - port: 8080 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 type: ExternalName externalName: traefik.wtf diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-different-rules-with-one-path_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-different-rules-with-one-path_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-different-rules-with-one-path_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-different-rules-with-one-path_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-paths-using-same-service-and-different-port-name_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-paths-using-same-service-and-different-port-name_service.yml index 9b01f8cbf..141a467c1 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-paths-using-same-service-and-different-port-name_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-paths-using-same-service-and-different-port-name_service.yml @@ -10,5 +10,5 @@ spec: port: 8082 - name: tchouk port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-services_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-services_service.yml index 904eab3b5..befb87b74 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-services_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-two-services_service.yml @@ -7,7 +7,7 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 --- kind: Service @@ -19,4 +19,4 @@ metadata: spec: ports: - port: 8082 - clusterIp: 10.1.0.1 + clusterIP: 10.1.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port-name_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port-name_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port-name_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port-name_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-unknown-service-port_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-wildcard-host_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-wildcard-host_service.yml index af223a1af..cc747fa4d 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-wildcard-host_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-wildcard-host_service.yml @@ -8,4 +8,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-with-port-name-in-backend-and-2-pod-replica_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-with-port-name-in-backend-and-2-pod-replica_service.yml index 9b01f8cbf..141a467c1 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-with-port-name-in-backend-and-2-pod-replica_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-with-with-port-name-in-backend-and-2-pod-replica_service.yml @@ -10,5 +10,5 @@ spec: port: 8082 - name: tchouk port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Ingress-without-provider-traefik-ingressClass-and-unknown-annotation_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Ingress-without-provider-traefik-ingressClass-and-unknown-annotation_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Ingress-without-provider-traefik-ingressClass-and-unknown-annotation_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Ingress-without-provider-traefik-ingressClass-and-unknown-annotation_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/Single-Service-Ingress-(without-any-rules)_service.yml b/pkg/provider/kubernetes/ingress/fixtures/Single-Service-Ingress-(without-any-rules)_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/Single-Service-Ingress-(without-any-rules)_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/Single-Service-Ingress-(without-any-rules)_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/TLS-support_service.yml b/pkg/provider/kubernetes/ingress/fixtures/TLS-support_service.yml index eeb5d5195..d204e8dbb 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/TLS-support_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/TLS-support_service.yml @@ -8,7 +8,7 @@ spec: ports: - name: http port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 type: ClusterIP --- @@ -22,5 +22,5 @@ spec: ports: - name: http port: 80 - clusterIp: 10.0.0.2 + clusterIP: 10.0.0.2 type: ClusterIP diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-empty-pathType_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-empty-pathType_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-empty-pathType_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-empty-pathType_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-exact-pathType_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-exact-pathType_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-exact-pathType_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-exact-pathType_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-implementationSpecific-pathType_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-implementationSpecific-pathType_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-implementationSpecific-pathType_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-implementationSpecific-pathType_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingress-annotation_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingress-annotation_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingress-annotation_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingress-annotation_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingressClass_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingressClass_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingressClass_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-ingressClass_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-missing-ingressClass_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-missing-ingressClass_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-missing-ingressClass_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-missing-ingressClass_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_endpoint.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_endpoint.yml new file mode 100644 index 000000000..6ed60d79c --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_endpoint.yml @@ -0,0 +1,11 @@ +kind: Endpoints +apiVersion: v1 +metadata: + name: service1 + namespace: testing + +subsets: +- addresses: + - ip: 10.10.0.1 + ports: + - port: 8080 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingress.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingress.yml new file mode 100644 index 000000000..fb4eec709 --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingress.yml @@ -0,0 +1,30 @@ +kind: Ingress +apiVersion: networking.k8s.io/v1beta1 +metadata: + name: "" + namespace: testing +spec: + ingressClassName: traefik-lb + rules: + - http: + paths: + - path: /bar + backend: + serviceName: service1 + servicePort: 80 + +--- +kind: Ingress +apiVersion: networking.k8s.io/v1beta1 +metadata: + name: "" + namespace: testing +spec: + ingressClassName: traefik-lb2 + rules: + - http: + paths: + - path: /foo + backend: + serviceName: service1 + servicePort: 80 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingressclass.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingressclass.yml new file mode 100644 index 000000000..c0dd6d23a --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_ingressclass.yml @@ -0,0 +1,14 @@ +apiVersion: networking.k8s.io/v1beta1 +kind: IngressClass +metadata: + name: traefik-lb2 +spec: + controller: traefik.io/ingress-controller + +--- +apiVersion: networking.k8s.io/v1beta1 +kind: IngressClass +metadata: + name: traefik-lb +spec: + controller: traefik.io/ingress-controller diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_service.yml new file mode 100644 index 000000000..0ec7e2269 --- /dev/null +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-multiple-ingressClasses_service.yml @@ -0,0 +1,10 @@ +kind: Service +apiVersion: v1 +metadata: + name: service1 + namespace: testing + +spec: + ports: + - port: 80 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-no-pathType_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-no-pathType_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-no-pathType_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-no-pathType_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-prefix-pathType_service.yml b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-prefix-pathType_service.yml index 7c58aeed5..0ec7e2269 100644 --- a/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-prefix-pathType_service.yml +++ b/pkg/provider/kubernetes/ingress/fixtures/v18-Ingress-with-prefix-pathType_service.yml @@ -7,4 +7,4 @@ metadata: spec: ports: - port: 80 - clusterIp: 10.0.0.1 + clusterIP: 10.0.0.1 diff --git a/pkg/provider/kubernetes/ingress/kubernetes.go b/pkg/provider/kubernetes/ingress/kubernetes.go index 28c0e2a16..4c6e82e6d 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes.go +++ b/pkg/provider/kubernetes/ingress/kubernetes.go @@ -190,15 +190,15 @@ func (p *Provider) loadConfigurationFromIngresses(ctx context.Context, client Cl return conf } - var ingressClass *networkingv1beta1.IngressClass + var ingressClasses []*networkingv1beta1.IngressClass if supportsIngressClass(serverVersion) { - ic, err := client.GetIngressClass() + ics, err := client.GetIngressClasses() if err != nil { - log.FromContext(ctx).Warnf("Failed to find an ingress class: %v", err) + log.FromContext(ctx).Warnf("Failed to list ingress classes: %v", err) } - ingressClass = ic + ingressClasses = ics } ingresses := client.GetIngresses() @@ -207,7 +207,7 @@ func (p *Provider) loadConfigurationFromIngresses(ctx context.Context, client Cl for _, ingress := range ingresses { ctx = log.With(ctx, log.Str("ingress", ingress.Name), log.Str("namespace", ingress.Namespace)) - if !p.shouldProcessIngress(p.IngressClass, ingress, ingressClass) { + if !p.shouldProcessIngress(ingress, ingressClasses) { continue } @@ -351,14 +351,20 @@ func (p *Provider) updateIngressStatus(ing *networkingv1beta1.Ingress, k8sClient return k8sClient.UpdateIngressStatus(ing, service.Status.LoadBalancer.Ingress) } -func (p *Provider) shouldProcessIngress(providerIngressClass string, ingress *networkingv1beta1.Ingress, ingressClass *networkingv1beta1.IngressClass) bool { +func (p *Provider) shouldProcessIngress(ingress *networkingv1beta1.Ingress, ingressClasses []*networkingv1beta1.IngressClass) bool { // configuration through the new kubernetes ingressClass if ingress.Spec.IngressClassName != nil { - return ingressClass != nil && ingressClass.ObjectMeta.Name == *ingress.Spec.IngressClassName + for _, ic := range ingressClasses { + if *ingress.Spec.IngressClassName == ic.ObjectMeta.Name { + return true + } + } + + return false } - return providerIngressClass == ingress.Annotations[annotationKubernetesIngressClass] || - len(providerIngressClass) == 0 && ingress.Annotations[annotationKubernetesIngressClass] == traefikDefaultIngressClass + return p.IngressClass == ingress.Annotations[annotationKubernetesIngressClass] || + len(p.IngressClass) == 0 && ingress.Annotations[annotationKubernetesIngressClass] == traefikDefaultIngressClass } func buildHostRule(host string) string { diff --git a/pkg/provider/kubernetes/ingress/kubernetes_test.go b/pkg/provider/kubernetes/ingress/kubernetes_test.go index 90c7b45c3..16b7b3a61 100644 --- a/pkg/provider/kubernetes/ingress/kubernetes_test.go +++ b/pkg/provider/kubernetes/ingress/kubernetes_test.go @@ -1061,6 +1061,38 @@ func TestLoadConfigurationFromIngresses(t *testing.T) { }, }, }, + { + desc: "v18 Ingress with multiple ingressClasses", + serverVersion: "v1.18", + expected: &dynamic.Configuration{ + TCP: &dynamic.TCPConfiguration{}, + HTTP: &dynamic.HTTPConfiguration{ + Middlewares: map[string]*dynamic.Middleware{}, + Routers: map[string]*dynamic.Router{ + "testing-foo": { + Rule: "PathPrefix(`/foo`)", + Service: "testing-service1-80", + }, + "testing-bar": { + Rule: "PathPrefix(`/bar`)", + Service: "testing-service1-80", + }, + }, + Services: map[string]*dynamic.Service{ + "testing-service1-80": { + LoadBalancer: &dynamic.ServersLoadBalancer{ + PassHostHeader: Bool(true), + Servers: []dynamic.Server{ + { + URL: "http://10.10.0.1:8080", + }, + }, + }, + }, + }, + }, + }, + }, { desc: "v18 Ingress with no pathType", serverVersion: "v1.18",