diff --git a/integration/coredns_test.go b/integration/coredns_test.go index 61a5f644..0cfcb1ed 100644 --- a/integration/coredns_test.go +++ b/integration/coredns_test.go @@ -32,6 +32,8 @@ func (s *CoreDNSSuite) SetUpSuite(c *check.C) { {Name: "coredns/coredns:1.5.2"}, {Name: "coredns/coredns:1.6.3"}, {Name: "coredns/coredns:1.7.0"}, + {Name: "coredns/coredns:1.8.0"}, + {Name: "coredns/coredns:1.9.0"}, {Name: "giantswarm/tiny-tools:3.9"}, } diff --git a/integration/testdata/traefik-mesh/controller-acl-disabled.yaml b/integration/testdata/traefik-mesh/controller-acl-disabled.yaml index 5bddab68..8288cafa 100644 --- a/integration/testdata/traefik-mesh/controller-acl-disabled.yaml +++ b/integration/testdata/traefik-mesh/controller-acl-disabled.yaml @@ -50,6 +50,7 @@ rules: resources: - deployments verbs: + - list - get - update - apiGroups: diff --git a/integration/testdata/traefik-mesh/controller-acl-enabled.yaml b/integration/testdata/traefik-mesh/controller-acl-enabled.yaml index 8ad41d7d..f876bc69 100644 --- a/integration/testdata/traefik-mesh/controller-acl-enabled.yaml +++ b/integration/testdata/traefik-mesh/controller-acl-enabled.yaml @@ -50,6 +50,7 @@ rules: resources: - deployments verbs: + - list - get - update - apiGroups: diff --git a/pkg/dns/dns.go b/pkg/dns/dns.go index 270c5ed1..b8792570 100644 --- a/pkg/dns/dns.go +++ b/pkg/dns/dns.go @@ -89,14 +89,30 @@ func (c *Client) CheckDNSProvider(ctx context.Context) (Provider, error) { func (c *Client) coreDNSMatch(ctx context.Context) (bool, error) { c.logger.Debugf("Checking if CoreDNS is installed in namespace %q...", metav1.NamespaceSystem) - deployment, err := c.kubeClient.AppsV1().Deployments(metav1.NamespaceSystem).Get(ctx, "coredns", metav1.GetOptions{}) - if kerrors.IsNotFound(err) { - c.logger.Debug("CoreDNS deployment not found") - return false, nil + // Most Kubernetes distributions deploy CoreDNS with the following label, so look for it first. + opts := metav1.ListOptions{ + LabelSelector: "kubernetes.io/name=CoreDNS", } + deployments, err := c.kubeClient.AppsV1().Deployments(metav1.NamespaceSystem).List(ctx, opts) if err != nil { - return false, fmt.Errorf("unable to get CoreDNS deployment in namespace %q: %w", metav1.NamespaceSystem, err) + return false, fmt.Errorf("unable to list CoreDNS deployments in namespace %q: %w", metav1.NamespaceSystem, err) + } + + var deployment *appsv1.Deployment + if len(deployments.Items) == 1 { + deployment = &deployments.Items[0] + } else { + // If we did not find CoreDNS using the annotation (e.g.: with kubeadm), fall back to matching the name of the deployment. + deployment, err = c.kubeClient.AppsV1().Deployments(metav1.NamespaceSystem).Get(ctx, "coredns", metav1.GetOptions{}) + if kerrors.IsNotFound(err) { + c.logger.Debug("CoreDNS deployment not found") + return false, nil + } + + if err != nil { + return false, fmt.Errorf("unable to get CoreDNS deployment in namespace %q: %w", metav1.NamespaceSystem, err) + } } version, err := c.getCoreDNSVersion(deployment) diff --git a/pkg/dns/dns_test.go b/pkg/dns/dns_test.go index 20600752..94f53f92 100644 --- a/pkg/dns/dns_test.go +++ b/pkg/dns/dns_test.go @@ -26,6 +26,12 @@ func TestCheckDNSProvider(t *testing.T) { expProvider: CoreDNS, expErr: false, }, + { + desc: "CoreDNS supported version using label", + mockFile: "checkdnsprovider_coredns_using_label.yaml", + expProvider: CoreDNS, + expErr: false, + }, { desc: "CoreDNS supported version with suffix", mockFile: "checkdnsprovider_supported_version_suffix.yaml", diff --git a/pkg/dns/testdata/checkdnsprovider_coredns_using_label.yaml b/pkg/dns/testdata/checkdnsprovider_coredns_using_label.yaml new file mode 100644 index 00000000..bac03422 --- /dev/null +++ b/pkg/dns/testdata/checkdnsprovider_coredns_using_label.yaml @@ -0,0 +1,15 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rke2-coredns-rke2-coredns + namespace: kube-system + labels: + kubernetes.io/name: CoreDNS +spec: + template: + spec: + containers: + - name: coredns + image: image-registry.dkr.ecr.eu-west-1.amazonaws.com/eks/coredns:v1.8.4 + - name: titi + image: titi/toto:latest