Working on applications for a cloud deployment means that one typically will hit the need for setting up a few domain names for testing purposes. Those come in handy you configure Ingress objects with the attribute host set to a domain name. And in general this is also convenient because there is no need to remember all the internal IP addresses anymore.

Overview

The general idea is to use a Helm chart for CoreDNS to deploy it into a Kubernetes cluster, the command to deploy it could look as follows:

helm upgrade --install coredns coredns \
  --repo https://coredns.github.io/helm \
  --namespace dns --create-namespace \
  --values ./values-coredns.yaml

The interesting part is then the file values-coredns.yaml which configures the Helm chart.

Configuration details

The file values-coredns.yaml would contain something like the following example:

# We want a dedicated instance and not mess with the cluster's DNS service.
isClusterService: false

# This example requires MetalLB to be installed, so that you can grab an IP
# address for the DNS server.
service:
  annotations:
    # Take an IP Address which is available to MetalLB
    metallb.universe.tf/loadBalancerIPs: "192.0.2.2"

serviceType: "LoadBalancer"

servers:
  # This is the "test" zone which is configured by the file "test.db".
  # The content of the file is specified below.
  - zones:
      - zone: test
    port: 53
    plugins:
      - name: log
      - name: errors
      - name: file
        parameters: /etc/coredns/test.db

  # This is the default configuration, keeping it means that the DNS server
  # will also resolve all other domain names by forwarding to another DNS
  # server.
  - zones:
      - zone: .
    port: 53
    plugins:
      - name: errors
      - name: health
        configBlock: |-
          lameduck 5s
      - name: ready
      - name: kubernetes
        parameters: cluster.local in-addr.arpa ip6.arpa
        configBlock: |-
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
      - name: prometheus
        parameters: 0.0.0.0:9153
      - name: forward
        parameters: . /etc/resolv.conf
      - name: cache
        parameters: 30
      - name: loop
      - name: reload
      - name: loadbalance

# This allows to provide the zone configuration as files to the DNS server.
zoneFiles:
  - filename: test.db
    domain: test
    contents: |
      test. IN SOA dns.test. admin.dns.test. 2023081802 600 60 360000 600

      dns IN A 192.0.2.2

      local-cluster IN TXT "Local cluster"
      local-cluster IN A 127.0.0.1
      *.local-cluster IN A 127.0.0.1

      k8s IN TXT "Default ingress of test-k8s"
      k8s IN A 192.0.2.4
      *.k8s IN A 192.0.2.4

Conclusion

With the configuration above you would have a nameserver which would respond to queries in the test top level domain. You could verify this by using a tool like dig:

dig @192.0.2.2 example.k8s.test
dig @192.0.2.2 example.local-cluster.test

Comments

comments powered by Disqus